Spostare i byte attraverso un buffer di dimensioni fisse

4

Sto scrivendo un InputStream che elabora i flussi di dati contenenti dati "trailer". Cioè, il finale n byte dello stream è un pezzo di dati che deve essere gestito separatamente e non deve essere restituito dai metodi read .

La mia classe manterrà un array di byte interno di lunghezza n e leggerà i dati in questo array di byte dal flusso sottostante. I dati verranno quindi estratti dalla parte anteriore del buffer per soddisfare le richieste in read .

L'implementazione del metodo int read() è abbastanza semplice: chiamo solo lo stesso metodo sul flusso sottostante, sposto il mio array di byte di 1 e sposto il risultato al chiamante.

L'implementazione di int read(byte[] b) è più impegnativa in quanto richiede lo spostamento di un numero elevato di byte attraverso il mio buffer n , mentre scoppiettando e confrontando i byte dal lato anteriore. Essenzialmente un buffer "sliding window", contenente sempre gli ultimi n byte dal mio stream sottostante.

Ho la sensazione di re-inventare la ruota se inizio a codificarla da zero. Qualcuno può suggerire di ignorare un'implementazione InputStream o Queue che sarebbe adatta a questa attività?

    
posta Duncan Jones 29.04.2013 - 08:41
fonte

2 risposte

2

Utilizza un buffer ad anello di dimensioni n. Suppongo che non ci sia un'implementazione già pronta, ma non è così complicato da fare da solo. Poiché si intende conservare n byte in ogni momento, dopo l'inizializzazione non è necessario preoccuparsi che il buffer sia parzialmente riempito (quindi probabilmente è necessario un solo puntatore di lettura / scrittura, anziché un puntatore di lettura e un puntatore di scrittura). Leggere k byte è semplice:

  • Copia i k byte seguendo il puntatore r / w sul buffer di output (caso speciale k = 1 per read() ).
  • Legge k byte dal flusso sottostante e regola il puntatore r / w.

Quando lo stream sottostante si esaurisce, avrai una matrice di elementi n con gli ultimi n byte a partire dal puntatore r / w. Anche questo è estremamente veloce - non c'è bisogno di spostare interi array attorno. Uno svantaggio è che l'elaborazione del trailer non è così banale come se fosse un array (ma ancora semplice).

    
risposta data 29.04.2013 - 16:07
fonte
0

Non spostare il buffer, non è una coda collegata. Utilizzare un numero intero come indice, che si incrementa man mano che si leggono i dati. Quando l'indice è uguale alla lunghezza dell'array di byte, leggi più dati.

    
risposta data 29.04.2013 - 13:38
fonte

Leggi altre domande sui tag