InputStream.read() 返回的 0 是啥意思?如何处理?
Posted
技术标签:
【中文标题】InputStream.read() 返回的 0 是啥意思?如何处理?【英文标题】:What 0 returned by InputStream.read() means? How to handle this?InputStream.read() 返回的 0 是什么意思?如何处理? 【发布时间】:2011-01-20 03:15:22 【问题描述】:InputStream.read
返回的 0(读取的字节数)是什么意思?这种情况如何处理?
更新:我的意思是 read(byte[] b)
或 read(byte[] b, int off, int len)
方法返回读取的字节数。
【问题讨论】:
【参考方案1】:当我构建一个摆动控制台输出窗口并通过以下代码为 stdout 和 stderr 创建一个读取器线程时,我观察到了相同的行为(读取 0 个字节):
this.pi = new PipedInputStream();
po = new PipedOutputStream((PipedInputStream)pi);
System.setOut(new PrintStream(po, true));
当“主”摇摆应用程序退出时,我的控制台窗口仍然打开,我从 this.pi.read() 中读取 0。
读取的数据被放在控制台窗口上,导致某种竞争条件,只是忽略结果而不更新控制台窗口解决了这个问题。
【讨论】:
【参考方案2】:看看 javax.sound.AudioInputStream#read(byte[] b, int off, int len) 的实现 ... 哎呀。它们完全违反了标准的 java.io.InputStream 语义,如果您请求的数据少于一帧,则返回读取大小为 0。
很遗憾;常见的建议(和 api 规范)应该排除在 len > 0 时必须处理返回零,但即使对于 JDK 提供的类,您也不能普遍依赖于任意类型的 InputStreams。
再一次,糟糕。
【讨论】:
来自 UrlConnection.getInputStream() 的 InputStream 似乎也违反了标准 java.io.InputStream 语义,并且在处理大文件时返回读取大小为 0。谁能证实这一点? ^ 是的,这已确认,我在搜索 UrlConnection.getInputStream 读取返回零 0 的相同问题时遇到了这个问题【参考方案3】:根据 Java API 文档:
http://java.sun.com/j2se/1.4.2/docs/api/java/io/InputStream.html#read(byte[])
只有当您传递的 byte[] 有零项(新 byte[0])时才会发生这种情况。
在其他情况下,它必须返回至少一个字节。如果达到 EOF,则为 -1。或者一个例外。
当然:这取决于您使用的 InputStream 的实际实现!!! (可能是错的)
【讨论】:
【参考方案4】: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 明确指出:
使用这个方法的返回值来分配一个缓冲区来保存这个流中的所有数据是不正确的。
【讨论】:
我同意:>此方法阻塞,直到输入数据可用、检测到文件结尾或抛出异常。 >如果b的长度为零,则不读取字节,返回0;否则,将尝试读取至少一个字节。 >如果因为流在文件末尾而没有可用字节,则返回值-1;否则,至少读取一个字节并将其存储到 b 中。谢谢!以上是关于InputStream.read() 返回的 0 是啥意思?如何处理?的主要内容,如果未能解决你的问题,请参考以下文章
如果没有发送任何内容,Stream.Read不会返回任何内容
JAVA中Sockets长连接时使用read()阻塞的问题!急救!