如何将InputStream转换为虚拟文件


81

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

如何将InputStream转换为File类型,而无需实际将文件写入文件系统?


这是内置功能吗?还是自定义功能?
理查德·罗斯三世

2
@Richard:“我无法更改方法的签名。”
BalusC,2010年

为什么您确切需要一个File对象而不是InputStream?
Poindexter,2010年

2
我无法使用InputStream,因为我正在使用的API要求使用File
Ram,2010年

在我看来,有人设计了一个损坏的API,该API只接受文件而不是InputStreams,现在您必须使用此API
Mike76 '19

Answers:


121

这样的事情应该起作用。请注意,为简单起见,我使用了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;
    }

}

8
createTempFile实际上不是写一个真实的文件,您可以在文件系统中看到吗?
Android开发人员

您在技术上是正确的。使用上面的代码,临时文件将一直存在,直到程序退出或被程序删除。
cobbzilla '16

deleteOnExit的文档说,您不应该依赖它来工作(我认为它甚至什么都没有做):developer.android.com/reference/java/io/…。此外,如果您知道如何将音频流传输到播放中而没有任何文件,请在此处进行说明:stackoverflow.com/q/36552381/878126
android开发者

4
一般来说,我希望应用程序在需要时删除临时文件。我将其deleteOnExit用作额外的健全性检查,永远不要无条件地依赖它。我知道在某些情况下(kill -9例如,JVM),执行删除操作的关闭挂钩永远不会被调用。
cobbzilla '16

如果您在Android上使用此功能,请添加implementation 'org.apache.directory.studio:org.apache.commons.io:2.4'至gradle。
LordParsley18年

30

你不能 输入流只是通用的数据流,不能保证它实际上源自文件。如果有人通过读取Web服务创建了InputStream或只是将String转换为InputStream,将无法将其链接到文件。因此,您唯一可以做的就是实际上将数据从流写入临时文件(例如,使用File.createTempFile方法),然后将此文件提供给您的方法。


7
确实,这确实File#createTempFile()是您最好的选择。
BalusC,2010年

7
另请参见File#deleteOnExit(),这将导致JVM在JVM退出时尝试自动删除文件。当然,一旦知道不再需要该临时文件且不再使用它,最好手动并立即删除该临时文件。但是在一个不完美的世界中,有时不完美的解决方案是必要的。
Mike Clark
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.