2010-02-11 25 views
1
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream("out.txt")))); 

所以讓我看看我是否明白這一點:爲文件「out.txt」打開一個字節輸出流。然後將其饋送到緩衝輸出流以使文件操作更快。緩衝的流被饋送到輸出流寫入器以將字節橋接到字符。最後,這位作家被送到一個緩衝作家......它增加了另一層緩衝?Java IO(javase 6) - 幫我理解我使用Streams和Writer的效果

嗯......

+0

對我來說看起來多餘... – Thilo 2010-02-11 09:32:58

+0

是的這就是爲什麼我想知道這是幹什麼的,具體是 – 2010-02-11 09:33:57

回答

3

是的你是對的。

我認爲在這種情況下,你可以做很多短(也見BufferedWriter

BufferedWriter out = new BufferedWriter(new FileWriter("foo.out")); 

,或者如果你想很好的打印功能:

的PrintWriter了=的新PrintWriter(新的BufferedWriter(新的FileWriter ( 「foo.out」)));

它可能是FileWriter創建自己的包裝,但該類將知道哪種方式是最好的。

在java中Streams和Writers是包裝器,所以你可以將它們組裝成你自己的需求(通過像你一樣堆疊它們)。這些類不會查看它們堆疊在哪種類型的流/寫入器上。在你的情況下,有幾個緩衝區意味着你實際上有兩個緩衝區,在兩個不同的類。這意味着它們會佔用一些額外的內存並可能會造成性能損失,但很可能您永遠不會注意到這一點(因爲與其他性能因素相比,它只是一點點的開銷)。

+0

是的,但在我的例子中,有兩層緩衝做什麼? – 2010-02-11 09:42:46

+0

我已編輯帖子回覆您的問題。 – Thirler 2010-02-11 09:47:57

+0

沒有用,我想。可能是額外的內存消耗。基準,如果你真的感興趣。 – Rorick 2010-02-11 09:48:11

0

這是decorator pattern的示例。這個想法是在不修改類的情況下爲類添加功能。在你的例子中你有一個FileWriter。你希望你寫的任何東西在寫之前首先被緩衝(如果它通過網絡是好主意)。所以你將BufferedWriter分層到FileWriter之上。其他應用程序可能不希望數據被緩衝,因此開發人員不需要添加BufferedWriter。

我們無法預測所有開發人員都需要什麼。假設你需要rot13你的數據,現在不是修改FileWriter,而是創建一個實現Writer的類調用Rot13Writer。 Rot13Writer將接收Writer的一個實例,並在將它傳遞給下一個作者之前執行rot13。