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
Freigeben: 2024-12-19 22:12:10
Original
217 Leute haben es durchsucht

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());
Nach dem Login kopieren

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;
 }
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage