如何检查InputStream是否为空而不读取?

我想知道InputStreamn是否为空,但不使用read()方法。 有没有办法知道它是否是空的而不阅读?

我认为你正在寻找inputstream.available() 。 它没有告诉你它是否是空的,但它可以告诉你数据是否被读取。

不,你不能。 InputStream被devise用来处理远程资源,所以直到你真的读完它才能知道它是否在那里。

你也许可以使用一个java.io.PushbackInputStream ,然而,它允许你从stream中读取,看看是否有什么东西,然后“推回”stream(这不是真正的工作原理,但这是它对客户端代码的行为方式)。

基于使用PushbackInputStream的build议,您将在这里find一个示例实现:

 /** * @author Lorber Sebastien <i>(lorber.sebastien@gmail.com)</i> */ public class NonEmptyInputStream extends FilterInputStream { /** * Once this stream has been created, do not consume the original InputStream * because there will be one missing byte... * @param originalInputStream * @throws IOException * @throws EmptyInputStreamException */ public NonEmptyInputStream(InputStream originalInputStream) throws IOException, EmptyInputStreamException { super( checkStreamIsNotEmpty(originalInputStream) ); } /** * Permits to check the InputStream is empty or not * Please note that only the returned InputStream must be consummed. * * see: * http://stackoverflow.com/questions/1524299/how-can-i-check-if-an-inputstream-is-empty-without-reading-from-it * * @param inputStream * @return */ private static InputStream checkStreamIsNotEmpty(InputStream inputStream) throws IOException, EmptyInputStreamException { Preconditions.checkArgument(inputStream != null,"The InputStream is mandatory"); PushbackInputStream pushbackInputStream = new PushbackInputStream(inputStream); int b; b = pushbackInputStream.read(); if ( b == -1 ) { throw new EmptyInputStreamException("No byte can be read from stream " + inputStream); } pushbackInputStream.unread(b); return pushbackInputStream; } public static class EmptyInputStreamException extends RuntimeException { public EmptyInputStreamException(String message) { super(message); } } } 

这里有一些合格的testing:

  @Test(expected = EmptyInputStreamException.class) public void test_check_empty_input_stream_raises_exception_for_empty_stream() throws IOException { InputStream emptyStream = new ByteArrayInputStream(new byte[0]); new NonEmptyInputStream(emptyStream); } @Test public void test_check_empty_input_stream_ok_for_non_empty_stream_and_returned_stream_can_be_consummed_fully() throws IOException { String streamContent = "HELLooooô wörld"; InputStream inputStream = IOUtils.toInputStream(streamContent, StandardCharsets.UTF_8); inputStream = new NonEmptyInputStream(inputStream); assertThat(IOUtils.toString(inputStream,StandardCharsets.UTF_8)).isEqualTo(streamContent); } 

您可以使用available()方法询问stream在您调用的时刻是否有可用数据。 但是,该function不能保证适用于所有types的inputstream。 这意味着你不能使用available()来判断一个read()的调用是否会实际阻塞。

如果您使用的InputStream支持标记/重置支持,您也可以尝试读取stream的第一个字节,然后将其重置为原始位置:

 input.mark(1); final int bytesRead = input.read(new byte[1]); input.reset(); if (bytesRead != -1) { //stream not empty } else { //stream empty } 

如果你不控制你正在使用什么types的InputStream ,你可以使用markSupported()方法来检查mark / reset是否在stream上工作,并返回到available()方法或者java.io.PushbackInputStream否则为java.io.PushbackInputStream方法。

如何使用inputStreamReader.ready()来找出?

 import java.io.InputStreamReader; /// ... InputStreamReader reader = new InputStreamReader(inputStream); if (reader.ready()) { // do something } // ... 
 public void run() { byte[] buffer = new byte[256]; int bytes; while (true) { try { bytes = mmInStream.read(buffer); mHandler.obtainMessage(RECIEVE_MESSAGE, bytes, -1, buffer).sendToTarget(); } catch (IOException e) { break; } } }