2010-09-25 5 views
10

Come è possibile cercare (modificare la posizione) di un ByteArrayInputStream (java.io)? È qualcosa di ovvio, ma non riesco a trovare un metodo per questo ovunque (mark/reset non è abbastanza, ho bisogno di impostare la posizione in qualsiasi punto del InputStream).Ricerca di un ByteArrayInputStream utilizzando java.io

Se non può essere fatto utilizzando java.io e devo passare a java.nio e utilizzare un ByteBuffer, come posso ottenere qualcosa di simile a un DataOutputStream avvolgendo un ByteArrayOutputStream utilizzando java.nio? Non sto trovando alcun tipo di buffer auto-ridimensionabile.

MODIFICA: Ho trovato un modo per ottenere ciò che sto tentando di fare, ma è un po 'caotico. ImageIO.createImageInputStream crea un ImageInputStream, che è esattamente quello che voglio (può cercare e leggere le primitive). Tuttavia, l'utilizzo di un ByteArrayInputStream restituisce un FileCacheImageInputStream, che in pratica significa che copia l'array di byte in un file solo per cercare.

Questa è la prima volta che cerco di utilizzare le classi di I/O Java ed è stato completamente negativo. E 'mancano alcune caratteristiche fondamentali (IMO), e ha un sacco di modi per fare la stessa cosa (per esempio per leggere le primitive da un file è possibile utilizzare RandomAccessFile, DataInputStream + FileInputStream, FileImageInputStream, FileChannel + ByteBuffer, e forse anche di più).

+0

si vede qualche problema con l'uso di 'seek'? –

+4

@Vilay Mathew: Che metodo 'seek'? Non vedo nessuno su ByteArrayInputStream. – asdfghjkl

+0

I/o file in java è un enorme pasticcio. Lo insegno agli studenti del primo anno e cerco di renderlo semplice, ma è sempre un punto di confusione. – Fixee

risposta

8

Utilizzare reset()/skip(). Non posso dire che è l'API più bella del mondo, ma dovrebbe funzionare:

public void seek(ByteArrayInputStream input, int position) 
    throws IOException 
{ 
    input.reset(); 
    input.skip(position); 
} 

Naturalmente, questo presuppone che nessuno ha chiamato mark().

+0

se il contrassegno non viene chiamato, il valore predefinito della posizione contrassegnata è 0, quindi la chiamata reset sposta il puntatore su 0 e quindi salta la funzione sposta il puntatore sulla posizione data –

+0

@SumitKumarSaha: Sì ... Non sono sicuro del punto di il tuo commento. –

+0

Stavo solo aggiungendo la tua risposta –

1

C'è un costruttore ByteArrayInputStream(byte(), int, int) che fornirà un flusso di input che leggerà fino a un determinato numero di byte a partire da un dato offset. È possibile utilizzare questo per simulare la ricerca di un offset arbitrario nel flusso.

Hai a che fare con il fatto che "cercare" ti dà un nuovo oggetto flusso, e questo può essere imbarazzante. Tuttavia, questo approccio non implica la copia di byte o il loro salvataggio in un file, e dovrebbe essere sicuro di non preoccuparsi di chiudere gli oggetti ByteArrayInputStream.

4

se si sta creando il ByteArrayInputStream di passare altrove, estendere la classe e manipolare pos (un membro protected di ByteArrayInputStream) come si desidera.