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),那么这两个调用完全相等。