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