Как преобразовать InputStream в виртуальный файл

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

Ответ 1

Что-то вроде этого должно работать. Обратите внимание, что для простоты я использовал функцию Java 7 (попробуйте блок с закрытым ресурсом) и 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;
    }

}

Ответ 2

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