n Lesebytes atomar ohne Blockierung

stimmen
0

Ich fragte nur eine Frage , warum mein Thread heruntergefahren war nicht funktioniert. Es war dann aber wegen bis readLine()meinen Thread blockiert , bevor die Shutdown - Flag erkannt werden können. Das war einfach zu beheben indem Sie ready()vor dem Aufruf readLine().

Aber ich bin jetzt mit einer DataInputStreamder folgenden in Serie zu tun:

int x = reader.readInt();
int y = reader.readInt();
byte[] z = new byte[y]
reader.readFully(z);

Ich weiß , ich könnte meine eigene Pufferung implementieren , die die laufende Datei Flag würde überprüfen , während die Puffer geladen werden. Aber ich weiß , das ist sehr mühsam sein würde. Stattdessen könnte ich die Daten lassen im gepuffert werden InputStreamKlasse, und warten , bis ich meine haben nBytes lesen, bevor ein nicht-blockierenden Schreib- Ausführung - wie ich weiß , wie viel ich brauche zu lesen.

  • 4 Bytes für die erste Ganzzahl
  • 4 Bytes für die zweite Ganzzahl y
  • und yBytes für den zByte - Array.

Anstelle der Verwendung ready()eine Zeile im Puffer zu überprüfen , ob es ist, gibt es einige gleichwertig ready(int bytesNeeded)?

Veröffentlicht am 13/02/2020 um 22:00
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
0

Die available()Methode gibt die Anzahl der Bytes in dem InputStreaminternen Puffer.

So kann man so etwas wie:

while (reader.available() < 4) checkIfShutdown();
reader.readInt();
Beantwortet am 13/02/2020 um 22:19
quelle vom benutzer

stimmen
0

Sie können verwenden InputStream.available()eine Schätzung der Menge an Bytes zu erhalten , die gelesen werden können. Zitiert die Javadoc :

Gibt eine Schätzung der Anzahl der Bytes, die gelesen werden können (oder übersprungen) von diesem Eingabestrom, ohne zu blockieren, die 0 sein kann, oder 0, wenn Ende des Stroms festgestellt wird. Die Lese könnte auf dem gleichen Thread oder einen anderen Thread sein. Ein einzelner Lese- oder überspringt dieses viel Bytes wird nicht blockieren, aber weniger Bytes gelesen oder überspringt.

Mit anderen Worten, wenn available()Rückkehr n, wissen Sie sicher anrufen können , read(n)ohne zu blockieren. Beachten Sie, dass, wie die Javadoc Staaten, kehrte der Wert ist eine Schätzung. Zum Beispiel InflaterInputStream.available () wird immer 1 zurück , wenn EOF nicht erreicht wird. Überprüfen Sie die Dokumentation der InputStreamUnterklasse verwenden werden Sie um sicherzustellen , dass Ihre Bedürfnisse erfüllt.

Beantwortet am 13/02/2020 um 22:20
quelle vom benutzer

stimmen
0

Sie gehen zu müssen , Ihr eigenes Äquivalent implementieren BufferedInputStream. Entweder als alleiniger Eigentümer ein InputStreamund ein Gewinde (möglicherweise aus einem Pool entlehnt) zu blockieren in. Alternativ implementieren mit NIO.

Beantwortet am 13/02/2020 um 22:51
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more