У меня есть метод, который ожидает, что одна из входных переменных будет иметь тип java.io.File, но я получаю только InputStream. Я не могу изменить подпись метода. Как я могу преобразовать 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) и передать этот файл в свой метод.