我學習Android開發(我在通用編程初學者),並瞭解HTTP網絡和看到這個代碼的教訓:InputStream,InputStreamReader和BufferedReader如何在Java中一起工作?
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();
}
我不明白到底是什麼的InputStream,InputStreamReader和BufferedReader類做。它們都有一個read()方法,並且在BufferedReader的情況下也有readLine()。爲什麼我不能只使用InputStream或只添加InputStreamReader?爲什麼我需要添加BufferedReader?我知道這與效率有關,但我不明白。
我一直在研究和documentation for the BufferedReader試圖解釋這一點,但我還是不明白誰在做什麼:
在一般情況下,每個讀請求做了一個讀者會導致相應的 讀請求由底層字符或字節流組成。因此建議使用 將BufferedReader包裝在read()操作可能代價高昂的任何Reader 周圍,例如FileReaders和InputStreamReaders。例如,
BufferedReader in = new BufferedReader(new FileReader("foo.in"));
將緩衝來自指定文件的輸入。如果沒有緩衝,每個調用read()或readLine()都可能導致文件從 中讀取字節,轉換爲字符,然後返回,這可能是效率非常低的 。
所以,我明白的InputStream只能讀一個字節,使用InputStreamReader單個字符,和BufferedReader類一整行,它也確實對一些效率,這是我不明白。我想更好地瞭解誰在做什麼,以便理解爲什麼我需要他們三個人,以及沒有他們中的哪一個會有什麼不同。
我在網上的其他地方研究了很多,似乎沒有找到任何解釋,我可以理解,幾乎所有的教程只是重複文檔信息。這裏有一些相關的問題可能開始解釋這一點,但不要深入並解決我的困惑:Q1,Q2,Q3,Q4。我認爲這可能與最後一個問題關於系統調用和返回的解釋有關。但我想明白這一切是什麼意思。
難道是BufferedReader的readLine()調用InputStreamReader的read()方法,該方法又調用InputStream的read()方法?並且InputStream返回轉換爲int的字節,每次返回一個字節,InputStreamReader讀取足夠的這些數據以生成單個字符並將其轉換爲int並一次返回一個字符,並且BufferedReader讀取足夠多的這些字符用整數表示來組成一個整行?並將整行返回爲String,只返回一次而不是幾次?我不知道,我只是想知道事情是如何運作的。
提前感謝!
http://stackoverflow.com/questions/32175221/what-is-the-relation-between-inputstream-buffreredinputstream-inputstreamreade?rq=1? – 2017-03-31 18:09:17
感謝您的建議@RC。我已經看到了這個問題,並在我自己的問題中提到了這個問題。我正在尋找一些更具體的事情,以瞭解他們之間發生了什麼。 – schv09