Comment puis-je vérifier si un InputStream est vide sans le lire?

Je veux savoir si un InputStreamn est vide, mais sans utiliser les méthodes read (). Y a-t-il un moyen de savoir si c’est vide sans le lire?

Je pense que vous recherchez inputstream.available() . Il ne vous dit pas si c’est vide, mais il peut vous donner une indication quant à savoir si les données sont là pour être lues ou non.

Non, vous ne pouvez pas. InputStream est conçu pour fonctionner avec des ressources distantes, vous ne pouvez donc pas savoir s’il y en a avant d’avoir réellement lu.

Vous pourrez peut-être utiliser un java.io.PushbackInputStream , qui vous permet de lire le stream pour voir s’il y a quelque chose, puis de le “remonter” dans le stream (cela ne fonctionne pas vraiment, mais c’est la façon dont il se comporte pour le code client).

Sur la base de la suggestion d’utiliser le PushbackInputStream, vous trouverez un exemple d’implémentation ici:

 /** * @author Lorber Sebastien ([email protected]) */ 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(Ssortingng message) { super(message); } } } 

Et voici quelques tests de passage:

  @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 { Ssortingng streamContent = "HELLooooô wörld"; InputStream inputStream = IOUtils.toInputStream(streamContent, StandardCharsets.UTF_8); inputStream = new NonEmptyInputStream(inputStream); assertThat(IOUtils.toSsortingng(inputStream,StandardCharsets.UTF_8)).isEqualTo(streamContent); } 

Vous pouvez utiliser la méthode available() pour demander au stream s’il existe des données disponibles au moment où vous l’appelez . Cependant, cette fonction n’est pas garantie pour tous les types de stream d’entrée. Cela signifie que vous ne pouvez pas utiliser available() pour déterminer si un appel à read() va réellement bloquer ou non.

Si le InputStream que vous utilisez prend en charge la prise en charge de la marque / réinitialisation, vous pouvez également essayer de lire le premier octet du stream, puis rétablir sa position d’origine:

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

Si vous ne contrôlez pas le type de InputStream que vous utilisez, vous pouvez utiliser la méthode markSupported() pour vérifier si les marqueurs / réinitialisations fonctionnent sur le stream et revenir à la méthode available() ou java.io.PushbackInputStream Méthode java.io.PushbackInputStream autrement.

Que diriez-vous d’utiliser inputStreamReader.ready () pour le découvrir?

 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; } } }