2014-03-04 25 views
0

在api中,java表示,'除非需要立即輸出,否則建議在其write()操作可能代價高昂的Writer周圍包裝BufferedWriter,例如FileWriters和OutputStreamWriters'.I多次嘗試比較,事實證明,如果我不使用PrintWriter來包裝BufferedWriter,則花費的時間會更少。這是否意味着,我不必在'控制檯'上包裝? 有我簡單的代碼,比較兩者。我應該使用PrintWriter來包裝BufferedWriter嗎?

public static void PrintWrite(String path, String content) throws IOException { 
    PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(path))); 
    pw.write(content); 
    pw.close(); 
} 
public static void BufferedWrite(String path, String content) throws IOException { 
    BufferedWriter bw = new BufferedWriter(new FileWriter(path)); 
    bw.write(content); 
    bw.close(); 
} 
private static void main(String[] args) 
{ 
    String s = ""; 
    String path = "D:\\out.txt"; 
    for (int i = 0; i < 10000; i++) 
    { 
     s += "kjuatlistened"; 
    } 
    try 
    { 
     long start = System.nanoTime(); 
     //PrintWrite(path,s); 
     BufferedWrite(path,s); 
     long end = System.nanoTime(); 
     Printer.println("done,elapse " + (end - start) + " s"); 
    } 
    catch (IOException ex) 
    { 
     ex.printStackTrace(); 
    } 
} 

enter image description here

+0

那麼,從我已閱讀和收集,如果你需要更多的功能,然後包裝類。如果它在沒有包裝類的情況下工作,並且你不需要包裝類可以給你的其他方法,那麼不要包裝類。我已經閱讀了很多這種混合的想法,但是從我收集的包裝類的角度來看,只有在需要包裝類提供的更多功能時才能完成(大部分)。 –

+0

不,道格hauf,我只是ocnsider爲什麼jdk說,從我的角度來說,更好的做法可能與不安全的事情有關,並且因爲在我的測試中,'換行'使用更多時間...所以...我發佈了這個問題... – Telerik

回答

0

,當你在另一個包裝一個對象你肯定增加處理層。

使用PrintWriter的主要原因是豐富的便利功能,可以智能輸出各種東西。如果你不需要這個功能,你根本不會使用PrintWriter。

BufferedWriter的要點是允許緩衝輸出,然後批量寫入。對文件系統和因特網等的I/O代價高昂,其中很大一部分成本是首先生成連接,然後等待每個I/O操作完成。如果您對外部設備進行I/O批處理,您可以真正降低總體成本,因爲輸出(或輸入)可以批處理 - 而且您最終每個批次等待完成一次,而不是每個I/O操作一次。對於一個「有趣」的測試,嘗試一次一個地寫一個字符到你的FileWriter,然後用一個包裝你的FileWriter的BufferedWriter來做同樣的事情。我認爲在後一種情況下你會看到很大的改進。

+0

明白了,我看到'PrintWriter'比'BufferedWriter'有更多的方法,這是你的意思嗎?並且非常感謝你的迴應... – Telerik

+0

是的 - 所有這些額外的方法是在那裏可以很容易地寫出各種東西到流中。對於大多數作者而言,你必須自己生成正確的字節序列。 PrintWriter使許多更容易。 –

0

我不完全理解你的潛在問題,但是...

結束語使用PrintWriter一個的BufferedWriter幾乎有要慢一些,因爲它被添加呼叫層。

System.out和.err是PrintStream對象,而不是PrintWriter。這就是你所說的控制檯的意思嗎?我很確定你不應該包裝他們中的任何一個。

+0

我對此感到困惑,因爲爲什麼api表示,建議使用PrintWriter來包裝BufferedWriter,但是,從我的測試中可以看出,'warp'操作確實花費了更多時間,所以這就是我困惑的地方。抱歉...我不應該使用'console'。 – Telerik

+0

另外,我只是混淆了爲什麼它說'除非需要及時輸出',以及什麼情況? – Telerik

+0

如果您需要輸出在您寫入時正好出現在最終輸出流中,請勿使用BufferedWriter。 BufferedWriter可以在輸出到最終目的地之前保持輸出,只要它喜歡在緩衝區中。因此,在這種情況下,「即時輸出」意味着「儘可能快地出現在最終目的地的輸出」,而不是「每當緩衝作者感覺寫出來時在最終目的地出現的輸出」。 –