Maison >Java >javaDidacticiel >Le InputStream de Java peut-il être lu avec un délai d'attente, et comment ?

Le InputStream de Java peut-il être lu avec un délai d'attente, et comment ?

DDD
DDDoriginal
2024-12-25 18:21:15313parcourir

Can Java's InputStream be Read with a Timeout, and How?

Les données peuvent-elles être lues à partir d'un InputStream avec un délai d'attente ?

La question est centrée sur le développement d'une méthode capable de lire à partir d'un InputStream dans un délai d'attente spécifié. Une telle méthode, MaybeRead, vise à renvoyer le même résultat que la méthode read() dans InputStream lorsque les données sont disponibles dans le temps imparti, ou -2 si aucune donnée n'est disponible. Le défi consiste à garantir que tous les threads générés sont terminés pendant l'exécution.

Limites de Java InputStream

Avant d'explorer des solutions potentielles, il est essentiel de reconnaître les limitations spécifiques de Java InputStream :

  1. read() peut être non-interruptible, empêchant les interruptions pendant les données récupération.
  2. L'emballage d'InputStream dans Reader ou InterruptibleChannel n'offre aucune solution car ils s'appuient uniquement sur les méthodes InputStream.
  3. available() peut légalement renvoyer 0, même lorsque des données sont présentes.
  4. close() peut bloquer ou n'avoir aucun effet.
  5. Aucun mécanisme inhérent n'existe pour mettre fin à d'autres threads.

Combattre les limitations

Utiliser InputStream.available()

Malgré la documentation indiquant que disponible () peut renvoyer 0, les preuves suggèrent qu'il fournit des estimations précises des données disponibles. Les sous-classes concrètes d'InputStream remplacent stratégiquement available() pour fournir des informations significatives.

Mises en garde spécifiques à la plate-forme

Windows/Cygwin : L'entrée n'est fournie que lorsque en appuyant sur "Retour". Sinon, InputStream.available() renvoie 0 comme prévu.

Solution simple (pas de blocage)

byte[] inputData = new byte[1024];
int result = is.read(inputData, 0, is.available());  // Reads as much data as immediately available

Solution complète (données maximales Acquisition)

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

Utilisation :

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

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