2010-06-12 8 views

Respuesta

10

No, tendrá que ajustar el tamaño del archivo subyacente y volver a crear el búfer de bytes asignados de memoria.

RandomAccessFile file = new RandomAccessFile(/* some file */); 
MappedByteBuffer buffer = file.getChannel().map(MapMode.READ_WRITE, 0, file.length()); 

// Some stuff happens... 

// adjust the size 
file.setLength(newLength); 

// recreate the memory mapped buffer 
buffer = file.getChannel().map(MapMode.READ_WRITE, 0, file.length()); 

Nota: Establecer la longitud del archivo tiene un comportamiento algo extraño. Si escribe en el archivo a través del mapa en una posición específica que está más allá del final del archivo (ya sea usando map.position() o map.putX (position, ...)) los valores se agregarán al final de el archivo y no escrito en la posición que espera (al menos en Linux). Si se trata de un comportamiento no deseado, deberá anexar datos al archivo para que realmente crezca el archivo.

+0

¿Podría explicar el comportamiento extraño en otras palabras? ¿No se espera que se agregue al final del archivo si escribo más allá del final (a través del búfer asignado asumiendo que mapea el tamaño del archivo completo)? – geeko

+1

Comience con un archivo de 50 bytes de tamaño. Llame a setLength (1000) para aumentar el tamaño del archivo. A continuación, cree un nuevo mapa a partir del archivo (file.getChannel(). Map (..., 0, 1000). Si en el nuevo MappedByteBuffer llama a putByte (500, (byte) 'x'), el valor 'x' aparecerá aparece como el byte número 50 en el archivo (índice basado en 0) no en la posición 500 (quizás no es extraño, pero es un comportamiento potencialmente inesperado). –

+0

puedo ver lo que quiere decir. gracias michael. – geeko

Cuestiones relacionadas