Čtení n bajty atomicky bez blokování

hlasů
0

Jen jsem položil otázku o tom, proč má závit vypínání nefunguje. To skončilo bytí kvůli readLine()blokování mé vlákno před vypnutí vlajka mohla být uznána. To bylo snadné opravy kontrolou ready()před voláním readLine().

Nicméně, já jsem teď s použitím DataInputStreamprovést následující v sérii:

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

Vím, že jsem mohl realizovat svůj vlastní ukládání do vyrovnávací paměti, která by kontrolovat systémem souborů vlajku při načítání do vyrovnávací paměti. Ale vím, že by to bylo únavné. Místo toho můžu nechat data ukládat do vyrovnávací paměti v rámci InputStreamtřídy, a počkejte, až mám moji nbytů číst, před provedením non-blocking číst - protože vím, jak moc je třeba číst.

  • 4 bajtů pro první celé číslo
  • 4 bajtů pro druhý celé číslo y
  • a ybajtů pro zbytového pole.

Namísto použití ready()ke kontrole, zda je řádek ve vyrovnávací paměti, je tam nějaký ekvivalent ready(int bytesNeeded)?

Položena 14/02/2020 v 00:00
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
0

available()Metoda vrací počet bajtů v InputStreamy vnitřní vyrovnávací paměti.

Tak, jeden může udělat něco jako:

while (reader.available() < 4) checkIfShutdown();
reader.readInt();
Odpovězeno 14/02/2020 v 00:19
zdroj uživatelem

hlasů
0

Můžete použít InputStream.available()získat odhad množství bytů, které lze číst. Cituji na Javadoc :

Vrátí odhad počtu bytů, které lze číst (nebo přeskočen) od tohoto vstupního proudu bez blokování, což může být 0, nebo 0, když je detekován konec proudu. Čtecí může být na stejném nití nebo jiném vlákně. Jeden čtení nebo přeskočit na toto mnoho bytů nebude blokovat, ale může číst nebo přeskočit menší počet bajtů.

Jinými slovy, pokud available()se vrátí n, víte, že můžete bezpečně volat read(n)bez blokování. Všimněte si, že jako JavaDoc států, návratová hodnota je odhad. Například InflaterInputStream.available () vždy vrátí hodnotu 1, pokud není dosaženo EOF. Zkontrolujte dokumentaci k InputStreampodtřídy, které budete používat, aby bylo zajištěno, že splňuje vaše potřeby.

Odpovězeno 14/02/2020 v 00:20
zdroj uživatelem

hlasů
0

Budete muset implementovat svůj vlastní ekvivalent BufferedInputStream. A to buď jako jediný vlastník InputStreama závitem (případně vypůjčených z fondu) pro zablokování v. Případně provést pomocí NIO.

Odpovězeno 14/02/2020 v 00:51
zdroj uživatelem

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