¿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.

androidegalaxyman
fuente
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
Posible duplicado de Cómo convertir InputStream a archivo virtual
Paulo Oliveira

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.

Tomasz Nurkiewicz
fuente
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)

Victor Petit
fuente
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;
Shehan Simen
fuente
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 .

riñón
fuente
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();
Nabin Bhandari
fuente
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.

MariuszS
fuente
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);
    }
}  
h3xStream
fuente
¿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