¿Es posible crear un objeto File desde InputStream?


121

¿Hay alguna forma de crear un java.io.Fileobjeto a partir de unjava.io.InputStream ?

Mi requisito es leer el archivo de un RAR. No estoy tratando de escribir un archivo temporal, tengo un archivo dentro del archivo RAR que estoy tratando de leer.


1
mi requisito es leer el archivo de un RAR. Suponga que no estoy tratando de escribir el archivo temporal desde el RAR, dentro de RAR tengo un archivo, solo necesito leer.
androidgalaxyman

No entiendo la pregunta. Por favor aclare. Si desea el archivo original de InputStream, no había uno: está leyendo un archivo RAR, no un archivo. Si quieres algo más, ¿qué?
Marqués de Lorne

Respuestas:


87

Necesita crear un nuevo archivo y copiar el contenido de InputStreamese archivo:

File file = //...
try(OutputStream outputStream = new FileOutputStream(file)){
    IOUtils.copy(inputStream, outputStream);
} catch (FileNotFoundException e) {
    // handle exception here
} catch (IOException e) {
    // handle exception here
}

Estoy usando conveniente IOUtils.copy()para evitar la copia manual de transmisiones. También tiene almacenamiento en búfer incorporado.


3
No se pudo resolver IOUtils en Android Studio y el enlace al que hizo referencia es un 404.
Shahraiz T.

3
org.apache.directory.studio:org.apache.commons.io necesitaba agregarse como una dependencia. Culpa mía. :)
Shahraiz T.

7
Cierre correctamente OutputStream, pruebe con recursos o IOUtils.closeQuietly. Sé que es solo un ejemplo, pero los principiantes lo copiarán literalmente.
Rafael Membrives

59

En una línea:

FileUtils.copyInputStreamToFile(inputStream, file);

(org.apache.commons.io)


29

Primero cree un archivo temporal.

File tempFile = File.createTempFile(prefix, suffix);
tempFile.deleteOnExit();
FileOutputStream out = new FileOutputStream(tempFile);
IOUtils.copy(in, out);
return tempFile;

Incluya el nombre del paquete de IOUtils
Ridhuvarshan

org.apache.commons.io
Shehan Simen

También existe en org.apache.axis2.util con un tercer parámetro para la función de copia. La funcionalidad también funciona allí. ¿Alguna comparación sobre qué usar?
Ridhuvarshan

26

Desde Java 7, puede hacerlo en una línea incluso sin usar bibliotecas externas:

Files.copy(inputStream, outputPath, StandardCopyOption.REPLACE_EXISTING);

Consulte los documentos de la API .


2
Si usa esto con Android, se requiere un SDK mínimo de 26.
Neph

3

Si no desea utilizar otra biblioteca, aquí hay una función simple para convertir InputStreama OutputStream.

public static void copyStream(InputStream in, OutputStream out) throws IOException {
    byte[] buffer = new byte[1024];
    int read;
    while ((read = in.read(buffer)) != -1) {
        out.write(buffer, 0, read);
    }
}

Ahora puede escribir fácilmente un Inputstreamarchivo usando FileOutputStream-

FileOutputStream out = new FileOutputStream(outFile);
copyStream (inputStream, out);
out.close();

1

Solución fácil de Java 11 con prueba con bloque de recursos

public static void copyInputStreamToFile(InputStream input, File destination) {  

    try (OutputStream output = new FileOutputStream(destination)) {
        input.transferTo(output);
    } catch (IOException ioException) {
        ioException.printStackTrace();
    }

}

java.io.InputStream # transferTo está disponible desde Java 9.


0

Si está utilizando Java versión 7 o superior, puede utilizar try-with-resources para cerrar correctamente el archivo FileOutputStream. El siguiente código se usa IOUtils.copy()de commons-io .

public void copyToFile(InputStream inputStream, File file) throws IOException {
    try(OutputStream outputStream = new FileOutputStream(file)) {
        IOUtils.copy(inputStream, outputStream);
    }
}  

¿No necesitas cerrar OutputStream? Al igual que en la respuesta de Tomasz N.
trinity420

3
@ trinity420 Los recursos especificados en la tryparte de inicialización se cierran automáticamente cuando se sale del trybloque.
h3xStream
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.