2009-06-23 17 views
5

Estoy buscando una forma eficiente de crear un archivo cuyo tamaño sea desconocido, pero puede variar de mb a gb y llenar su contenido aleatoriamente. Puedo escribir los primeros 200 bytes que saltar al final y escribir los últimos 200 bytes, moverme al centro y escribir allí. ¿Es RandomAccessFile eficiente para hacer esto o existen alternativas más adecuadas para este tipo de trabajo?Acceso de Java al archivo grande

Respuesta

10

Sí, use RandomAccessFile - eso es lo que está ahí. Usted podría utilizar potencialmente un FileChannel, pero yo iría por RandomAccessFile primero - es probable que sea más simple.

Tenga en cuenta que no podrá "insertar en el medio" del archivo después de escribir la parte final: no conozco ningún sistema de archivos que lo admita. Necesitarás saber el tamaño completo antes de escribir la sección final, básicamente. Una alternativa sería escribir secuencialmente, recordando el último bit hasta el final.

Si nos puede dar más información sobre lo que debe hacer (y cuando tenga información sobre el tamaño) podremos ayudarlo más.

EDIT: Para crear el archivo con un tamaño específico, puede seek() más allá del final y luego escribir datos:

import java.io.*; 

public class Test 
{ 
    // Just for the sake of a simple test program! 
    public static void main(String[] args) throws Exception 
    { 
     RandomAccessFile file = new RandomAccessFile("file.dat", "rw"); 

     file.seek(100); 
     file.write(0); 
     file.close(); 
    } 
} 

Después de esto ha salido, file.dat habrá 101 bytes de longitud. (Tenga en cuenta que normalmente usaría try/finally, etc.)

EDITAR: Como coobird mencionado en los comentarios, setLength() también extenderá el archivo, pero también truncará el archivo si proporciona una longitud menor que la actual tamaño. Dado su comentario sobre básicamente escribir datos de torrents, sospecho que buscar y luego escribir es exactamente el comportamiento que desea. Cuando reciba un fragmento, simplemente busque el lugar correcto, escríbalo y el archivo se extenderá cuando sea necesario.

+0

¿Hay una manera de crear archivos con un tamaño prefijado distinta de la iteración y la escritura de todos cero o uno de llenarlo? –

+0

Edición para reflejar esto. –

+0

Gracias, la razón por la que tengo que escribir partes al azar en el archivo, es que estoy implementando un cliente de torrent y las piezas llegarán a ubicaciones aleatorias en el archivo, pero sé de antemano cuál será el tamaño del archivo completo. –

1

supongo RandomAccessFile está muy bien para este problema

Cuestiones relacionadas