我正在学习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();
}
Run Code Online (Sandbox Code Playgroud)
我不完全理解InputStream,InputStreamReader和BufferedReader的作用.所有这些都有一个read()方法,并且在BufferedReader的情况下也有readLine().为什么我不能只使用InputStream或只添加InputStreamReader?为什么我需要添加BufferedReader?我知道这与效率有关,但我不明白如何.
我一直在研究,BufferedReader的文档试图解释这个,但我仍然不知道谁在做什么:
通常,由Reader构成的每个读取请求都会导致相应的读取请求由基础字符或字节流构成.因此,建议将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返回,只返回一次而不是几次?我不知道,我只是想弄清楚事情是如何运作的.
非常感谢提前!