【问题标题】:Why Hadoop API FSDataInputStream read less than buffer size?为什么 Hadoop API FSDataInputStream 读取小于缓冲区大小?
【发布时间】:2012-08-24 11:29:40
【问题描述】:

我在 hadoop 分布式文件系统上有一个二进制文件,我想读取它。我正在使用 FSDataInputStream (扩展 DataInputStream )。我有长度为 "len" 的缓冲区。我使用 readBytes = stream.read(buffer) 方法将“len”字节数从文件读入缓冲区。 但是实际读取的字节数( readBytes )小于缓冲区大小( len ),即使我知道文件中存在“len”字节数。 那么为什么 FSDataInputStream 读取的字节数比我要求它读取的少?有什么想法吗?

【问题讨论】:

    标签: java hadoop


    【解决方案1】:

    如果您位于文件块的末尾附近,使得从该位置向前的“len”字节位于下一个块中的某个位置,那么当您使用 stream.read(buffer) 时,您将只获得剩余的字节在块中。在随后的读取中,您将开始从文件的下一个块中获取字节。

    【讨论】:

      【解决方案2】:

      DataInputStream.read(byte[]) and InputStream(byte[]) 的 JavaDocs 非常清楚地表明该方法将读取“一些字节数”,直到字节数组的长度。代码可能在字节数组被填充之前返回的原因有多种。

      您不应该只调用一次 read(byte[]) 方法来消耗流中的字节 - 您需要循环并继续从流中读取,直到它返回 -1

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-30
      • 2012-08-10
      • 2010-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多