8

有什么区别

byte[] buffer = new byte[1024];
// this:
if (inputStream.read(buffer) > 0) { /*...*/ }
// and:
if (inputStream.read(buffer) != -1) { /*...*/ }

两者都可以确定网络流终止吗?

4

3 回答 3

11

JavadocsInputStream.read()说:

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

在正常使用中,这永远不会发生,因此明确测试这种情况没有多大意义。(如果你想避免永远循环,因为缓冲区是零长度并且在这种情况下快速失败,只需测试缓冲区的长度。)

更进一步,还有:

返回:读入缓冲区的总字节数,或者-1是否因为到达流的末尾而没有更多数据。

如果要测试文件结尾(或网络流,或其他),请使用测试:

if ( inputStream.read(buffer) != -1 ) ...

没有错误的 Java 实现将永远不会返回任何其他内容以表明没有更多可用数据。

于 2012-09-17T13:54:00.060 回答
2

如果您已经知道缓冲区长度不为零,那么这两个表达式之间没有有效区别。鉴于这个关于有效缓冲区的基本规定,它可以从永远不会返回的文档中推断出来。read0

在输入数据可用、检测到文件结尾或引发异常之前,此方法会一直阻塞。

于 2019-02-28T21:37:03.773 回答
0

根据文档inputstream.read(buffer) !=-1会告诉您流已结束。inputstream.read(buffer) == 0只是说没有可读取的字节,但流仍然处于活动状态(即,自从您上次读取所有可能的内容以来,对等方还没有发送任何内容)。

于 2012-09-17T13:50:22.073 回答