【问题标题】:Why does an Inpustream read method return an int?为什么 Inputstream 读取方法返回一个 int?
【发布时间】:2014-03-31 03:06:08
【问题描述】:

我试图通过输入流中的读取方法了解幕后发生的事情。

我知道我可以做到以下几点:

InputStream is = new FileInputStream(new File("myFile.txt"));

byte[] buffer = new byte[8192];

while(is.read(buffer) != -1) {
   // do something with the bytes
}

我相信这可以通过将多达 8192 个字节读入我的字节数组然后对这些字节进行处理来实现。但是为什么读取会返回读取字节数的整数呢?这纯粹是为了让使用字节数组中的字节的任何东西都知道何时停止寻找字节?

我想我很困惑,例如,我的一个阅读显示

buffer[0] = 70
buffer[1] = 105
buffer[2] = 108
etc...

但如果我要读取整个字节数组的 8192,为什么数组设置中的元素是这样的?

我意识到这可能是一个愚蠢的问题,但如果能帮助我理解这一点,我将不胜感激。

【问题讨论】:

  • @SotiriosDelimanolis 该线程非常有帮助,谢谢!但我想我正在寻找有关返回值实际发生的情况的更多详细信息。
  • 没关系,我误会了。
  • 所以对于buffer[0],它有70字节被读取。为什么buffer[0] 中只有 70 个?为什么它不能达到读取的极限?是什么导致它将70 放在第一个元素中?抱歉所有问题。
  • 不,buffer[0] 将包含在该调用中读取的第一个字节,结果是 70。如果这是读取的唯一字节,则该方法将返回 1
  • 这与数据结构无关。硬盘驱动器上文件的内容以字节形式存储。当您想读取该文件的内容时,您需要逐字节读取它。这就是您的read(byte[]) 调用所做的。它逐字节读取,将每个单独的字节设置到数组中的一个位置。然后该方法返回读取的字节数。

标签: java buffer bytearray inputstream


【解决方案1】:

因为,无论出于何种原因,它现在可能无法读取所有字节。因此,java VM 返回它成功读取的数字,以便您知道发生了什么。

【讨论】:

    【解决方案2】:

    is.read(buffer) 方法读取最大可用字节数或buffer.length(在本例中为 8192)字节,以先到者为准。

    如果整个数组没有被填满(这是可能的,因为可用字节数可能少于buffer.length),有原来的字节数可能很有用读取,以便可以安全地迭代数组而不会抛出NullPointerException

    你看到的原因

    buffer[0] = 70
    buffer[1] = 105
    buffer[2] = 108
    etc...
    

    是因为在读取的字节流中,第一个值是70,第二个是105,第三个是108,以此类推。这些实际上是流的内容,一次一个字节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-07
      • 2017-06-12
      • 1970-01-01
      • 2020-10-31
      • 1970-01-01
      • 2013-02-26
      • 2015-01-02
      相关资源
      最近更新 更多