Java 中,讀取檔案時,往往會涉及到 InputStream & InputStreamReader &BufferedReader.
自己畫了個類圖,友善了解
1. 類圖
2. 例子
例如在讀取位元組流的時候:
private String readFromStream(InputStream inputStream) throws IOException {
StringBuilder output = new StringBuilder();
if (inputStream != null) {
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, Charset.forName("UTF-8"));
BufferedReader reader = new BufferedReader(inputStreamReader);
String line = reader.readLine();
while (line != null) {
output.append(line);
line = reader.readLine();
}
}
return output.toString();
}
讀寫位元組流大體涉及到 Steams(s表示有多種), Readers/Writers, BufferedReader/BufferedWriter。 其中的作用如下:
Streams: 處理位元組級别的資料
Reader/Writer : 處理字元級别的資料。 支援多種字元編碼
BufferedReader/BufferedWriter: 優化性能。 需要讀取的資料,會緩存到記憶體中,以便快速通路。(包裝了Reader/Writer)
3. 流程
InputStream 擷取位元組流資料, Reader 将位元組流資料轉換成 字元資料,由BufferedReader 寫入字元資料到記憶體中, 最後JAVA 程式從記憶體中讀取。
Streams/Reader/BufferedReader 中都有read()操作, 但是前面兩個需要Java程式從硬碟中讀取,效率很低; 後者從記憶體中讀取,效率高
參考:
https://stackoverflow.com/questions/43147069/how-do-an-inputstream-inputstreamreader-and-bufferedreader-work-together-in-jav/43147213
https://stackoverflow.com/questions/7376647/what-is-the-difference-between-javas-bufferedreader-and-inputstreamreader-class
Java 官方介紹(推薦):
http://www.javalearningacademy.com/streams-in-java-concepts-and-usage/