Возможно ли создать объект File из InputStream

Есть ли способ создать объект java.io.File из java.io.InputStream?

Мое требование - чтение файла из RAR. Я не пытаюсь написать временный файл, у меня есть файл в архиве RAR, который я пытаюсь прочитать.

Ответ 1

Вам нужно создать новый файл и скопировать содержимое из InputStream в этот файл:

File file = //...
OutputStream outputStream = new FileOutputStream(file);
IOUtils.copy(inputStream, outputStream);
outputStream.close();

Я использую удобный IOUtils.copy(), чтобы избежать ручного копирования потоков. Также он имеет встроенную буферизацию.

Ответ 2

Сначала создайте файл temp.

    File tempFile = File.createTempFile(prefix, suffix);
    tempFile.deleteOnExit();
    FileOutputStream out = new FileOutputStream(tempFile);
    IOUtils.copy(in, out);
    return tempFile;

Ответ 3

В одной строке:

FileUtils.copyInputStreamToFile(inputStream, file);

(org.apache.commons.io)

Ответ 4

Если вы не хотите использовать другую библиотеку, вот простая функция для преобразования InputStream в OutputStream.

public static void copyStream(InputStream in, OutputStream out) throws IOException {
    byte[] buffer = new byte[1024];
    int read;
    while ((read = in.read(buffer)) != -1) {
        out.write(buffer, 0, read);
    }
}

Теперь вы можете легко записать InputStream в файл с помощью FileOutputStream -

FileOutputStream out = new FileOutputStream(outFile);
copyStream (inputStream, out);
out.close();