输入stream.read返回0还是-1?

时间:2012-09-17 13:44:33

标签: java

之间有什么区别
byte[] buffer = new byte[1024];
// this:
if (inputStream.read(buffer) > 0) { /*...*/ }
// and:
if (inputStream.read(buffer) != -1) { /*...*/ }

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

3 个答案:

答案 0 :(得分:10)

InputStream.read()的Javadocs说:

  

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

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

此外,还有:

  

返回:读入缓冲区的总字节数,如果由于已到达流末尾而没有更多数据,则返回-1

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

如果您已经知道缓冲区长度不为零,则这两个表达式之间没有有效的区别。鉴于有关有效缓冲区的基本规定,可以从Postman推断出 MySQL> use databasename; MySQL> load data local infile 'filename/filelocation.csv' into table tablename -> fields terminated by ',' -> enclosed by '\r\n' -> ignore 1 lines -> (col1, col2, col3...); 将永远不会返回read

  

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