Java 如何将InputStream转换为虚拟文件

Java 如何将InputStream转换为虚拟文件,java,file,inputstream,Java,File,Inputstream,我有一个方法,它期望输入变量之一是java.io.File类型,但我得到的只是InputStream。此外,我无法更改该方法的签名 如何将InputStream转换为文件类型,而不将文件实际写入文件系统?您不能。输入流只是一个通用的数据流,不能保证它实际上来自一个文件。如果有人通过读取web服务创建了InputStream,或者只是将字符串转换为InputStream,则无法将其链接到文件。因此,您唯一能做的就是将数据流中的数据写入临时文件(例如,使用file.createTempFile方法)

我有一个方法,它期望输入变量之一是java.io.File类型,但我得到的只是InputStream。此外,我无法更改该方法的签名


如何将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。