Tengo un método que espera que la variable de entrada sea del tipo java.io.File, pero lo que obtengo es solo InputStream. Además, no puedo cambiar la firma del método.
¿Cómo puedo convertir InputStream en un tipo de archivo sin tener que escribir el archivo en el sistema de archivos?
java
file
inputstream
RAM
fuente
fuente
File
objeto en lugar de InputStream?Respuestas:
Algo como esto debería funcionar. Tenga en cuenta que para simplificar, he usado una función de Java 7 (intente bloquear con recurso que se puede cerrar) e IOUtils de Apache commons-io. Si no puede usarlos, será un poco más largo, pero la misma idea.
import org.apache.commons.io.IOUtils; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; public class StreamUtil { public static final String PREFIX = "stream2file"; public static final String SUFFIX = ".tmp"; public static File stream2file (InputStream in) throws IOException { final File tempFile = File.createTempFile(PREFIX, SUFFIX); tempFile.deleteOnExit(); try (FileOutputStream out = new FileOutputStream(tempFile)) { IOUtils.copy(in, out); } return tempFile; } }
fuente
deleteOnExit
como un control adicional de cordura, nunca confío incondicionalmente en él. Sé que en ciertas situaciones (kill -9
la JVM, por ejemplo) nunca se llamará a los ganchos de cierre que realizan la eliminación.implementation 'org.apache.directory.studio:org.apache.commons.io:2.4'
a gradle.No puedes. El flujo de entrada es solo un flujo genérico de datos y no hay garantía de que realmente se origine en un archivo. Si alguien crea un InputStream a partir de la lectura de un servicio web o simplemente convierte un String en un InputStream, no habría forma de vincularlo a un archivo. Entonces, lo único que puede hacer es escribir datos de la secuencia en un archivo temporal (por ejemplo, usando el método File.createTempFile) e introducir este archivo en su método.
fuente
File#createTempFile()
es realmente tu mejor opción.File#deleteOnExit()
, lo que hace que la JVM intente eliminar el archivo automáticamente cuando sale de la JVM. Por supuesto, es mejor eliminar el archivo temporal de forma manual e inmediata, una vez que sepa que el archivo ya no es necesario y ya no está en uso. Pero en un mundo imperfecto a veces se necesitan soluciones imperfectas.