2011-10-29 107 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