Pregunta

Estoy buscando una forma eficiente de crear un archivo cuyo tamaño se desconozca, pero puede variar de mb a gb y llenar su contenido al azar. Puedo escribir los primeros 200 bytes que saltar al final y escribir los últimos 200 bytes y pasar al medio y escribir allí. ¿Es RandomAccessFile eficiente para hacer esto o hay alternativas más adecuadas para este tipo de trabajo?

¿Fue útil?

Solución

Sí, use RandomAccessFile : para eso está. Usted podría potencialmente usar un FileChannel , pero primero elegiría RandomAccessFile ; 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á saber el tamaño completo antes de escribir la sección final, básicamente. Una alternativa sería escribir secuencialmente, recordando el bit final hasta el final.

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

EDITAR: 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 que esto haya salido, file.dat tendrá una longitud de 101 bytes. (Tenga en cuenta que normalmente usaría probar / finalmente, etc.)

EDITAR: como se mencionó en los comentarios, setLength () también extenderá el archivo, pero también lo truncará si le da una longitud menor que el tamaño actual. Dado su comentario sobre básicamente escribir datos de torrent, sospecho que buscar y luego escribir es exactamente el comportamiento que desea. Cuando reciba un fragmento, solo busque el lugar correcto, escríbalo y el archivo se extenderá solo cuando sea necesario.

Otros consejos

RandomAccessFile debería hacerlo

Supongo que RandomAccessFile está bien para este problema

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top