2010-10-31 17 views
5

Tôi đang mã hóa một lớp so sánh các tệp của hai thư mục thông qua so sánh các mảng Byte của mỗi tệp. Tuy nhiên, tôi không nhận được kết quả mong đợi; các tệp giống nhau không được giải quyết dưới dạng tệp giống hệt nhau.So sánh tập tin qua các vấn đề về byte Byte

Vấn đề đầu tiên:

Matching các tập tin byte [] với equals() giải quyết false với phù hợp với file (Kiểm tra chỉ với một tập tin như để phá vỡ vấn đề chỉ số lệch chi tiết càng tốt; séc vẫn quyết tâm sai.) .

vấn đề thứ hai:

Khi sử dụng containsAll Vector() để kiểm tra xem cả hai Vectors của Byte [] trận đấu (Một Vector mỗi thư mục với Byte [] cho mỗi file) kết quả kiểm tra này trong sai ngay cả với các thư mục giống hệt nhau (Séc này đã bị xóa khỏi mã bên dưới.). Vì vậy, có một vấn đề với cách tôi sắp xếp hai vectơ? (Tôi đã kiểm tra này bằng cách sử dụng hai thư mục với các tập tin phù hợp trong cùng một thứ tự được nạp vào phù hợp với phân, điều này vẫn dẫn đến một Vector không phù hợp).

Thứ ba vấn đề:

Khi có thư mục con trong thư mục được kiểm tra một tập tin không tìm thấy ngoại lệ được ném nêu truy cập mà bị từ chối. Tại sao chuyện này đang xảy ra? Làm thế nào tôi có thể phá vỡ điều này? Tôi không muốn kiểm tra các tập tin chứa trong các thư mục con, nhưng tôi đang thiết kế mã để người dùng cuối không cần lo lắng về các thư mục con của các thư mục được so sánh. Điều này chỉ xảy ra khi có các thư mục con, nó hoạt động tốt khi không có thư mục con nào trong các thư mục đang được kiểm tra.

Ví dụ Ngoại lệ:

Byte reading error! 
Byte reading error! 
java.io.FileNotFoundException: C:\Dir1\Dir2\Dir3\Dir4\SubDir (Access is denied) 
    at java.io.FileInputStream.open(Native Method) 
    at java.io.FileInputStream.<init>(Unknown Source) 
    at tools.filesystem.filecomparison.FileComparator.getBytes(FileComparator.java:166) 
    at tools.filesystem.filecomparison.FileComparator.main(FileComparator.java:102) 
java.io.FileNotFoundException: C:\Dir1\Dir2\Dir3\Dir4\SubDir Files (Access is denied) 
    at java.io.FileInputStream.open(Native Method) 
    at java.io.FileInputStream.<init>(Unknown Source) 
    at tools.filesystem.filecomparison.FileComparator.getBytes(FileComparator.java:166) 
    at tools.filesystem.filecomparison.FileComparator.main(FileComparator.java:111) 

Đây là mã:

package tools.filesystem.filecomparison; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.util.Scanner; 
import java.util.Vector; 

