2010-09-25 27 views
10

¿Cómo puedo buscar (cambiar la posición) de un ByteArrayInputStream (java.io)? Es algo tan obvio, pero parece que no puedo encontrar un método para esto en cualquier lugar (mark/reset no es suficiente, necesito establecer la posición en cualquier lugar en el InputStream).Buscando un ByteArrayInputStream usando java.io

Si no se puede hacer usando java.io y tengo que cambiar a java.nio y utilizar un ByteBuffer, ¿cómo puedo obtener algo similar a un DataOutputStream envolver una ByteArrayOutputStream usando java.nio? No encuentro ningún tipo de búfer de tamaño variable.

EDIT: He encontrado una manera de lograr lo que estoy intentando hacer, pero es un poco complicado. ImageIO.createImageInputStream crea un ImageInputStream, que es exactamente lo que quiero (puede buscar y leer primitivas). Sin embargo, el uso de ByteArrayInputStream devuelve FileCacheImageInputStream, lo que básicamente significa que copia la matriz de bytes en un archivo solo para buscar.

Esta es la primera vez que trato de utilizar las clases Java IO y ha sido completamente negativo. Le faltan algunos (OMI) características fundamentales, y tiene un montón de maneras de hacer lo mismo (por ejemplo, para leer componentes a partir de un archivo que puede utilizar RandomAccessFile, DataInputStream + FileInputStream, FileImageInputStream, FileChannel + ByteBuffer, y tal vez incluso más).

+0

¿Ve algún problema con el uso de 'seek'? –

+4

@Vilay Mathew: ¿Qué método 'seek'? No veo ninguno en ByteArrayInputStream. – asdfghjkl

+0

Archivo i/o en java es un gran desastre. Se lo enseño a los estudiantes de primer año y trato de hacerlo simple, pero siempre es un punto de confusión. – Fixee

Respuesta

8

Utilizaría reset()/skip(). No puedo decir que es el mejor API en el mundo, pero debería funcionar:

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

Por supuesto, esto supone que nadie ha llamado mark().

+0

si no se llama la marca, entonces el valor predeterminado de la posición marcada es 0, por lo que el restablecimiento de llamada mueve el puntero a 0 y luego la función de omisión mueve el puntero a la posición dada –

+0

@SumitKumarSaha: Sí ... No estoy seguro del punto de tu comentario. –

+0

Solo estaba sumando tu respuesta –

1

Hay un constructor ByteArrayInputStream(byte(), int, int) que le dará un flujo de entrada que leerá hasta un conteo dado de bytes a partir de un desplazamiento dado. Puede usar esto para simular la búsqueda de un desplazamiento arbitrario en la secuencia.

Tienes que lidiar con el hecho de que "buscar" te da un nuevo objeto de transmisión, y esto puede ser incómodo. Sin embargo, este enfoque no implica copiar ningún byte ni guardarlo en un archivo, y debería ser seguro no molestarse en cerrar los objetos ByteArrayInputStream.

4

Si va a crear el ByteArrayInputStream para pasar a otra parte, ampliar la clase y manipular pos (un miembro de protectedByteArrayInputStream) como desee.