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.
Résoudre ce problème nécessite une compréhension Classe InputStream de Java :
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.
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());
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 && 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; }
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!