2011-10-29 83 views
2

我是Java的初学者。与数组结合的两个文件

我想读两个文件,然后得到他们的联合。我应该使用大小为100的阵列(只允许一个阵列)

首先,我从file1中读取所有记录,并将它们写入输出file3。为此,我一次读取100条记录,并使用迭代将它们写入file3

之后,就像file1一样,这次我读取第二个文件作为100条记录,并将它们写入数组memory[]。然后我找到常用记录,如果我从file2中读取的记录不在file1中,则将其写入输出文件。我这样做直到reader2.readLine()得到null,我在每次迭代中重新打开file1

这是我迄今为止所做的工作,几乎完成,但它给NullPointerException。任何帮助,将不胜感激。

编辑:好的,现在它没有给出任何异常,但它没有找到不同的记录,也不能写入它们。我猜最后的循环和布尔运算符不起作用,为什么?请帮忙...

import java.io.*; 

public class FileUnion 
{ 
private static long startTime, endTime; 

public static void main(String[] args) throws IOException 
{ 
    System.out.println("PROCESSING..."); 
    reset(); 
    startTimer(); 

    String[] memory = new String[100]; 
    int memorySize = memory.length; 

    File file1 = new File("stdlist1.txt"); 
    BufferedReader reader1 = new BufferedReader(new FileReader(file1)); 

    File file3 = new File("union.txt"); 
    BufferedWriter writer = new BufferedWriter(new FileWriter(file3)); 

    int numberOfLinesFile1 = 0; 
    String line1 = null; 
    String line11 = null; 


    while((line1 = reader1.readLine()) != null) 
    { 
     for (int i = 0; i < memorySize;) 
     { 
      memory[i] = line1; 
      i++; 

      if(i < memorySize) 
      { 
       line1 = reader1.readLine(); 
      } 
     } 

     for (int i = 0; i < memorySize; i++) 
     { 
      writer.write(memory[i]); 
      writer.newLine(); 
      numberOfLinesFile1++; 
     } 
    } 

    reader1.close(); 

    File file2 = new File("stdlist2.txt"); 
    BufferedReader reader2 = new BufferedReader(new FileReader(file2)); 

    String line2 = null; 
    while((line2 = reader2.readLine()) != null) 
    { 
     for (int i = 0; i < memorySize;) 
     { 
      memory[i] = line2; 
      i++; 

      if(i < memorySize) 
      { 
       line2 = reader2.readLine(); 
      } 
     } 

     for (int k = 0; k < memorySize; k++) 
     { 
      boolean found = false; 
      File f1 = new File("stdlist1.txt"); 
      BufferedReader buff1 = new BufferedReader(new FileReader(f1)); 

      for (int m = 0; m < numberOfLinesFile1; m++) 
      { 
       line11 = buff1.readLine(); 

       if (line11.equals(memory[k]) && found == false); 
       { 
        found = true; 
       } 

      } 
      buff1.close(); 

      if (found == false) 
      { 
       writer.write(memory[k]); 
       writer.newLine(); 
      } 


     }  
    } 

    reader2.close(); 
    writer.close(); 

    endTimer(); 
    long time = duration(); 
    System.out.println("PROCESS COMPLETED SUCCESSFULLY"); 
    System.out.println("Duration: " + time + " ms"); 

} 

public static void startTimer() 
{ 
    startTime = System.currentTimeMillis(); 
} 
public static void endTimer() 
{ 
    endTime = System.currentTimeMillis(); 
} 
public static long duration() 
{ 
    return endTime - startTime; 
} 
public static void reset() 
{ 
    startTime = 0; 
    endTime = 0; 
} 
} 

回答

2

你必须检查你还没有到达文件的末尾。在您有lineX = readerX.readLine()的所有循环中,立即检查是否lineX == null,如果是,则跳出循环。

编辑我自己的答案,因为代码在评论中显示不好。

while(!line11.equals(memory[k])) 
    { 
     line11 = buff1.readLine(); 
    } 

这是line11这是(有时)在这里。如果memory[k]不在file1中,会发生什么情况?

+0

如果内存[K]是不是在文件1,它只是不断读书,直到他们是相同的,或不相同的。如果循环检查file1中的所有记录并找不到,则将其写入输出。对?不是我的方法好吗?或者它只是代码问题?请帮助。 – beetle

+0

如果它不在f1中,那么while循环的条件永远不会是错误的,所以它一直持续阅读直到...? –

2

memory [k]为空。为什么这是null?因为在这个代码:

while((line2 = reader2.readLine()) != null) 
     { 
      for (int i = 0; i < 100; i++) 
      { 
       memory[i] = line1; 
       i++; 

       if(i < 100) 
       { 
        line2 = reader2.readLine(); 
       } 
      } 

你说memory[i] = line1;

一号线却总是空,因为你在一个循环时,一号线是空从而结束了之前使用它。

我相信你打算写在上面的代码**memory[i] = line2;** :)

+0

是的。你是对的。我打算这么做。我改变了它,但仍然在同一行发出nullpointerexception。 :( – beetle