2012-10-10 64 views
0

爲了格式化正確,我需要處理一個大型文本文件(大約600 MB),將格式化輸出寫入新的文本文件。問題在於將內容寫入新文件的時間大約爲6.2 MB。下面是代碼:Java - 無法完成寫入文本文件

/* Analysis of the text in fileName to see if the lines are in the correct format 
    * (Theme\tDate\tTitle\tDescription). If there are lines that are in the incorrect format, 
    * the method corrects them. 
    */ 
    public static void cleanTextFile(String fileName, String destFile) throws IOException { 
     OutputStreamWriter writer = null; 
     BufferedReader reader = null; 

     try { 
      writer = new OutputStreamWriter(new FileOutputStream(destFile), "UTF8"); 
     } catch (IOException e) { 
      System.out.println("Could not open or create the file " + destFile); 
     } 

     try { 
      reader = new BufferedReader(new FileReader(fileName)); 
     } catch (FileNotFoundException e) { 
      System.out.println("The file " + fileName + " doesn't exist in the folder."); 
     } 

     String line; 
     String[] splitLine; 
     StringBuilder stringBuilder = new StringBuilder(""); 

     while ((line = reader.readLine()) != null) { 
      splitLine = line.split("\t"); 
      stringBuilder.append(line); 

      /* If the String array resulting of the split operation doesn't have size 4, 
      * then it means that there are elements of the news item missing in the line 
      */ 
      while (splitLine.length != 4) { 
       line = reader.readLine(); 
       stringBuilder.append(line); 

       splitLine = stringBuilder.toString().split("\t"); 
      } 
      stringBuilder.append("\n"); 
      writer.write(stringBuilder.toString()); 
      stringBuilder = new StringBuilder(""); 

      writer.flush(); 
     } 

     writer.close(); 
     reader.close(); 

    } 

我已經找了答案,但問題通常涉及到的事實,作家沒有被關閉或不存在flush()方法。因此,我在考慮問題出在BufferedReader中。我錯過了什麼?

+1

你嘗試使用正確的沖洗..? – OmniOwl

+0

我第一次嘗試使用刷新一定次數(準確的說是500次),希望避免在週期的每一次迭代中沖洗,但它不起作用。什麼是使用flush的正確方法? – Judas

+0

你能否提供至少一些來自輸入文件(有600 MB的文件)的記錄? – Jagger

回答

3

看這個循環:

while (splitLine.length != 4) { 
    line = reader.readLine(); 
    stringBuilder.append(line); 

    splitLine = stringBuilder.toString().split("\t"); 
} 

如果你結束了超過5項splitLine,你只是保持永遠讀取數據......你甚至不會注意到你的時候已到達文件末尾,因爲您只需要將null添加到StringBuilder即可。我不知道這是發生了什麼(我們不知道你的數據是什麼樣的),但它確實是可行的,你應該警惕它。

(你也應該使用try/finally塊關閉的資源,但這是另外一個問題。)

+0

工作,這是一個愚蠢的錯誤。我只是將操作符從'!='更改爲'<'。謝謝。 – Judas

+1

@Judas:好的,我們不清楚這是否是正確的解決方法 - 如果你到了文件的末尾,它將會永遠迭代。我已經診斷出這個問題,但您可能需要更仔細地考慮解決方案。 –

+0

它將所有內容寫入文件,並且文件結尾沒有問題。儘管如此,還是出現了另一個問題,但現在我應該沒問題。再次感謝! – Judas

0

分離出FileOutputStream中,因爲它是自己的變量並關閉它,太:

FileOutputStream fos = new FileOutputStream(destFile); 
writer = new OutputStreamWriter(fos); 

    ... 

writer.flush(); 
fos.flush(); 
0
  1. try/catch沒有很好的編碼,以防過程繼續的錯誤。
  2. 可以更換

    stringBuilder = new StringBuilder(""); 
    

    通過

    stringBuilder.setLength(0); 
    
  3. 使用自己的解析器line.indexOf('\t',from)代替String.split()

  4. 與line.substring(B,E)獲得的部件添加到列表<字符串>
  5. 使用帶有正確字符的PrintStream ACTER集,用兩個參數
  6. 構造由4編寫信息4,從列表中消耗數據,當則爲list.size()> = 4