tutorial java io stream nio

tutorial - Buscando un ByteArrayInputStream usando java.io



java nio tutorial (3)

Hay un constructor ByteArrayInputStream(byte(), int, int) que le dará una secuencia 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 .

¿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 ).

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

EDITAR: He encontrado una forma de lograr lo que intento 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 un ByteArrayInputStream devuelve un FileCacheImageInputStream , que básicamente significa que copia el conjunto de bytes en un archivo solo para buscar.

Esta es la primera vez que trato de usar las clases Java IO y ha sido completamente negativo. Le faltan algunas características fundamentales (IMO), y tiene muchas formas de hacer lo mismo (por ejemplo, para leer primitivas de un archivo puede usar RandomAccessFile , DataInputStream + FileInputStream , FileImageInputStream , FileChannel + ByteBuffer , y tal vez incluso más).


Si está creando ByteArrayInputStream para pasar a otra parte, amplíe la clase y manipule pos (un miembro protected de ByteArrayInputStream ) como desee.


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

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

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