2012-03-04 11 views
6

Estoy tratando de escribir una función que tome los parámetros Objeto de archivo, desplazamiento y matriz de bytes y escriba esa matriz de bytes en un objeto Archivo en Java.Java OutputStream Omitir (desplazamiento)

Así que la función se vería como

public void write(File file, long offset, byte[] data) 

Pero el problema es que el parámetro de desplazamiento es de tipo largo, por lo que no se puede utilizar la función de escritura() de OutputStream, que tiene número entero como una compensación.

A diferencia de InputStream, que tiene omisión (larga), parece que OutputStream no tiene forma de omitir los primeros bytes del archivo.

¿Hay una buena manera de resolver este problema?

Gracias.

+0

El número más grande que puede poner en un 'int' es 2.147.483.647. ¿Las matrices que desea escribir son más grandes que + - 2GB? –

+0

Solo para aclarar: el desplazamiento solo se aplica a la posición en * matriz *, no a la secuencia de salida, ¿verdad? Con un OutputStream no puede omitir posiciones. –

+0

@El offset de tinta se refiere al desplazamiento desde el principio del archivo, no desde el comienzo de la matriz. Y a menos que esté utilizando FAT como sistema de archivos, puede tener archivos de más de 2 GB. – Dunes

Respuesta

11
try { 
    FileOutputStream out = new FileOutputStream(file); 
    try { 
     FileChannel ch = out.getChannel(); 
     ch.position(offset); 
     ch.write(ByteBuffer.wrap(data)); 
    } finally { 
     out.close(); 
    } 
} catch (IOException ex) { 
    // handle error 
} 
4

Tiene que ver con la semántica de las transmisiones. Con un flujo de entrada, solo está diciendo que está descartando los primeros n bytes de datos. Sin embargo, con un OutputStream, algo debe escribirse en la transmisión. No se puede simplemente pedir que la secuencia pretenda n bytes de datos se escribieron, pero en realidad no se escriben. La razón de esto es porque no todas las secuencias serán buscables. Los datos que llegan a través de una red no se pueden buscar; usted obtiene los datos una sola vez. Sin embargo, esto no es así con los archivos porque están almacenados en un disco duro y es fácil de buscar en cualquier posición en el disco duro.

Solución: Utilice FileChannels o RandomAccessFile insteead.

1

Si desea escribir al final del archivo a continuación, utilizar el modo de adición (FileOutputStream (String nombre, append booleano)). En mi humilde opinión, debería haber un método de omisión en FileOutputStream, pero por ahora, si quieres viajar a una ubicación específica en un archivo para escribir, entonces debes usar FileChannel o RandomAccessFile (como era mencionado por otros).

Cuestiones relacionadas