2011-10-29 204 views
3

我是初學Java的人。從文件讀取並寫入到java文件中

這是我的方法:

我想讀的兩個文件,然後讓他們的工會。我應該是使用數組大小​​爲100(只有一個array允許的,由線或不允許arrayList或其他結構讀取和寫入線)。

首先,我從file1讀取所有的記錄,並將其寫入輸出,第三個文件。爲此,我一次讀取100條記錄,並使用迭代將它們寫入第三個文件。

然後,像第一個文件一樣,這次我將第二個文件作爲100條記錄一次讀取,並將它們寫入memory[]。然後我找到常用記錄,如果我從File2讀取的記錄不在File1中,則將其寫入輸出文件。我這樣做直到reader2.readLine()得到null,我在每次迭代中重新打開file1

這是我迄今爲止所做的工作,差不多完成了。任何幫助,將不勝感激。

編輯:好的,現在它沒有給出任何異常,但它找不到不同的記錄,並且不能寫入它們。我猜最後的循環和布爾運算符不起作用,爲什麼?我真的需要幫助。謝謝你的耐心。

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; 
} 
} 
+0

如果'stdlist1.txt'長度小於100行,代碼會發生什麼?如果它不完全是100行的倍數,會發生什麼?你可以使用'ArrayList '而不是'String []'作爲'memory'嗎?它會使事情比使用固定大小的數組容易得多。 – msandiford

+0

+1分享你的努力! – SpeedBirdNine

+0

這是我的作業項目,它確保沒有少於100行的輸入文件。而且,如果它不是100行的倍數,則memory []將填充一些空值。但我認爲這不會是一個問題。 – beetle

回答

0

編輯!重做。

好的,所以要一次使用100行,您需要檢查null,否則嘗試將空值寫入文件可能會導致錯誤。

您正在檢查文件是否在最後一次,然後收集99個信息peices而不檢查null。

如果當這條線被稱爲:

while((line2 = reader2.readLine()) != null) 

只有1中左側的文件中的行?然後,您的內存數組包含99個null實例,並且您嘗試向文件寫入99次爲null。這是更壞的情況。

我真的不知道我們應該給那些尋找功課幫助的人有多大的幫助,在我熟悉的大多數網站上甚至都不允許。

這裏是寫入第一個文件的一種方法的示例。

String line1 = reader1.readLine(); 

boolean end_of_file1 = false; 
while(!end_of_file) 
{ 
    for (int i = 0; i < memorySize) 
    { 
     memory[i] = line1; 
     i++; 

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

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

reader1.close(); 

一旦你有了這些,使檢查的副本更容易,使公共靜態布爾值,檢查它的文件,然後你可以調用,它會使代碼更加清晰。

public static boolean isUsed(String f1, String item, int dist) 
{ 
    BufferedReader buff1 = new BufferedReader(new FileReader(f1)); 

    for(int i = 0;i<dist;i++) 
    { 
     String line = buff1.readLine() 
     if(line == null){ 
      return false; 
     } 
     if(line.equals(item)) 
     { 
      return true; 
     } 
    } 
    return false; 
} 

然後用同樣的方法,只是寫在每行前檢查寫文件1,看看!isUsed()

boolean end_of_file2 = false; 
memory = new String[memorySize];// Reset the memory, erase old data from file1 
int numberOfLinesFile2=0; 
String line2 = reader2.readLine(); 
while(!end_of_file2) 
{ 
    for (int i = 0; i < memorySize;) 
    { 
     memory[i] = line2; 
     i++; 

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

    for (int i = 0; i < memorySize; i++) 
    { 
     if(!memory[i] == null) 
     { 
      //Check is current item was used in file 1. 
      if(!isUsed(file1, memory[i], numberOfLinesFile1)){//If not used already 
       writer.write(memory[i]); 
       writer.newLine(); 
       numberOfLinesFile2++; 
      } 
     } 
    } 
} 
reader2.close(); 
writer.close(); 

希望這有助於。注意我沒有提供完整的代碼,因爲我已經瞭解到,只是粘貼代碼會使複製和粘貼更容易使用代碼而不理解它。希望對你有幫助。

+0

非常感謝你!我知道這是浪費時間使用數組,但我必須使用它,因爲它是項目的一部分,只允許大小爲100的數組。我應該先寫100個,然後將它們寫入數組中輸出。這就是爲什麼我不能使用逐行閱讀和寫入或arrayList,因爲它應該是固定的大小。我只需要明白爲什麼它不會給出不同的記錄。我嘗試了一切,但我無法解決循環和布爾值的問題。 – beetle

+0

我使用eclipse。它編譯,沒有例外。但只是寫出整個第一個文件,意味着它找不到聯合。 (無法在File2中找到記錄,但在File1中找不到)。謝謝您的回答。 – beetle

+0

好的。好。然後使用你現有的方法,但爲了加快已經使用過的檢查,你應該把所有的項目添加到列表中。這樣你仍然不會重新掃描第二行的每一行的第一個文件。 至於100行。那就是它造成問題的地方。你閱讀直到閱讀器爲空,但是讓我們說什麼時候如果調用statment,那麼文件中只剩下15行。當您使用循環而不檢查null時,您正在掃描100項,最後85項將爲空。這就是Nul​​lPointerException所在的地方。將只適用於行號是100的倍數 –

相關問題