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
,它将再次尝试读取(),直到确认实际上没有任何内容留待阅读。
编辑:注意
- 这是 OpenJDK 对基础
InputStream
的实现。其他人可能不同。
- class
InputStream
的子InputStream
也可能有自己的重写实现。相关class. 请查阅doc/source
在 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
,它将再次尝试读取(),直到确认实际上没有任何内容留待阅读。
编辑:注意
- 这是 OpenJDK 对基础
InputStream
的实现。其他人可能不同。 - class
InputStream
的子InputStream
也可能有自己的重写实现。相关class. 请查阅doc/source