web-dev-qa-db-fra.com

Comment convertir InputStream en fichier virtuel

J'ai une méthode qui s'attend à ce que celle de la variable d'entrée soit de type Java.io.File, mais ce que j'obtiens est uniquement InputStream. De plus, je ne peux pas changer la signature de la méthode.

Comment convertir le type InputStream en type de fichier sans écrire le fichier dans le système de fichiers?

72
Ram

Quelque chose comme ça devrait marcher. Notez que par souci de simplicité, j’ai utilisé une fonctionnalité Java 7 (essayer de bloquer avec une ressource pouvant être fermée)) et IOUtils d’Apache commons-io. Si vous ne pouvez pas les utiliser, ce sera un peu plus longtemps, 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;
    }

}
114
cobbzilla

Tu ne peux pas. Le flux d'entrée est simplement un flux de données générique et rien ne garantit qu'il provient réellement d'un fichier. Si quelqu'un créait un InputStream à la lecture d'un service Web ou venait simplement de convertir une chaîne en InputStream, il n'y aurait aucun moyen de le lier à un fichier. Ainsi, la seule chose que vous puissiez faire est d’écrire les données du flux dans un fichier temporaire (par exemple, à l’aide de la méthode File.createTempFile) et d’alimenter ce fichier dans votre méthode.

30
Jan Thomä