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

124

Existe-t-il un moyen de créer un java.io.Fileobjet à partir d'un java.io.InputStream?

Mon exigence est de lire le fichier à partir d'un RAR. Je n'essaye pas d'écrire un fichier temporaire, j'ai un fichier dans l'archive RAR que j'essaie de lire.

androidgalaxyman
la source
1
mon exigence est de lire le fichier à partir d'un RAR. Supposons que je n'essaye pas d'écrire le fichier temporaire à partir du RAR, à l'intérieur de RAR, j'ai un fichier, j'ai juste besoin de lire.
androidgalaxyman
Je ne comprends pas la question. Précisez s'il vous plaît. Si vous voulez que le fichier original provienne d'InputStream, il n'y en a pas eu: vous lisez un fichier RAR, pas un fichier. Si vous voulez autre chose, quoi?
Marquis of Lorne
Copie
Paulo Oliveira

Réponses:

90

Vous devez créer un nouveau fichier et copier le contenu de InputStreamce 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 pratique IOUtils.copy()pour éviter la copie manuelle des flux. En outre, il a une mémoire tampon intégrée.

Tomasz Nurkiewicz
la source
3
Impossible de résoudre les IOUtils dans Android Studio et le lien que vous avez référencé est un 404.
Shahraiz T.
3
org.apache.directory.studio:org.apache.commons.io devait être ajouté en tant que dépendance. Ma faute. :)
Shahraiz T.
7
Veuillez fermer correctement OutputStream, utilisez un essai avec des ressources ou IOUtils.closeQuietly. Je sais que ce n'est qu'un exemple, mais les débutants le copieront littéralement.
Rafael Membrives
59

En une seule ligne:

FileUtils.copyInputStreamToFile(inputStream, file);

(org.apache.commons.io)

Victor Petit
la source
29

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;
Shehan Simen
la source
Veuillez inclure le nom du package d'IOUtils
Ridhuvarshan
org.apache.commons.io
Shehan Simen
Il existe également dans org.apache.axis2.util avec un troisième paramètre pour la fonction de copie. La fonctionnalité fonctionne là aussi. Des comparaisons sur quoi utiliser?
Ridhuvarshan
27

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

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

Consultez la documentation de l' API .

un rein
la source
2
Si vous l'utilisez avec Android, un SDK minimum de 26 est requis.
Néph
3

Si vous ne souhaitez pas utiliser autre bibliothèque, voici une fonction simple pour convertir InputStreamà 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);
    }
}

Vous pouvez maintenant facilement écrire un Inputstreamfichier dans un fichier en utilisant FileOutputStream-

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

Solution Java 11 facile avec bloc d' essai avec ressources

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 depuis Java 9.

MariuszS
la source
0

Si vous utilisez Java version 7 ou supérieure, vous pouvez utiliser try-with-resources pour fermer correctement le fichier FileOutputStream. Le code suivant utilise 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
la source
Vous n'avez pas besoin de fermer OutputStream? Comme dans la réponse de Tomasz N.
trinity420
3
@ trinity420 Les ressources spécifiées dans la trypartie d'initialisation sont automatiquement fermées lorsque le trybloc est quitté.
h3xStream