2017-09-01 273 views
0

7年前,這個問題已經被問過了,但我不能再添加答案了,因爲它是[closed]。如何比較兩個文本文件的內容並返回「相同內容」或「不同內容」?

因此,這不是一個問題 - 這是一個解決方案建議: 由於Java 1.7這可能是一個內襯:

public class FilesComparator { 
    public static boolean filesEquals(Path f1, Path f2) throws IOException { 
     return Arrays.equals(Files.readAllBytes(f1), Files.readAllBytes(f2)); 
    } 
} 
+1

即使第一個字節不同,它也會讀取所有字節的BOTH文件。短但不起作用 –

+2

如果你想添加一個答案,你應該發佈一個問題,然後發佈解決方案作爲答案。 – Sweeper

+4

我投票結束這個問題作爲題外話,因爲這是由OP本身陳述的另一個問題的答案。 – SpaceTrucker

回答

0

這個怎麼樣?

import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream; 

public class FilesComparator { 

    public static boolean isEquals(File f1, File f2) throws IOException { 
     if (f1.length() != f2.length()) { 
      return false; 
     } 

     try (InputStream f1Is = new BufferedInputStream(new FileInputStream(f1)); // or just new FileInputStream(f1) if you don't want to cache some bytes and want to make a native call for each byte 
      InputStream f2Is = new BufferedInputStream(new FileInputStream(f2))) { 

      int f1CurrentByte; 
      int f2CurrentByte; 
      while ((f1CurrentByte = f1Is.read()) != -1 && (f2CurrentByte = f2Is.read()) != -1) { 
       if (f1CurrentByte != f2CurrentByte) { 
        return false; 
       } 
      } 

      return true; 
     } 
    } 

} 
+0

這可能是現有問題中的一個答案(未鏈接...)每字節比較一個字節,簡單高效 – AxelH

+0

從FileInputStream中進行非緩衝的單字節讀取從來就不是一個好主意。至少使用BufferedInputStream和合理的字節數組來讀取數據塊,否則性能會很糟糕。數據緩衝區的相等性可以像Arrays.equals一樣在原始的「問題」中檢查。 – Lothar

+0

使用'BufferedInputStream'應該足夠了,不需要分塊讀取。 'BufferedInputStream'內部已經在塊中讀取。 –