【问题标题】:How does InputStream read() in Java determine the number of bytes to read?Java中的InputStream read()如何确定要读取的字节数?
【发布时间】:2014-09-25 02:18:19
【问题描述】:

http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html#read()

文档说“从输入流中读取一些字节并将它们存储到缓冲区数组 b。”。

Java 中的 InputStream read() 如何确定字节数?

【问题讨论】:

  • 它尝试在不阻塞的情况下尽可能多地读取。例如,如果您正在处理 FileInputStream,Java 将要求操作系统为其提供与操作系统读取缓冲区中的字节数一样多的字节。
  • 那么,只要缓冲区不满,它就尽可能多地读取?我认为文档不清楚。
  • 你应该参考某个扩展 InputStream 的类。该特定方法是抽象的,因此它无法准确解释它将如何在扩展 InputStream 的流类上实现
  • 实际上 InputStream 的文档并没有真正说它会尽可能多地阅读。只是如果可以的话,它至少会读取一个,并且最多可以读取到适合数组的多个。否则没有关于将阅读多少的承诺。可以是任何数字。

标签: java inputstream


【解决方案1】:

缓冲区数组有一个定义的长度,称之为nread() 方法将读取 1 到 n 字节。除非检测到 EOF,否则它将阻塞直到至少有一个字节可用。

【讨论】:

    【解决方案2】:

    我认为混淆来自“阅读”的含义。

    read() 将 InputStream 中的下一个字节返回给您,如果没有剩余字节,则返回 -1。

    但是,由于您正在使用的特定 InputStream 的实现细节,包含正在读取的字节的源可能会读取多个字节,以便告诉您下一个字节:

    1. 如果您的 InputStream 已缓冲,则可能会将整个缓冲区长度读入内存,以便告诉您下一个字节是什么。但是,在内存缓冲区耗尽之前,对 read() 的后续调用可能不需要再次读取底层源。
    2. 如果您的 InputStream 正在读取一个压缩文件,那么底层源可能必须读取几个字节才能解压缩您的数据,以便返回下一个解压缩的字节。

    3. 包装其他输入流(例如new GZIPInputStream(new BufferedInputStream(new FileInputStream(file)));)的输入流层将根据层使用上面的#1 和#2。

    【讨论】:

      猜你喜欢
      • 2017-12-12
      • 2015-07-11
      • 1970-01-01
      • 2011-08-07
      • 2021-03-22
      • 2014-06-13
      • 2018-02-17
      • 2015-05-22
      • 2023-03-30
      相关资源
      最近更新 更多