2016-11-10 79 views
1

我想開發一個基本的Java程序來比較兩個巨大的文本文件並打印不匹配的記錄.i.e。類似於SQL中的minus功能。但是我沒有得到預期的結果,因爲即使兩個文件都是相同的,所有記錄都會打印出來。同時建議我這種方法在比較兩個巨大的文本文件時是否有效。Java - 比較兩個巨大的文本文件

import java.io.*; 

public class CompareTwoFiles { 
    static int count1 = 0 ; 
    static int count2 = 0 ; 

    static String arrayLines1[] = new String[countLines("\\Files_Comparison\\File1.txt")]; 
    static String arrayLines2[] = new String[countLines("\\Files_Comparison\\File2.txt")]; 

    public static void main(String args[]){ 
     findDifference("\\Files_Comparison\\File1.txt","\\Files_Comparison\\File2.txt"); 
     displayRecords(); 
    } 

    public static int countLines(String File){ 

     int lineCount = 0; 
     try { 
      BufferedReader br = new BufferedReader(new FileReader(File)); 
      while ((br.readLine()) != null) { 
       lineCount++; 
      } 

     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
      return lineCount; 
    } 

    public static void findDifference(String File1, String File2){ 
     String contents1 = null; 
     String contents2 = null; 
     try 
     { 
      FileReader file1 = new FileReader(File1); 
      FileReader file2 = new FileReader(File2); 
      BufferedReader buf1 = new BufferedReader(file1); 
      BufferedReader buf2 = new BufferedReader(file2); 

      while ((contents1 = buf1.readLine()) != null) 
      { 
       arrayLines1[count1] = contents1 ; 
       count1++; 
      } 

      while ((contents2 = buf2.readLine()) != null) 
      { 
       arrayLines2[count2] = contents2 ; 
       count2++; 
      } 
     }catch (Exception e){ 
      e.printStackTrace(); 
     } 
} 



    public static void displayRecords() {  
     for (int i = 0 ; i < arrayLines1.length ; i++) {  
      String a = arrayLines1[i]; 
      for (int j = 0; j < arrayLines2.length; j++){ 
       String b = arrayLines2[j]; 
       boolean result = a.contains(b); 
        if(result == false){ 
         System.out.println(a); 
        } 
      } 

     } 
    } 
} 
+0

檢查'了'和值'B' –

+0

爲什麼被標記問題與'外的memory'? –

+0

我已經從這個問題中刪除了內存不足的標記 – jay

回答

0

基於你的解釋,你不需要嵌入循環

考慮

public static void displayRecords() { 

    for (int i = 0 ; i < arrayLines1.length && i < arrayLines2.length; i++) 
    {  
     String a = arrayLines1[i]; 
     String b = arrayLines2[i]; 

     if(!a.contains(b){ 
       System.out.println(a); 
     } 
    } 
-1

爲了提高性能,您應該嘗試匹配文件的大小。如果大小(以字節爲單位)完全相同,則可能不需要進行比較。

+0

兩個相同大小的文件可能沒有相同的內容。 – bane19

+0

我實際上期待這種反應:)是的,你可以使用哈希比較http://stackoverflow.com/questions/15441315/java-and-hash-algorithm-to-compare-files – zawhtut

+0

你可以添加在你的答案中回答鏈接。反正,很酷。謝謝:) – bane19