InputStream.read()返回的是什么意思?怎么办呢?

Ale*_*rev 13 java io inputstream

通过哪种方式返回0(读取的字节数)InputStream.read?如何处理这种情况?

更新:我的意思是read(byte[] b)read(byte[] b, int off, int len)返回读取字节数的方法.

Joa*_*uer 17

InputStream可以0从调用返回的唯一情况read(byte[])byte[]传入的长度为0时:

 byte[] buf = new byte[0];
 int read = in.read(buf); // read will contain 0
Run Code Online (Sandbox Code Playgroud)

正如JavaDoc的这一部分所指定的:

如果b的长度为零,则不读取任何字节,返回0

我的猜测:你曾经available()看过缓冲区应该有多大并且它返回了0.请注意,这是误用available().JavaDoc明确指出:

使用此方法的返回值来分配用于保存此流中所有数据的缓冲区绝对不正确.

  • 我同意:>此方法将阻塞,直到输入数据可用,检测到文件结尾或引发异常.>如果b的长度为零,则不读取任何字节,返回0; 否则,尝试读取至少一个字节.>如果没有字节可用,因为流位于文件的末尾,则返回值-1; 否则,至少读取一个字节并存储到b中.谢谢! (2认同)

小智 10

看一下javax.sound.AudioInputStream #read(byte [] b,int off,int len)的实现... yuck.它们完全违反了标准的java.io.InputStream语义,如果请求少于一整帧数据,则返回读取大小为0.

不幸的是; 当len> 0时,常见的建议(和api规范)应该排除必须处理零的返回,但即使对于JDK提供的类,你也不能普遍依赖于任意类型的InputStreams.

再次,哎呀.