Gigabyte Giant Ответов: 1

Ява Для Поиска Дубликатов Файлов


Всем привет,

Поэтому кто-то предложил мне сделать приложение, которое будет перечислять дубликаты файлов в текущем рабочем каталоге.

В конце концов он даст вам выбор, что вы можете сделать с дубликатами файлов, но сейчас он просто перечислит их.

Я использую Java (по выбору), и я написал около 50 строк кода для этого. Это заняло у меня около 20 минут, и я провел тест внутри eclipse и получил исключение InputMismatchException. Однако я правильно понимаю, когда приложение запускается. Поэтому я пошел дальше и скомпилировал проект, чтобы протестировать его в командной строке, и прямо при запуске (используя java-jar Duplicates.jar) там написано:

Нет главного атрибута манифеста, в Duplicates.jar

Теперь я думаю, что это было что-то, что пошло не так, когда я компилировал, я просто хочу выяснить, почему или как я получаю исключение InputMismatchException. Он говорит, что это происходит на линиях 17 и 46. Ниже приведен мой код, у меня есть комментарии к строкам 17 и 46.

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class DuplicateFileRemover {
	public static boolean CompareFiles(File x, File y) { 
		try {
			Scanner xs = new Scanner(x);
			Scanner ys = new Scanner(y);
			boolean result = true;
			while (result == true) {
				if (xs.nextByte() != ys.nextByte()) { // Line 17
					result = false;	
				}
				return result;	
			}
		} catch (FileNotFoundException e) {
			System.out.println(e.getMessage());	
		}
		return false;	
	}
	public static void main(String[] args) {
		File dir = new File(".");
		File[] fileList = dir.listFiles();
		for (int x = 0; x < fileList.length; x++) {
			for (int y = x+1; y < fileList.length; y++) {
				if (CompareFiles(fileList[x], fileList[y])) { // Line 46
					System.out.println(fileList[x]);
				}	
			}
		}
		
	}
	
}


Может ли кто-нибудь увидеть проблему с моим кодом? Поскольку я имею дело с файлами, я знал, что мне, вероятно, нужно поймать возможное исключение FileNotFound.

Опять же, как я уже говорил, пользовательский ввод не требуется, приложение работает исключительно на получение файлов в текущем рабочем каталоге.


Пожалуйста помочь.

Richard MacCutchan

Ваша процедура сравнения проверяет только первый байт любых файлов, поэтому все ваши результаты, скорее всего, будут неверными. Вам также не нужно конвертировать его в jar-файл, просто запустите класс, созданный компилятором.

Gigabyte Giant

Знаете ли вы, почему в строках 17 и 46 я получаю исключение InputMismatchException?

1 Ответов

Рейтинг:
9

Richard MacCutchan

Ваша проблема связана с Scanner класс пытается интерпретировать токены из входного файла и преобразовать их в байты. Вам нужен базовый потоковый считыватель, который позволит вам считывать отдельные байты из файла.

Попробовать это:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileInputStream;


public class Test {
 
    /**
    * @param args
    */
    public static void main(String[] args) {
        File dir = new File(".");
        File[] fileList = dir.listFiles();
        for (int x = 0; x < fileList.length; x++) {
            for (int y = x+1; y < fileList.length; y++) {
                if (fileList[x].length() == fileList[y].length()) {
                    if (CompareFiles(fileList[x], fileList[y])) {
                        System.out.println(fileList[y]);
                    }
                }
            }
        }
    }

    public static boolean CompareFiles(File x, File y) {
        try {
            FileInputStream xs = new FileInputStream(x);
            FileInputStream ys = new FileInputStream(y);
            System.out.println("Compare: " + x + " vs " + y);
            boolean result = true;
            while (result == true) {
                int xb = xs.read();
                int yb = ys.read();
                if (xs.read() != ys.read()) {
                    result = false;
                    break;
                }
                if (xb == -1)
                    break;
            }
            return result;	
            } catch (FileNotFoundException e) {
                return false;
            } catch (Exception e) {
                System.out.println(e.getMessage());	
            }
        return false;	
    }
        
}


Gigabyte Giant

Спасибо, это сработало. Теперь, исходя из этого, я должен быть в состоянии изменить это так, как мне это нужно.

Я действительно ценю это, спасибо, добрый сэр.

Richard MacCutchan

Рад помочь, удачи в ваших дальнейших усилиях.