Reading n bájt atomically nélkül blokkoló

szavazat
0

Csak egy kérdést, hogy miért én menet leállt nem működött. Ez végül is köszönhetően readLine()blokkolja a menet előtt a leállás zászló lehetett ismerni. Ez könnyű volt fix ellenőrzésével ready()hívás előtt readLine().

Azonban én most egy DataInputStreamcsinálni a következő sorba:

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

Tudom, én is végre saját pufferelés amely ellenőrzi a futó fájl zászló betöltése közben fel a puffert. De tudom, hogy ez unalmas lenne. Ehelyett azt tudta engedni az adatokat kell pufferelt belül InputStreamosztályban, és várjon, amíg ott van a nbeolvasott bájtok teljesítését megelőzően a nem-blokkoló - olvasható tudom, mennyire kell olvasni.

  • 4 byte az első egész
  • 4 byte a második egész y
  • és ybyte az zbyte tömböt.

Ahelyett, hogy a ready(), hogy ellenőrizze, ha van egy vonal a puffer, van-e valamilyen egyenértékű ready(int bytesNeeded)?

A kérdést 14/02/2020 00:00
a forrás felhasználó
Más nyelveken...                            


3 válasz

szavazat
0

A available()módszer visszaadja a bájtok mennyisége a InputStreambelső puffer.

Szóval, lehet tenni valamit, mint például:

while (reader.available() < 4) checkIfShutdown();
reader.readInt();
Válaszolt 14/02/2020 00:19
a forrás felhasználó

szavazat
0

Használhatja InputStream.available(), hogy becslést az adatmennyiség, amely olvasható. Idézve a Javadoc :

Visszaadja egy becslést a bájtok számát, amely olvasható (vagy átugorja) ettől a bemeneti folyam blokkolása nélkül, amely lehet 0, vagy 0, ha vége adatfolyam észlel. Az olvasási lehet ugyanazon a szál, vagy egy másik szál. Egy olvasási vagy hagyja ennyi bájt nem fogja blokkolni, de olvasni, vagy hagyja kevesebb adatforgalmat.

Más szóval, ha available()visszatér n, akkor tudja, hogy biztonságosan hívja read(n)blokkolása nélkül. Megjegyezzük, hogy a Java dokumentáció kimondja, a visszaadott érték egy becslés. Például InflaterInputStream.available () mindig vissza 1, ha EOF nem éri el. Nézd meg a dokumentációt az InputStreamalosztály fog használni annak érdekében, hogy megfeleljen az Ön igényeinek.

Válaszolt 14/02/2020 00:20
a forrás felhasználó

szavazat
0

Ön lesz szüksége, hogy végre a saját megfelelője BufferedInputStream. Akár mint egyedüli tulajdonosa egy InputStreamés egy szál (esetleg kölcsön egy pool), hogy blokkolja. Alternatívaként hajtsák végre NIO.

Válaszolt 14/02/2020 00:51
a forrás felhasználó

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