84 votes

Comment convertir InputStream en fichier virtuel

J'ai une méthode qui attend que celle de la variable d'entrée soit de type java.io.File mais ce que je reçois est seulement InputStream. En outre, je ne peux pas modifier la signature de la méthode.

Comment puis-je convertir l'InputStream en Type de fichier sans réellement écrire le fichier sur le système de fichiers ?

126voto

rfcreader Points 361

Quelque chose comme ça devrait marcher. Notez que pour simplifier, j'ai utilisé une fonctionnalité Java 7 (bloc try avec ressources fermables), et IOUtils d'Apache commons-io. Si vous ne pouvez pas les utiliser, ce sera un peu plus long, mais la même idée.

import org.apache.commons.io.IOUtils;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class StreamUtil {

    public static final String PREFIX = "stream2file";
    public static final String SUFFIX = ".tmp";

    public static File stream2file (InputStream in) throws IOException {
        final File tempFile = File.createTempFile(PREFIX, SUFFIX);
        tempFile.deleteOnExit();
        try (FileOutputStream out = new FileOutputStream(tempFile)) {
            IOUtils.copy(in, out);
        }
        return tempFile;
    }

}

31voto

Jan Thomä Points 4827

Vous ne pouvez pas. Le flux d'entrée est juste un flux générique de données et il n'y a aucune garantie qu'il provient réellement d'un fichier. Si quelqu'un a créé un InputStream à partir de la lecture d'un service Web ou vient de convertir une chaîne en un InputStream, il n'y aurait aucun moyen de lier cela à un fichier. Donc, la seule chose que vous pouvez faire est d'écrire des données du flux dans un fichier temporaire (par exemple en utilisant la méthode File.createTempFile) et d'alimenter ce fichier dans votre méthode.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X