Lesing n bytes atomisk uten blokkering

stemmer
0

Jeg bare spurte et spørsmål om hvorfor min tråd nedstengning ikke virket. Det endte opp med å være på grunn av readLine()blokkering min tråd før stansen flagget kan bli gjenkjent. Dette var lett å fikse ved å sjekke ready()før du ringer readLine().

Men jeg nå bruker en DataInputStreamtil å gjøre følgende i serie:

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

Jeg vet jeg kunne gjennomføre min egen bufring som ville sjekke kjører filen flagg mens lasting opp bufferen. Men jeg vet at dette ville være kjedelig. I stedet, jeg kunne la dataene bufret i InputStreamklassen, og vente til jeg har mine nbytes lest, før du utfører en ikke-blokkerende lese - jeg vet hvor mye jeg trenger å lese.

  • 4 bytes for den første heltall
  • 4 bytes for det andre heltall y
  • og ybyte for zbyte array.

I stedet for å bruke ready()for å sjekke om det er en linje i buffer, er det noen tilsvarende ready(int bytesNeeded)?

Publisert på 14/02/2020 klokken 00:00
kilden bruker
På andre språk...                            


3 svar

stemmer
0

Den available()metoden returnerer mengden av byte i den InputStreaminterne bufferen.

Så kan man gjøre noe sånt som:

while (reader.available() < 4) checkIfShutdown();
reader.readInt();
Svarte 14/02/2020 kl. 00:19
kilden bruker

stemmer
0

Du kan bruke InputStream.available()for å få et overslag over hvor mye bytes som kan leses. Siterer den Javadoc :

Returnerer et estimat over antall byte som kan avleses (eller hoppes over) fra denne input stream uten blokkering, som kan være 0, eller 0 når slutten av datastrømmen blir detektert. Lese kan være på samme tråd eller en annen tråd. En enkelt lese eller hoppe over dette mange byte vil ikke blokkere, men kan lese eller hoppe færre bytes.

Med andre ord, hvis available()avkastning n, vet du at du kan trygt kalle read(n)uten å blokkere. Legg merke til at, som javadoc stater, er den returnerte verdien et estimat. For eksempel, InflaterInputStream.available () vil alltid returnere en hvis EOF ikke er nådd. Sjekk dokumentasjonen av InputStreamunderklassen du skal bruke for å sikre at det oppfyller dine behov.

Svarte 14/02/2020 kl. 00:20
kilden bruker

stemmer
0

Du kommer til å trenge å implementere din egen tilsvarende BufferedInputStream. Enten som en eneste eier av en InputStreamog en tråd (muligens lånt fra en pool) for å blokkere i. Alternativt kan gjennomføre med NIO.

Svarte 14/02/2020 kl. 00:51
kilden bruker

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