Heim >Java >javaLernprogramm >Wie kann ich mit einem Timeout aus einem Java InputStream lesen?

Wie kann ich mit einem Timeout aus einem Java InputStream lesen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-19 22:12:10220Durchsuche

How Can I Read from a Java InputStream with a Timeout?

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

  1. InputStream.read() kann nicht unterbrechbar sein.
  2. Mit einem Reader oder InterruptibleChannel hilft nicht.
  3. InputStream.available() kann immer 0 zurückgeben.
  4. InputStream.close() kann blockieren oder nichts tun.
  5. Es gibt keinen allgemeinen Weg um einen anderen Thread zu beenden.

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

  1. Stellen Sie sicher, dass Sie beim Eingeben von Eingaben in Windows den Wagenrücklauf verwenden.
  2. InputStream.available() gibt 0 zurück, bis Daten vom verfügbar sind Shell.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn