Maison >Java >javaDidacticiel >Le InputStream de Java peut-il être lu avec un délai d'attente, et comment ?
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 :
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!