InputStream.read()返回的是什么意思? 怎么办呢?

InputStream.read返回的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)… yuck的实现。 它们完全违反了标准的java.io.InputStream语义,如果请求少于一整帧数据,则返回读取大小为0。

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

再次,哎呀。

根据Java API Doc:

http://java.sun.com/j2se/1.4.2/docs/api/java/io/InputStream.html#read(字节%5B%5D)

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

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

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

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

                this.pi = new PipedInputStream(); po = new PipedOutputStream((PipedInputStream)pi); System.setOut(new PrintStream(po, true)); 

当’main’swing应用程序退出,我的控制台窗口仍然打开时,我从this.pi.read()读取0。 读取的数据放在控制台窗口上,导致竞争条件有些如何,只是忽略结果而不更新控制台窗口解决了问题。