2009-11-02 91 views
0

在下面的程序中,循環迭代1000次,並且我正在使用FileWriter將所有條目寫入文件中,但不幸的是程序最終只寫入了510(有時是415,有時是692,總是小於1000)條目文件,但循環迭代1000次。爲什麼文件中沒有所有條目?

import java.io.* ; 
import java.util.*; 

public class DemoWriter { 

    public static void main(String[] args) throws Exception { 

     List<String> receiverList = new ArrayList<String>() ; 
     receiverList.add("[email protected]") ; 
     receiverList.add("[email protected]") ; 
     receiverList.add("[email protected]") ; 

     FileWriter fw = new FileWriter("a.txt") ; 
     BufferedWriter bw = new BufferedWriter(fw) ; 

     int size = receiverList.size() ; 

     String str ; 
     int count = 0 ; 
     for(int i = 1 ; i <= 1000 ; ++i){ 
      str = receiverList.get((int) (Math.random() * size)) + "\n" ; 
      bw.write(++count + ".> " + str) ; 
      System.out.print(count + ".> " + str) ; 
     } 
    } 
} 

這是因爲文件大小或其他?


Thnx快速響應這裏所有的好人。我糾正了我的代碼(我忘記關閉流,現在代碼工作完美)。正如所有人指出我需要關閉流,但我接受BalusC,因爲他是第一個回答。

很高興在這裏你可以看到BalusC。 乾杯:)

回答

5

事實上,你應該總是關閉的資源來沖洗一切並釋放資源。顯式沖洗並不是必需的,因爲它通常在關閉期間隱式完成。只需調用Closeable#close()終於塊內一個try-catch-finally塊和你的罰款。

瞭解更多的Java IO tutorial

+0

您不想在try-catch塊的finally部分調用close() - 它會引發異常。 – 2009-11-02 18:32:28

+2

那麼?只需抓住它並進一步忽略它,或者爲了記錄目的而執行它的e.printStackTrace()。它肯定需要在finally塊中完成,因爲否則會泄露資源。 – BalusC 2009-11-02 18:35:20

9

你沒有關閉和沖洗你的作家。如果您在代碼末尾的編寫器上調用close()方法,緩衝區將被刷新並且編寫器關閉。

正如漢克蓋伊在評論中指出的那樣,close()方法可能會拋出一個異常(我相信一個IOException)。這意味着您必須將呼叫封裝在try/catch區塊中。但是,我看到你的main方法拋出Exception - 這是不是最好的做法,但它會防止你需要一個try/catch塊在這個特殊的實例。

+2

另外,對close()的調用應該放在'finally'塊中。 – 2009-11-02 18:13:35

0

您是否需要關閉BufferedWriter和FileWriter對象?這可能會留下不完整的文件。

+0

bw.close()應該通過close()。 – Xailor 2009-11-02 18:41:48

0

只需添加

bw.flush(); 
    bw.close(); 

的方法結束

+2

方法名稱是小寫的,我相信(需要仔細檢查文檔),但調用close也會刷新緩衝區... – 2009-11-02 18:13:38

+0

我不確定。在C#中肯定如此。 Docs say 「public void close()throws IOException \\關閉流。」 – ALOR 2009-11-02 18:18:01

+0

這是Java,而不是C#。然而,它可能取決於作家的類型。 – 2009-11-02 18:21:00

相關問題