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
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.
supongo RandomAccessFile está muy bien para este problema
RandomAccessFile debe hacerlo
- 1. Java: Acceso al archivo de propiedades dentro de una guerra
- 2. acceso al archivo usando Java con Samba JCIFS
- 3. acceso al archivo peek ahead
- 4. Ordenar un archivo grande en Java
- 5. RE: archivo XML grande
- 6. Java: Acceso a la subclase sin acceso al paquete
- 7. Acceso al archivo encriptado pgp en Ruby
- 8. Acceso al archivo local utilizando NSURL
- 9. ¿Tiempo de espera al cargar un archivo grande?
- 10. Java multihebra lectura de un único archivo grande
- 11. recortar archivo de registro grande
- 12. Para comprimir un archivo grande en un ZIP con Java
- 13. Error de acceso al subproceso no válido con Java SWT
- 14. ¿Tiene acceso al archivo en el archivo jar?
- 15. ERR_CONNECTION_RESET: la conexión se restableció al cargar un archivo grande
- 16. Escribir archivo grande
- 17. Procesando archivo xlsx grande
- 18. Error con NIO al intentar copiar un archivo grande
- 19. Escribiendo al comienzo de un archivo de texto Java
- 20. Nginx Sirviendo archivo grande estática
- 21. powershell obtener el número de líneas del archivo grande (grande)
- 22. Navegador, cargue el archivo grande
- 23. Consultas aleatorias en un archivo xml grande
- 24. Java: acceso al constructor privado con parámetros de tipo
- 25. Ruta de acceso al archivo en una Mac: FileNotFoundException
- 26. Acceso muti-threaded al mismo archivo de texto
- 27. Sin acceso al archivo/recurso de paquete (OSGi)
- 28. Google App Engine Carga de archivo grande
- 29. HTTP Descargar archivo muy grande
- 30. Alternativas al acceso
¿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? –
Edición para reflejar esto. –
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. –