是否可以从 InputStream 创建 File 对象

有没有办法从 java.io.InputStream创建一个 java.io.File对象?

我的要求是从 RAR 读取文件。我没有尝试写一个临时文件,我有一个文件内的 RAR 归档,我试图读取。

249401 次浏览

您需要创建新文件并将内容从 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(),以避免手动复制流。此外,它有内置的缓冲区。

首先使用 org.apache.commons.io 创建一个临时文件。

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

一句话:

FileUtils.copyInputStreamToFile(inputStream, file);

( org.apache.commons.io )

如果不想使用其他库,这里有一个简单的函数,可以将数据从 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();

如果您使用的是 Java 版本7或更高版本,则可以使用 尝试使用资源来正确关闭 FileOutputStream。下面的代码使用来自 (法语)IOUtils.copy()

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

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

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

看看 API 文件

易用的带有 试试资源块的 Java9解决方案

public static void copyInputStreamToFile(InputStream input, File file) {


try (OutputStream output = new FileOutputStream(file)) {
input.transferTo(output);
} catch (IOException ioException) {
ioException.printStackTrace();
}


}

从 Java9开始,Java.io.InputStream # transTo 就可用了。