2016-11-10 45 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