public class FileComparator 
{ 
    public static void main(String[] args) 
    { 
     String workingDir1 = ""; 
     String workingDir2 = ""; 

     File[] fileArr1 = null; 
     File[] fileArr2 = null; 

     Vector<File> fileVec1 = new Vector<File>(); 
     Vector<File> fileVec2 = new Vector<File>(); 

     Scanner console = new Scanner(System.in); 
     while (true) 
     { 
      System.out.println("Enter working directory one . . . ."); 
      workingDir1 = console.nextLine(); 
      workingDir1.replace("\\", "\\\\"); 

      System.out.println("Enter working directory two . . . ."); 
      workingDir2 = console.nextLine(); 
      workingDir2.replace("\\", "\\\\"); 

      File folder1 = new File(workingDir1); 
      File[] listOfFiles1 = folder1.listFiles(); 

      File folder2 = new File(workingDir1); 
      File[] listOfFiles2 = folder2.listFiles(); 

      fileArr1 = listOfFiles1; 
      fileArr2 = listOfFiles2; 

      System.out.println("\nWorking Directory 1 Files\n"); 
      for (int i = 0; i < listOfFiles1.length; i++) 
      { 
       if (listOfFiles1[i].isFile()) 
       { 
        System.out.println(" " + listOfFiles1[i].getName()); 
       } 
/*    else if (listOfFiles1[i].isDirectory()) 
       { 
        System.out.println("Directory " + listOfFiles1[i].getName()); 
       }*/ 
      } 

      System.out.println("\nWorking Directory 2 Files\n"); 
      for (int i = 0; i < listOfFiles2.length; i++) 
      { 
       if (listOfFiles2[i].isFile()) 
       { 
        System.out.println(" " + listOfFiles2[i].getName()); 
       } 
/*    else if (listOfFiles2[i].isDirectory()) 
       { 
        System.out.println("Directory " + listOfFiles2[i].getName()); 
       }*/ 
      } 

      for (File fle : fileArr1) 
      { 
       fileVec1.add(fle); 
      } 

      for (File fle : fileArr2) 
      { 
       fileVec2.add(fle); 
      } 

      if (fileVec1.containsAll(fileVec2)) 
       break; 
      else 
      { 
       System.out.println("Directories do not contain the same files!\nContinue anyways? y/n?"); 
       if (console.nextLine().equalsIgnoreCase("y")) 
        break; 
       else if (console.nextLine().equalsIgnoreCase("n")) 
        continue; 
      } 
     } 

     Vector<Vector<File>> alignedVectors = align(fileVec1, fileVec2); 

     fileVec1 = alignedVectors.elementAt(0); 
     fileVec2 = alignedVectors.elementAt(1); 

     Vector<byte[]> fileByteVect1 = new Vector<byte[]>(); 
     Vector<byte[]> fileByteVect2 = new Vector<byte[]>(); 
     try 
     { 
      fileByteVect1 = getBytes(fileVec1); 
     } 
     catch (IOException e) 
     { 
      System.out.println("Byte reading error!"); 
      e.printStackTrace(); 
     } 
     try 
     { 
      fileByteVect2 = getBytes(fileVec2); 
     } 
     catch (IOException e) 
     { 
      System.out.println("Byte reading error!"); 
      e.printStackTrace(); 
     } 

     boolean[] check = new boolean[fileByteVect1.capacity()]; 

     int i1 = 0; 
     //debug 
     for (byte[] e : fileByteVect1) 
     { 
      System.out.println("Vector 1 count " + i1); 
      System.out.println(e.toString()); 
      for (byte b : e) 
      { 
       System.out.print(b + " "); 
      } 
      i1++; 
     } 

     int i2 = 0; 
     //debug 
     for (byte[] e : fileByteVect2) 
     { 
      System.out.println("Vector 2 count " + i2); 
      System.out.println(e.toString()); 
      for (byte b : e) 
      { 
       System.out.print(b + " "); 
      } 
      i2++; 
     } 

     if (fileByteVect1.size() == fileByteVect2.size()) 
     { 
      System.out.println(fileByteVect1.size()); 
      for (int i = 0; i < fileByteVect1.size(); i++) 
      { 
       if (fileByteVect1.elementAt(i).equals(fileByteVect2.elementAt(i))) 
       { 
        check[i] = true; 
        System.out.println("File at index " + i + " are identical"); 
       } 
       else 
       { 
        check[i] = false; 
        System.out.println("File at index " + i + " are not identical"); 
       } 
      } 
     } 
     else 
      System.out.println("Files do not match!"); 
    } 

    public static Vector<Vector<File>> align(Vector<File> fileVect1, Vector<File> fileVect2) 
    { 
     Vector<Vector<File>> mainBuffer = new Vector<Vector<File>>(); 
     Vector<File> bufferFileVect = new Vector<File>(); 
     for (File fle1 : fileVect1) 
     { 
      for (File fle2 : fileVect2) 
      { 
       if (fle1.getName().equals(fle2.getName())) 
        bufferFileVect.add(fle2); 
      } 
     } 

     mainBuffer.add(fileVect1); 
     mainBuffer.add(bufferFileVect); 

     return mainBuffer; 
    } 

