Java InputStreamReader.read()它是如何工作的';不是';已读缓冲区?

Java InputStreamReader.read()它是如何工作的';不是';已读缓冲区?,java,android,Java,Android,我在使用下面的代码,只是想知道为什么每次重复while循环时,inputBuffer都会从上次读取的末尾读取 是什么阻止它在循环过程中一直读取相同的500个字符?InputStreamReader就是这样构造的吗 下面是我从Java站点得到的信息 将字符读入数组。此方法将阻塞,直到某些输入可用、发生I/O错误或到达流的结尾 它确实说它一直读到结束,但是当它在第一个while循环中运行时,是什么阻止它假设已经到达结束,因为字符缓冲区大小小于整个InputStream 我有更多与此相关的代码,但我认

我在使用下面的代码,只是想知道为什么每次重复while循环时,inputBuffer都会从上次读取的末尾读取

是什么阻止它在循环过程中一直读取相同的500个字符?InputStreamReader就是这样构造的吗

下面是我从Java站点得到的信息

将字符读入数组。此方法将阻塞,直到某些输入可用、发生I/O错误或到达流的结尾

它确实说它一直读到结束,但是当它在第一个while循环中运行时,是什么阻止它假设已经到达结束,因为字符缓冲区大小小于整个InputStream

我有更多与此相关的代码,但我认为你们可以充分理解它是如何运行的

StringBuilder tempBuffer = new StringBuilder();

InputStream is = connection.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
int charRead;
char[] inputBuffer = new char[500];

while (true){
    charRead = isr.read(inputBuffer);
    if (charRead <=0){
    break;
    }
    tempBuffer.append(String.copyValueOf(inputBuffer, 0, charRead));
}

return tempBuffer.toString();
StringBuilder tempBuffer=new StringBuilder();
InputStream is=connection.getInputStream();
InputStreamReader isr=新的InputStreamReader(is);
int-charRead;
char[]inputBuffer=新字符[500];
while(true){
charRead=isr.read(inputBuffer);

if(charRead
InputStreamReader
只是
InputStream
的包装器

任何
InputStream
都只是操作系统提供的某个文件、套接字或其他资源的包装器

操作系统知道您读取到的位置,并将数据发送到从该位置开始的下一个读取操作,并相应地增加该位置。或者,例如,对于套接字,它已经丢弃了您已经读取的数据

它与
读取器
输入流
没有任何关系


一个明显的例外是
ByteArrayInputStream
,它提供自己的位置。

它保持当前位置,因此下一次读取不会从开始读取,而是从原来的位置读取。因此这属于InputStreamReader本身的功能范围?因此,当它被读取到缓冲区时,它将“始终”记住保持其last读取位置?@HyperZI不知道它是如何实现的,我必须看一看。但我认为InputStreamReader保持着一个电流。好吧,谢谢你哦,哇,所以OS本身记住了位置?这其实很酷。所以当你说明显的异常时,你的意思是“ByteArrayInputStream”有自己的方法来保持re将数据读取到哪里,而不是操作系统必须正确处理数据?