【问题标题】:InputStreamReader.read() how does it 'not' read already read buffers?InputStreamReader.read() 它如何“不”读取已读取的缓冲区?
【发布时间】:2016-02-29 23:39:31
【问题描述】:

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

是什么阻止它在循环运行时一直读取相同的 500 个字符? InputStreamReader 就是这么构造的吗?

所以我从 Java 网站得到的内容如下。

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

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

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

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();

【问题讨论】:

  • 它保持当前位置,因此下一次读取不会从头开始读取,而是从原来的位置读取。
  • 那么这在 InputStreamReader 本身的功能范围内吗?所以当它被读取到缓冲区时,它会“总是”记住保持它的最后读取位置? @HyperZ
  • 我不知道它是如何实现的,我得看看它。但我认为 InputStreamReader 保持电流。
  • 好的,谢谢

标签: java android


【解决方案1】:

InputStreamReader 只是 InputStream 的包装。

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

操作系统知道您已读取到的位置,并将数据从该位置开始传送到下一次读取操作,并相应地递增该位置。或者,以套接字为例,它已经丢弃了您已经读取的数据。

它与ReaderInputStream 没有任何关系。

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

【讨论】:

  • 哦,哇哦,操作系统本身还记得这个位置吗?这实际上很酷
  • 所以当你说明显的异常时,你的意思是“ByteArrayInputStream”有自己的方法来记录数据的读取位置,而不是操作系统必须处理它吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-13
相关资源
最近更新 更多