    public static Vector<byte[]> getBytes(Vector<File> fileVector) throws IOException 
    { 
     Vector<byte[]> outVector = new Vector<byte[]>(); 

     for (File file : fileVector) 
     { 
      InputStream is = new FileInputStream(file); 

      // Get the size of the file 
      long length = file.length(); 

      if (length > Integer.MAX_VALUE) 
      { 
       System.out.println("File is too large!"); 
      } 

      // Create the byte array to hold the data 
      byte[] bytes = new byte[(int) length]; 

      // Read in the bytes 
      int offset = 0; 
      int numRead = 0; 
      while (offset < bytes.length && (numRead = is.read(bytes, offset, bytes.length - offset)) >= 0) 
      { 
       offset += numRead; 
      } 

      // Ensure all the bytes have been read in 
      if (offset < bytes.length) 
      { 
       throw new IOException("Could not completely read file " + file.getName()); 
      } 

      // Close the input stream and return bytes 
      outVector.add(bytes); 
      is.close(); 
     } 
     return outVector; 
    } 
} 
+1

Thư mục tệp2 = new Tệp (workingDir1); - đó là một lỗi đánh máy? – EboMike

+0

Vâng, đó là lỗi đánh máy được cho là "File folder2 = new File (workingDir2);" Tôi sẽ kiểm tra xem nó có hoạt động không. Cảm ơn thông báo. – TheWolf

Trả lời

5

Chức năng equals không làm một so sánh sâu, chứ không phải cho một byte[] bạn đang so sánh địa chỉ. Thay vào đó, bạn nên sử dụng

Arrays.equals(fileByteVect1.elementAt(i), fileByteVect2.elementAt(i)) 

để thực hiện so sánh sâu của mảng byte.

Thêm chi tiết về Arrays.equals.

Đối với câu hỏi thứ ba của bạn, bạn không thực sự lọc chỉ các tệp. Khi bạn lặp qua để in ra tên tập tin, bạn nên xây dựng Vector lưu trữ các tập tin:

for (File fle : fileArr1) { 
    if (fle.isFile()) { 
     fileVec1.add(fle); 
     System.out.println(" " + fle.getName()); 
    } 
} 

Bạn sẽ, tất nhiên, phải làm điều này cho fileArr2fileVec2 là tốt.

+0

Cảm ơn, nó hoạt động ngay bây giờ. Bạn có biết giải pháp cho vấn đề thứ ba không? – TheWolf

+0

Có, nó hoạt động tốt khi không có thư mục con trong các thư mục được so sánh. – TheWolf

+0

@Vapen: bạn không lọc ra các thư mục, lọc chúng ra giống như cách bạn in (xem các chỉnh sửa cho câu trả lời của tôi). –

4

Đơn giản. Phương thức equals(Object) trên một mảng được kế thừa từ Object và do đó tương đương với toán tử ==; tức là nó chỉ là một so sánh tham chiếu.

Điều này được chỉ định trong JLS 6.4.5.

Nếu bạn muốn so sánh mảng theo giá trị, hãy sử dụng phương thức java.util.Arrays.equals(array1, array2). Có quá tải cho mảng của mỗi loại nguyên thủy và mảng của Object.

(Lưu ý rằng nó là ngữ nghĩa của việc thực hiện từng loại yếu tố của equals phương pháp xác định nếu Arrays.equals(Object[], Object[]) là một "sâu" hay "nông cạn" so sánh.)

THEO UP

Tôi nghi ngờ rằng vấn đề thứ ba xảy ra vì ứng dụng của bạn đang cố gắng mở thư mục con dưới dạng tệp. Điều đó sẽ không hoạt động. Thay vào đó, bạn cần phải:

  1. Sử dụng File.isFile()File.isDirectory() để xác định xem bạn nên đọc các mục thư mục như file hoặc dirctories (hoặc không gì cả).
  2. Đối với một thư mục, bạn nên đệ quy sử dụng File.listFiles() hoặc tương tự để lặp qua các nội dung thư mục con.
+0

Cảm ơn, nó hoạt động ngay bây giờ. Các bạn có biết giải pháp cho vấn đề thứ ba không? – TheWolf