Java 如何将InputStream转换为虚拟文件
我有一个方法,它期望输入变量之一是java.io.File类型,但我得到的只是InputStream。此外,我无法更改该方法的签名Java 如何将InputStream转换为虚拟文件,java,file,inputstream,Java,File,Inputstream,我有一个方法,它期望输入变量之一是java.io.File类型,但我得到的只是InputStream。此外,我无法更改该方法的签名 如何将InputStream转换为文件类型,而不将文件实际写入文件系统?您不能。输入流只是一个通用的数据流,不能保证它实际上来自一个文件。如果有人通过读取web服务创建了InputStream,或者只是将字符串转换为InputStream,则无法将其链接到文件。因此,您唯一能做的就是将数据流中的数据写入临时文件(例如,使用file.createTempFile方法)
如何将InputStream转换为文件类型,而不将文件实际写入文件系统?您不能。输入流只是一个通用的数据流,不能保证它实际上来自一个文件。如果有人通过读取web服务创建了InputStream,或者只是将字符串转换为InputStream,则无法将其链接到文件。因此,您唯一能做的就是将数据流中的数据写入临时文件(例如,使用file.createTempFile方法),并将该文件输入到您的方法中 像这样的事情应该行得通。注意,为了简单起见,我使用了Java7特性(try block with closeable resource)和ApacheCommons 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;
}
}
这是内置函数吗?还是一个自定义函数?@Richard:“我无法更改方法的签名。”你为什么需要一个
文件
对象而不是InputStream?我不能使用InputStream,因为我使用的API要求文件向我表明,有人设计了一个只接受文件而不接受InputStreams的坏API,现在,您必须使用这个API确实,是您最好的选择。另请参见,这会导致JVM在JVM退出时尝试自动删除文件。当然,一旦知道临时文件不再需要且不再使用,最好立即手动删除该文件。但在一个不完美的世界里,有时不完美的解决方案是必要的。createTempFile不是真的写了一个真实的文件,你可以在文件系统中看到吗?你在技术上是正确的。使用上面的代码,临时文件将一直存在,直到程序退出或被程序删除。deleteOnExit的文档说你不应该依赖它来工作(我认为它实际上什么都不做):。此外,如果您知道如何在没有任何文件的情况下将音频流传输到播放中,请在此处进行说明:一般来说,我更希望应用程序在有意义时删除临时文件。我使用deleteOnExit
作为额外的健全性检查,从不无条件地依赖它。我知道在某些情况下(kill-9
JVM),执行删除操作的关闭钩子永远不会被调用。如果您在Android上使用此功能,请将implementation'org.apache.directory.studio:org.apache.commons.io:2.4'
添加到gradle。