IT-Swarm.Net

是否可以从InputStream创建File对象

有没有办法从Java.io.File创建Java.io.InputStream对象?

我的要求是从RAR读取文件。我不是要写一个临时文件,我在RAR档案中有一个文件,我正在尝试阅读。.

89
androidgalaxyman

您需要创建新文件并将InputStream中的内容复制到该文件:

File file = //...
try(OutputStream outputStream = new FileOutputStream(file)){
    IOUtils.copy(inputStream, outputStream);
} catch (FileNotFoundException e) {
    // handle exception here
} catch (IOException e) {
    // handle exception here
}

我使用方便的 IOUtils.copy() 来避免手动复制流。它还内置缓冲。.

73
Tomasz Nurkiewicz

快速,可靠且价格合理的云托管

注册并在30天内获得$50奖金!

在一行中:

FileUtils.copyInputStreamToFile(inputStream, file);

(org.Apache.commons.io)

44
Victor Petit

首先创建一个临时文件。.

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

从Java 7开始,即使不使用任何外部库,也可以在一行中完成:

Files.copy(inputStream, outputPath, StandardCopyOption.REPLACE_EXISTING);

请参阅 API文档 。.

10
kidney

如果您不想使用其他库,这里有一个将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();
1
Nabin Bhandari

如果您使用的是Java 7或更高版本,则可以使用 try-with-resources 来正确关闭FileOutputStream。以下代码使用 IOUtils.copy() from commons-io 。.

public void copyToFile(InputStream inputStream, File file) throws IOException {
    try(OutputStream outputStream = new FileOutputStream(file)) {
        IOUtils.copy(inputStream, outputStream);
    }
}  
0
h3xStream