Saltar al contenido

¿Cómo crear un nuevo java.io.File en la memoria?

No dejes de divulgar nuestro espacio y códigos en tus redes, necesitamos tu ayuda para hacer crecer nuestra comunidad.

Solución:

¿Cómo puedo crear un nuevo archivo (desde java.io) en la memoria, no en el disco duro?

Tal vez estas confundido File y Stream:

  • A File es una representación abstracta de archivo y directorio nombres de ruta. Usando un File objeto, puede acceder a los metadatos del archivo en un sistema de archivos y realizar algunas operaciones en archivos en este sistema de archivos, como eliminar o crear el archivo. Pero el File La clase no proporciona métodos para leer y escribir el contenido del archivo.
  • Para leer y escribir desde un archivo, está utilizando un Stream objeto, como FileInputStream o FileOutputStream. Estos flujos se pueden crear a partir de un File objeto y luego ser utilizado para leer y escribir en el archivo.

Puedes crear un flujo basado en un búfer de bytes que reside en la memoria, mediante el uso de un ByteArrayInputStream y un ByteArrayOutputStream para leer y escribir en un búfer de bytes de manera similar a leer y escribir desde un archivo. El byte array contiene el contenido del “Archivo”. no necesitas un File objeto entonces.

Ambos File... y el ByteArray... corrientes heredan de java.io.OutputStream y java.io.InputStream, respectivamente, para que pueda usar la superclase común para ocultar si está leyendo de un archivo o de un byte array.

No es posible crear un java.io.File que mantiene su contenido en la memoria (montón de Java) *.

En su lugar, normalmente usaría una secuencia. Para escribir en una secuencia, en la memoria, use:

OutputStream out = new ByteArrayOutputStream();
out.write(...);

Pero desafortunadamente, una transmisión no se puede usar como entrada para java.util.jar.JarFile, que como mencionas solo puede usar un File o un String que contiene la ruta a un JAR válido Archivo. Creo que usar un archivo temporal como lo hace actualmente es la única opción, a menos que desee usar una API diferente.

Si está de acuerdo con usar una API diferente, convenientemente hay una clase en el mismo paquete, llamada JarInputStream puedes usar. Simplemente envuelva su archiveContent array en un ByteArrayInputStream, para leer el contenido del JAR y extraer el manifiesto:

try (JarInputStream stream = new JarInputStream(new ByteArrayInputStream(archiveContent))) 
     Manifest manifest = stream.getManifest();


*) Obviamente, es posible crear un sistema de archivos completo que resida en la memoria, como un disco RAM, pero aún estaría “en el disco” (y no en la memoria del montón de Java) en lo que respecta al proceso de Java.

Podría usar un sistema de archivos en memoria, como Jimfs

Aquí hay un ejemplo de uso de su archivo Léame:

FileSystem fs = Jimfs.newFileSystem(Configuration.unix());
Path foo = fs.getPath("/foo");
Files.createDirectory(foo);

Path hello = foo.resolve("hello.txt"); // /foo/hello.txt
Files.write(hello, ImmutableList.of("hello world"), StandardCharsets.UTF_8);

Aquí puedes ver las comentarios y valoraciones de los usuarios

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *