Leggere n byte atomicamente senza blocco

voti
0

Ho appena fatto una domanda sul perché il mio thread spegnimento non funzionava. E 'finito per essere a causa di readLine()bloccare il mio thread prima che potesse essere riconosciuta la bandiera di arresto. Questo è stato facile da risolvere controllando ready()prima di chiamare readLine().

Tuttavia, ora sto usando un DataInputStreamper effettuare le seguenti operazioni in serie:

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

So che potrei realizzare il mio buffer che controllare il flag di file in esecuzione durante il caricamento del buffer. Ma so che questo sarebbe noioso. Invece, ho potuto lasciare che i dati essere memorizzate all'interno della InputStreamclasse, e attendere che ho i miei nbyte leggere, prima di eseguire un non-blocking leggere - come io so quanto ho bisogno di leggere.

  • 4 byte per il primo intero
  • 4 byte per il secondo intero y
  • e ybyte per il zbyte.

Invece di utilizzare ready()per verificare se v'è una linea nel buffer, c'è qualche equivalente ready(int bytesNeeded)?

È pubblicato 14/02/2020 alle 00:00
fonte dall'utente
In altre lingue...                            


3 risposte

voti
0

Il available()metodo restituisce la quantità di byte nel InputStreambuffer interno s.

Quindi, si può fare qualcosa di simile:

while (reader.available() < 4) checkIfShutdown();
reader.readInt();
Risposto il 14/02/2020 a 00:19
fonte dall'utente

voti
0

È possibile utilizzare InputStream.available()per ottenere una stima della quantità di byte che possono essere letti. Citando Javadoc :

Restituisce una stima del numero di byte che possono essere letti (o saltati) da questo flusso di input senza bloccare, che può essere 0 o 0 quando viene rilevata fine del flusso. La lettura potrebbe essere sullo stesso filo o altro thread. Una singola lettura o saltare questo molti byte non bloccherà, ma può leggere o ignorare meno byte.

In altre parole, se available()i rendimenti n, si sa che si può chiamare in tutta sicurezza read(n)senza bloccare. Si noti che, come afferma il Javadoc, il valore restituito è una stima. Ad esempio, InflaterInputStream.available () restituisce sempre 1 se EOF non viene raggiunto. Controllare la documentazione della InputStreamsottoclasse che verrà utilizzato per garantire che soddisfi le vostre esigenze.

Risposto il 14/02/2020 a 00:20
fonte dall'utente

voti
0

Si sta andando ad avere bisogno di implementare il proprio equivalente di BufferedInputStream. Sia come unico proprietario di un InputStreame un filo (possibilmente mutuato da un pool) per bloccare in. In alternativa, implementare con NIO.

Risposto il 14/02/2020 a 00:51
fonte dall'utente

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