2011-02-04 20 views
11

Necesito reemplazar el código usando RandomAccessFile con uno que usa memoria intermedia de bytes en la memoria (como byte[] o derivados como ByteArrayInputStream). ¿Hay alguna API (contenedor de matriz de bytes?) Que tenga una interfaz similar a RandomAccessFile, con seek() y que genere read() que podría conectar uno a uno.API de tipo RandomAccessFile para matriz de bytes en memoria?

+0

A menos que necesite escribir también, 'DataInputStream' se puede envolver fácilmente para proporcionar la funcionalidad' seek() 'y el resto ya está allí. No es una solución perfecta, pero si todo lo demás falla, es relativamente fácil de implementar. – biziclop

+1

¿Se puede usar un archivo temporal en su lugar? – finnw

Respuesta

9

ByteArrayInputStream puede hacerlo:

  • read() funciona de la misma.
  • seek(n) se puede sustituir por reset() seguido por skip(n)
+1

Sí, pero deberá introducir una nueva interfaz que tenga ambos métodos 'read()' y 'seek()'. Ninguna interfaz de E/S Java existente (nueva o antigua) tiene dicha interfaz. Una vez que tenga esta interfaz, tendrá que crear dos implementaciones: una que use 'RandomAccessFile' y otra que use' ByteArrayInputStream'. –

3

puedo sugerir Java NIO (Nueva E/S) check this simple y pequeño tutorial

+0

También es bueno, pero tiene la desventaja de que la interfaz es bastante diferente de RandomAccessFile. Al construir sobre DataInputStream, se obtiene algo que implementa DataInput, y el código que usa RandomAccessFile como DataInput no necesita ser cambiado. – joriki

+0

joriki, 'DataInput' no proporciona' seek() ', por lo que un' RandomAccessFile' que se pasa a un método que espera un 'DataInput' no será muy buscable. –

0

que tenía el mismo problema. RandomAccessFile tiene muchos métodos finales y nativos, por lo que no se puede sobrecargar.

Terminé para crear mi propia clase abstracta SeekableInputStream por el robo de éste sin readfully: https://github.com/samtools/htsjdk/blob/master/src/java/htsjdk/samtools/seekablestream/SeekableStream.java

he definido SeekableFileInputStream que utiliza RandomAccessFile.

Definí SeekableByteArrayInputStream, que es fácil de definir. Esta clase, también es capaz de obtener cualquier InputStream, para transformarlo en una matriz de bytes, por lo que este es un tipo de transmisión en caché.

Cuestiones relacionadas