2015-08-24 85 views
1

現在,我似乎並沒有得到那些流(輸入/輸出)和普通writerreader甚至scannerformatter之間的區別...輸入/輸出流與普通讀寫器有什麼區別,它們的類型有什麼區別?

及爲何InputStream有很多子類像DataInputStreamBufferedInputStream和所有那些亂七八糟(與同爲當然OutputStream)...

最後一兩件事,如果緩衝區是很好的(所以我讀)和高效爲什麼會任何一個使用任何其他輸入/輸出方式(爲什麼他們甚至製造?)

回答

5

Streams read/writebytes,while Readers read and Writers write character data。由於在它的下面,所有你在做I/O時總是有字節,這意味着讀者和作者會對字符進行額外的步驟converting字節。

對於這兩種情況(我剛剛鏈接的)都有抽象的超類,有不同的子類,不只是流 - 你可以在Javadoc中看到自己,每個頁面都列出所有這些子類。

如果您想在處理之前先收集大量數據,緩衝區纔有意義。例如,一個很好的理由是,如果您一次讀取/寫入大量數據,而不是單獨讀取/寫入每個字節/字符,則磁盤訪問效率更高。但是,當然,有很多不同的情況,你可能想做I/O - 不是一種尺寸,所以根據這些不同的情況有不同的類別。

完全緩衝版本的原因是面向對象編程的基本原理:通過解耦功能,您可以獲得更簡單的機制/設計,同時解決更廣泛的可能應用,如上所述。

+0

你能舉一個例子嗎?將**字節**轉換爲**字符**,反之亦然? – Argento

+1

查看InputStreamReader和OutputStreamWriter - 它們的構造函數接受一個流對象(source/sink作爲字節)和一個Charset,它具有如何在字節和字符之間映射的信息。您可以像使用任何其他讀寫器一樣使用它們,即通過普通的'read'和'write'方法。但是,如果您只想讀取/寫入現有的字符數據(比如說,從磁盤讀取文本文件),則不必手動執行此轉換:各種Reader/Writer類在內部爲您執行此操作。 – Thomas

+0

和哪個'Charset'應該使用並取決於什麼? – Argento