InputStream.read(byte[]) 返回的 0 是什么意思?如何处理这个问题?

2022-09-04 06:46:32

返回的 0(读取的字节数)和方式是什么?如何处理这种情况?InputStream.read(byte[])InputStream.read(byte[], int, int)

为了清楚起见,我的意思是 或 返回读取的字节数的方法。read(byte[] b)read(byte[] b, int off, int len)


答案 1

a 可能从对 read(byte[]) 的调用返回的唯一情况是,传入的长度为 0:InputStream0byte[]

 byte[] buf = new byte[0];
 int read = in.read(buf); // read will contain 0

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

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

我的猜测:你使用avable()来查看缓冲区应该有多大,然后它返回。请注意,这是对 的误用。JavaDoc 明确指出:0available()

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


答案 2

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

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

再一次,哎呀。


推荐