我学习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