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.


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

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.


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)


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;

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 .


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();

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.


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);
    }
}  

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.