2012-09-10 81 views
57

這些有什麼區別?我只是學習Java的ATM,但好像我可以寫一個文件兩種方式,即(我這裏沒有複製try-catch塊。)FileWriter和BufferedWriter之間的Java差異

FileWriter file = new FileWriter("foo.txt"); 
file.write("foobar"); 
file.close(); 

FileWriter file = new FileWriter("foo.txt"); 
BufferedWriter bf = new BufferedWriter(file); 
bf.write("foobar"); 
bf.close(); 

我理解首先緩衝數據的概念,那麼這是否意味着第一個示例逐個寫入字符,第二個示例先將它緩存到內存並寫入一次?

回答

73

但是BufferedWriter更有效的,如果你

  • 具有沖洗/關閉
  • 與緩衝器大小相比,寫入是小之間多次寫入。

在你的例子中,你只有一次寫入,所以BufferedWriter只是增加了你不需要的開銷。

這是否意味着第一示例寫入的字符一個一個和它的第二個第一緩衝器到所述存儲器,並將其寫一次

在兩種情況下,該字符串是在一次寫入。

如果你只使用FileWriter的你寫(字符串)調用

public void write(String str, int off, int len) 
     // some code 
     str.getChars(off, (off + len), cbuf, 0); 
     write(cbuf, 0, len); 
} 

這使得一個系統調用,每次通話寫(字符串)。


哪裏BufferedWriter提高效率是在多個小寫。

for(int i = 0; i < 100; i++) { 
    writer.write("foorbar"); 
    writer.write(NEW_LINE); 
} 
writer.close(); 

沒有一個的BufferedWriter這樣可以使200(2 * 100)系統調用和寫入磁盤這是低效的。使用BufferedWriter時,這些可以全部緩衝在一起,並且由於默認緩衝區大小爲8192個字符,因此這僅成爲一次系統調用來寫入。

+0

我有一個問題,當我在使用FileWriter時,'write'返回後,java是否保證內容在磁盤中刷新,或者只是在pagecache中,當需要的時候os會刷新? – Jaskey

+0

@Jaskey如果你使用FIleWriter無緩衝,write()意味着操作系統有一個應該最終寫入磁盤的副本。 –

4

BufferedWriter效率更高。如果內存正確地爲我提供服務,它將節省小寫入和寫入一個更大的塊。如果你正在做很多小寫操作,那麼我會使用BufferedWriter。調用寫操作的速度很慢,因此儘可能少地寫入操作通常是可取的。

8

你說得對。這裏是BufferedWriterwrite()方法的樣子:

public void write(int c) throws IOException { 
    synchronized (lock) { 
     ensureOpen(); 
     if (nextChar >= nChars) 
      flushBuffer(); 
     cb[nextChar++] = (char) c; 
    } 
} 

正如你可以看到它確實檢查緩衝區是否已滿(if (nextChar >= nChars)),並刷新緩衝區。然後它將新字符添加到緩衝區(cb[nextChar++] = (char) c;)。

0

從Java API規範:

FileWriter

寫入字符文件的便捷類。這個類的構造函數假定默認的字符編碼和默認的字節緩衝區大小是可以接受的。

BufferedWriter

文本寫入字符輸出流,緩衝字符,從而提供單個字符,數組和字符串的高效寫入。

0

http://docs.oracle.com/javase/1.5.0/docs/api/java/io/BufferedWriter.html

通常,作家立即將其輸出發送到基礎字符或字節流。除非需要提示輸出,否則建議在Write()操作可能代價高昂的Writer周圍包裝BufferedWriter,例如FileWriters和OutputStreamWriters。例如,

PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(「foo.out」)));

將緩衝PrintWriter的輸出到文件。如果不進行緩衝,每次調用print()方法都會導致字符被轉換爲字節,然後立即將其寫入文件中,這可能非常低效。