Heim >Java >javaLernprogramm >Wie kann ich mit einem Timeout aus einem Java InputStream lesen?
Lesen aus einem InputStream mit Timeout
Ist es möglich, aus einem InputStream zu lesen und ein Timeout anzugeben? Ja, aber es ist nicht so einfach, wie es scheint. Die Methode InputStream.read() ist möglicherweise nicht unterbrechbar und die Methode InputStream.available() gibt möglicherweise 0 zurück, selbst wenn Daten verfügbar sind.
Fakten, die durch die Dokumentation von Sun unterstützt werden
Verwenden InputStream.available()
InputStream.available() sollte eine Schätzung der Anzahl der Bytes zurückgeben, die ohne Blockierung zum Lesen verfügbar sind. Es ist jedoch wichtig zu beachten, dass Unterklassen für das Überschreiben dieser Methode verantwortlich sind. In der Praxis stellen konkrete Eingabestreamklassen sinnvolle Werte für available() bereit.
Vorbehalte
Einfachste Lösung (keine Blockierung)
byte[] inputData = new byte[1024]; int result = is.read(inputData, 0, is.available());
Reichhaltigere Lösung (maximiert die Pufferfüllung innerhalb des Timeouts)
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; }
Das obige ist der detaillierte Inhalt vonWie kann ich mit einem Timeout aus einem Java InputStream lesen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!