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.