Maison >Java >javaDidacticiel >Comment puis-je lire à partir d'un Java InputStream avec un délai d'attente ?

Comment puis-je lire à partir d'un Java InputStream avec un délai d'attente ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-19 22:12:10218parcourir

How Can I Read from a Java InputStream with a Timeout?

Lecture à partir d'un InputStream avec un délai d'attente

Est-il possible de lire à partir d'un InputStream et de spécifier un délai d'attente ? Oui, mais ce n'est pas aussi simple qu'il y paraît. La méthode InputStream.read() peut ne pas être interrompue et la méthode InputStream.available() peut renvoyer 0 même lorsque les données sont disponibles.

Faits pris en charge par la documentation de Sun

  1. InputStream.read() peut être non-interruptible.
  2. Utiliser un lecteur ou InterruptibleChannel n'aidera pas.
  3. InputStream.available() peut toujours renvoyer 0.
  4. InputStream.close() peut bloquer ou ne rien faire.
  5. Il n'y a pas de général façon de tuer un autre fil.

Utiliser InputStream.available()

InputStream.available() devrait renvoyer une estimation du nombre d'octets disponibles en lecture sans blocage, mais il est important de noter que les sous-classes sont responsables du remplacement de cette méthode. En pratique, les classes de flux d'entrée concrètes fournissent des valeurs significatives pour available().

Mises en garde

  1. Assurez-vous d'utiliser le retour chariot lorsque vous saisissez une entrée dans Windows.
  2. InputStream.available() renverra 0 jusqu'à ce que les données soient disponibles à partir du shell.

Solution la plus simple (pas de blocage)

byte[] inputData = new byte[1024];
int result = is.read(inputData, 0, is.available());

Solution plus riche (maximise le remplissage du tampon dans le délai d'attente)

public static int readInputStreamWithTimeout(InputStream is, byte[] b, int timeoutMillis)
     throws IOException  {
     int bufferOffset = 0;
     long maxTimeMillis = System.currentTimeMillis() + timeoutMillis;
     while (System.currentTimeMillis() < maxTimeMillis & bufferOffset < b.length) {
         int readLength = java.lang.Math.min(is.available(), b.length - bufferOffset);
         int readResult = is.read(b, bufferOffset, readLength);
         if (readResult == -1) break;
         bufferOffset += readResult;
     }
     return bufferOffset;
 }

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn