13

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

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

4

4 回答 4

17

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

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

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

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

我的猜测:你曾经available()看到缓冲区应该有多大,然后它返回了0。请注意,这是对available(). JavaDoc 明确指出:

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

于 2010-02-23T15:49:47.773 回答
10

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

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

再一次,呸。

于 2011-09-16T07:08:02.960 回答
3

根据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 的实际实现!!!(可能是错误的)

于 2010-02-23T15:50:44.120 回答
0

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

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

于 2012-07-04T10:57:45.640 回答