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

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

Barbara Streisand
Barbara Streisandoriginal
2024-12-14 03:08:17861parcourir

How to Read from a Java InputStream with a Timeout?

Lecture à partir d'un InputStream avec un Timeout

Des problèmes spécifiques nécessitent des solutions sur mesure. Cette question cherche à construire une méthode qui récupère les données d'un InputStream dans le délai imparti, échouant gracieusement avec un code d'erreur en cas de dépassement.

Considérations spécifiques au InputStream de Java

Résoudre ce problème nécessite une compréhension Classe InputStream de Java :

  • Sa méthode read() ne peut pas être généralement interrompu.
  • L'encapsulation d'InputStream dans les classes Reader ou InterruptibleChannel n'étend pas les options disponibles.
  • available() peut renvoyer 0 à tout moment.
  • close() peut bloquer ou ne rien faire.
  • Terminer un autre fil de discussion sans condition n'est pas possible.

Vérification de la disponibilité des entrées avec available()

Contrairement à ce qui est affirmé dans l'énoncé du problème, InputStream.available() ne renvoie pas toujours 0. Il fournit une estimation de facilement données disponibles sans blocage. Cependant, il peut sous-estimer le nombre réel de données.

La solution la plus basique

Cette approche simple n'impose aucune contrainte de blocage ou de délai d'attente :

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

Timeout-Aware Solution

Pour un contrôle plus précis, une méthode peut remplir un tampon avec les données disponibles dans un délai spécifié timeout :

public static int readInputStreamWithTimeout(InputStream is, byte[] b, int timeoutMillis)
     throws IOException  {
     int bufferOffset = 0;
     long maxTimeMillis = System.currentTimeMillis() + timeoutMillis;
     while (System.currentTimeMillis() < maxTimeMillis &amp;&amp; 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;
 }

Utilisation de la solution

byte[] inputData = new byte[1024];
int readCount = readInputStreamWithTimeout(System.in, inputData, 6000);  // 6 second timeout

Cela fournit un moyen de lire à partir d'un InputStream avec un délai d'attente pour les sources d'entrée bloquantes et non bloquantes.

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