InputStream、InputStreamReader 和 BufferedReader 如何在 Java 中协同工作?
我正在学习Android开发(我是一般的编程初学者)并学习HTTP网络,并在本课中看到以下代码:
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的文档试图解释这一点,但我仍然不知道谁在做什么:
通常,对 Reader 发出的每个读取请求都会导致对基础字符或字节流发出相应的读取请求。因此,建议将 BufferedReader 包装在任何读取() 操作可能代价高昂的读取器上,例如 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读取足够多的这些字符表示为整数以组成整行?并将整行作为字符串返回,只返回一次而不是多次?我不知道,我只是想了解事情是如何运作的。
提前非常感谢!