web-dev-qa-db-fra.com

Est-il possible de créer un objet File à partir de InputStream

Est-il possible de créer un objet Java.io.File à partir d'un Java.io.InputStream?

Mon exigence est la lecture du fichier à partir d'un fichier RAR. Je n'essaie pas d'écrire un fichier temporaire, j'ai un fichier dans l'archive RAR que je tente de lire.

85
androidgalaxyman

Vous devez créer un nouveau fichier et copier le contenu de InputStream dans ce fichier:

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

J'utilise la fonction IOUtils.copy() pour éviter la copie manuelle des flux. En outre, il a tampon intégré.

67
Tomasz Nurkiewicz

En une ligne:

FileUtils.copyInputStreamToFile(inputStream, file);

(org.Apache.commons.io)

42
Victor Petit

Créez d'abord un fichier temporaire.

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

Depuis Java 7, vous pouvez le faire en une ligne même sans utiliser de bibliothèques externes:

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

Voir la Documentation API .

6
kidney

Si vous ne souhaitez pas utiliser d'autres bibliothèques, voici une fonction simple permettant de convertir InputStream en 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);
    }
}

Maintenant, vous pouvez facilement écrire une Inputstream dans un fichier en utilisant FileOutputStream-

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

Si vous utilisez Java version 7 ou supérieure, vous pouvez utiliser try-with-resources pour fermer correctement la FileOutputStream. Le code suivant utilise IOUtils.copy() from commons-io .

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