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
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
Solution la plus simple (pas de blocage)
byte[] inputData = new byte[1024]; int result = is.read(inputData, 0, is.available());
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; }
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!