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 unFile
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 elFile
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, comoFileInputStream
oFileOutputStream
. Estos flujos se pueden crear a partir de unFile
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);