繁体   English   中英

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

[英]What 0 returned by InputStream.read(byte[]) means? How to handle this?

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

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

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

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

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

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

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

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

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

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

再一次,呸。

根据Java API Doc:

http://java.sun.com/j2se/1.4.2/docs/api/java/io/InputStream.html#read(byte[])

只有当您传递的 byte[] 有零项(新 byte[0])时才会发生这种情况。

在其他情况下,它必须返回至少一个字节。 如果达到 EOF,则为 -1。 或者一个例外。

当然:这取决于您使用的 InputStream 的实际实现!!! (可能是错误的)

当我构建一个摆动控制台输出窗口并通过以下代码为 stdout 和 stderr 创建一个读取器线程时,我观察到了相同的行为(读取 0 个字节):

this.pi = new PipedInputStream();
                po = new PipedOutputStream((PipedInputStream)pi);
                System.setOut(new PrintStream(po, true));
当“主”摇摆应用程序退出时,我的控制台窗口仍然打开,我从 this.pi.read() 中读取 0。 读取的数据被放在控制台窗口上,导致某种竞争条件,只是忽略结果而不更新控制台窗口解决了这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM