java:读取与 InputStream 实例的 readNBytes

java: read vs readNBytes of the InputStream instance

在 java 中,InputStream class 有方法 read(byte[], int, int)readNBytes(byte[], int, int)。看起来这两个方法的功能完全一样,所以我想知道它们之间有什么区别。

编辑以提高评论中讨论的可见度:

  • read() 表示它尝试读取 " 最多 len 个字节...但可能会读取更小的数字。此方法会阻塞,直到输入数据可用、检测到文件结尾或抛出异常。"
  • readNBytes()“阻塞,直到 len 字节的输入数据被读取,检测到流结束,或者抛出异常。”

尽管 JDK 对 InputStream 的实施 可能会为您提供两种方法相同的结果,但记录的差异意味着比其他 class继承自它的 es 可能会有不同的行为。

例如给定流 '12345<end>'read(s,0,10) 被允许 return '123',而 readNbytes() 更有可能继续寻找流的结尾,并且全部给你


原回答:

您说得对,javadoc 非常相似。如有疑问,请始终深入了解源头。大多数 IDE 都可以轻松附加 OpenJDK 源代码并让您深入了解它们。

这是 readNBytes 来自 InputStream.java:

public int readNBytes(byte[] b, int off, int len) throws IOException {
    Objects.requireNonNull(b);
    if (off < 0 || len < 0 || len > b.length - off)
        throw new IndexOutOfBoundsException();
    int n = 0;
    while (n < len) {
        int count = read(b, off + n, len - n);
        if (count < 0)
            break;
        n += count;
    }
    return n;
}

如您所见,它实际上执行了对 read(byte[],int,int) 的调用。这种情况下的区别在于,如果实际读取的字节数小于您指定的len它将再次尝试读取(),直到确认实际上没有任何内容留待阅读。

编辑:注意

  1. 这是 OpenJDK 对基础 InputStream 的实现。其他人可能不同。
  2. class InputStream 的子InputStream 也可能有自己的重写实现。相关class.
  3. 请查阅doc/source