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
Libérer: 2024-12-19 22:12:10
original
217 Les gens l'ont consulté

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());
Copier après la connexion

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;
 }
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal