我有一个方法,期望输入变量之一是java.io.File类型,但是我得到的只是InputStream。另外,我无法更改方法的签名。
如何将InputStream转换为File类型,而无需实际将文件写入文件系统?
我有一个方法,期望输入变量之一是java.io.File类型,但是我得到的只是InputStream。另外,我无法更改方法的签名。
如何将InputStream转换为File类型,而无需实际将文件写入文件系统?
File
对象而不是InputStream?
Answers:
这样的事情应该起作用。请注意,为简单起见,我使用了Java 7功能(带有可关闭资源的try块)和Apache commons-io的IOUtils。如果您不能使用它们,那将需要更长的时间,但是是相同的想法。
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;
}
}
deleteOnExit
用作额外的健全性检查,永远不要无条件地依赖它。我知道在某些情况下(kill -9
例如,JVM),执行删除操作的关闭挂钩永远不会被调用。
implementation 'org.apache.directory.studio:org.apache.commons.io:2.4'
至gradle。
你不能 输入流只是通用的数据流,不能保证它实际上源自文件。如果有人通过读取Web服务创建了InputStream或只是将String转换为InputStream,将无法将其链接到文件。因此,您唯一可以做的就是实际上将数据从流写入临时文件(例如,使用File.createTempFile方法),然后将此文件提供给您的方法。
File#createTempFile()
是您最好的选择。
File#deleteOnExit()
,这将导致JVM在JVM退出时尝试自动删除文件。当然,一旦知道不再需要该临时文件且不再使用它,最好手动并立即删除该临时文件。但是在一个不完美的世界中,有时不完美的解决方案是必要的。