Как преобразовать InputStream в виртуальный файл - PullRequest
72 голосов
/ 30 ноября 2010

У меня есть метод, который ожидает, что переменная ввода имеет тип java.io.File, но я получаю только InputStream.Кроме того, я не могу изменить сигнатуру метода.

Как я могу преобразовать InputStream в тип File без фактической записи файла в файловую систему?

Ответы [ 2 ]

111 голосов
/ 16 апреля 2013

Нечто подобное должно работать. Обратите внимание, что для простоты я использовал функцию Java 7 (блок try с закрытым ресурсом) и IOUtils из Apache commons-io. Если вы не можете использовать их, это будет немного дольше, но та же идея.

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

}
30 голосов
/ 30 ноября 2010

Вы не можете.Входной поток - это просто общий поток данных, и нет никакой гарантии, что он на самом деле происходит из файла.Если кто-то создал InputStream из чтения веб-службы или просто преобразовал String в InputStream, не было бы никакой возможности связать это с файлом.Поэтому единственное, что вы можете сделать, - это записать данные из потока во временный файл (например, с помощью метода File.createTempFile) и передать этот файл в ваш метод.

...