如何将InputStream转换为虚拟文件

时间:2010-11-30 18:17:05

标签: java file inputstream

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

如何在不将文件实际写入文件系统的情况下将InputStream转换为File类型?

2 个答案:

答案 0 :(得分:109)

这样的事情应该有效。请注意,为简单起见,我使用了Java 7功能(尝试具有可关闭资源的块),以及来自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;
    }

}

答案 1 :(得分:30)

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