Java 读取(字节[]b,int off,int len)和读取(字节[]b)之间的差异

Java 读取(字节[]b,int off,int len)和读取(字节[]b)之间的差异,java,io,Java,Io,在我们的项目中,有时当我们使用InputStream.read(byte[]b)方法时,会出现一些错误。 当我们使用 byte[] b = new byte[1024]; int len = -1; while ((len = io.read(b, 0, 1024)) != -1) { response.getOutputStream().write(b, 0, len); } 然后一切顺利 我找到了源代码,这是惊人的 public int read(byte b[]) throws

在我们的项目中,有时当我们使用
InputStream.read(byte[]b)
方法时,会出现一些错误。
当我们使用

byte[] b = new byte[1024];
int len = -1;
while ((len = io.read(b, 0, 1024)) != -1) {
    response.getOutputStream().write(b, 0, len);
}
然后一切顺利

我找到了源代码,这是惊人的

public int read(byte b[]) throws IOException {
    return read(b, 0, b.length);
}
read
方法中,它调用
read(b,0,b.length)
。在我们的项目中,
b.length
等于
1024
,那么我们为什么会得到错误呢

有人知道这两种方法的区别吗? 谢谢

看到
read(byte[])
调用
read(byte[],int,int)
,没有区别。第一种只是一种较短的阅读方式。很明显,肯定还有其他错误,比如输入参数错误之类的

编辑:
正如Zenzen所说,您会遇到什么错误?

导致错误的最可能原因是没有1024字节可从InputStream读取。注意,从您的示例中

read(b, 0, b.length);
正在安全地检查可从流中读取的字节数,其中作为引用的静态1024字节读取

read(b, 0, 1024)

没有采取这种预防措施。

如前所述,异常和堆栈跟踪将非常有用


Read可以返回长度为零的值。您的OutputStream是否可能不支持长度为0的写入?OutputStream的JavaDocs没有指出限制,但似乎子类可能有这样的边界错误。

您会遇到什么样的错误?我想您误解了。当他们尝试使用
read(byte[])
方法时,代码失败了,但当他们将其替换为直接使用
read(byte[],int,int)
方法时,代码起作用了。如果没有1024个字节可用,读取将只得到其中的内容。(这就是为什么
read
返回一个int而不是布尔值:因此它可以返回读取的量)。而且,
read(b,0,b.length)
的参数与流中有多少可用数据无关——它们在数组中指定一个区域。如果两种情况下的数组长度都是1024(OP说是1024),那么这两个调用完全相等。