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

6 minutos de lectura

¿Cómo puedo crear nuevos File (de java.io) en la memoria, no en el disco duro?

Estoy usando el lenguaje Java. No quiero guardar el archivo en el disco duro.

Me enfrento a una mala API (java.util.jar.JarFile). esta esperando File file de String filename. No tengo archivo (solo byte[] content) y puede crear un archivo temporal, pero no es una solución hermosa. Necesito validar el resumen de un frasco firmado.

byte[] content = getContent();
File tempFile = File.createTempFile("tmp", ".tmp");
FileOutputStream fos = new FileOutputStream(tempFile);
fos.write(archiveContent);
JarFile jarFile = new JarFile(tempFile);
Manifest manifest = jarFile.getManifest();

Cualquier ejemplo de cómo lograr obtener el manifiesto sin crear un archivo temporal sería apreciado.

  • Entonces, ¿solo quieres bytes en la memoria?

    – Sotirios Delimanolis

    11 de julio de 2013 a las 13:46


  • ¿Qué estás tratando de hacer con este File?

    – Jon Skeet

    11 de julio de 2013 a las 13:46

  • A File por definición está en el disco duro.

    – Uwe Plonus

    11 de julio de 2013 a las 13:47

  • @UwePlonus no… new File("/dev/null")

    – fge

    11 de julio de 2013 a las 13:48

  • Wow, la falta de imaginación en StackOverflow es asombrosa. Alguien podría necesitar un archivo en memoria simple porque está usando una interfaz que requiere un archivo. La interfaz debería haberse escrito para un InputStream, pero no fue así. Un archivo temporal parece excesivo, por lo que sería preferible un archivo java.io.File en memoria.

    – Novaterata

    17/04/2019 a las 21:00


avatar de usuario
andreas fester

¿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 memoriamediante 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. los byte matriz 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.InputStreamrespectivamente, para que pueda usar la superclase común para ocultar si está leyendo desde un archivo o desde una matriz de bytes.

  • No estoy seguro de si esto es lo que quería el cartel original, pero un ejemplo en el que un “Archivo en la memoria” sería útil es cuando desea reutilizar una biblioteca existente que necesita un java.io.File como parámetro de entrada, pero usted realmente quiere usar “archivos” almacenados en la memoria. En ese caso, creo que una solución sería usar Apache Commons VFS para crear una instancia de DefaultFileSystemManager y usarlo para crear un RamFileProvider. Habría agregado esto como una respuesta adecuada (más completa), pero parece que esta pregunta se cerró hace algún tiempo …

    – Sorin Postelnicu

    18 de diciembre de 2013 a las 16:54

  • +1 Estaba buscando este tipo de solución, para probar la unidad del componente sin tener que usar un archivo real

    – Gclaramunt

    20 de diciembre de 2013 a las 14:10

  • Si no desea crear “un archivo real”, puede intentar crear un archivo temporal. Ver createTempFile por java.io.file. Este archivo se puede configurar para que se elimine automáticamente cuando finaliza la prueba unitaria.

    – Andrew Dufresne

    16 de agosto de 2014 a las 0:37

  • Esto no responde la pregunta. Como bien dijo @SorinPostelnicu, un “Archivo” en la memoria es algo así como un Sistema de archivos en la memoria más o menos.

    – Felipe

    3 de septiembre de 2014 a las 3:09

  • OP definitivamente NO confunde archivos y transmisiones. Piensa que quiere usar jarFile para leer un archivo y todo lo que tiene son los bytes de alguna fuente (getContent()).

    – Zweibieren

    25/10/2018 a las 21:20

avatar de usuario
Harald K.

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.JarFileque como mencionas solo puede usar un File o un String que contiene la ruta a un JAR válido expediente. 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 matriz en un ByteArrayInputStreampara 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.

  • Esto no responde a la pregunta ya que ByteArrayOutputStream no se puede usar con una interfaz que requiere un objeto de archivo.

    – Fábula Blaze

    17 de enero de 2020 a las 12:04

  • @FableBlaze Bueno, entonces la respuesta a la pregunta es “no es posible”. Esta respuesta intenta ser pragmática y decir qué podría hacer el usuario en su lugar. La respuesta de Andreas es claramente más completa y una mejor (intento de) respuesta.

    – Harald K.

    17 de enero de 2020 a las 12:11

  • “No es posible” sería una respuesta válida en mi opinión. Sin embargo, creo que también podría mencionarse un sistema de archivos en memoria (mencionado en los comentarios de la respuesta de Andreas), porque si por algún motivo no puede escribir en el disco duro, esa podría ser una forma de evitarlo.

    – Fábula Blaze

    17 de enero de 2020 a las 12:19


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);

  • Jimfs no admite File objeto

    – píxel

    2 de junio de 2021 a las 12:25

Creo que el archivo temporal puede ser otra solución para eso.

File tempFile = File.createTempFile(prefix, suffix, null);
FileOutputStream fos = new FileOutputStream(tempFile);
fos.write(byteArray);

Hay una respuesta sobre eso aquí.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad