如何将InputStream转换为虚拟文件

Ram*_*Ram 75 java inputstream file

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

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

cob*_*lla 117

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

}
Run Code Online (Sandbox Code Playgroud)

  • 是不是createTempFile实际上写了一个真正的文件,你可以在文件系统中看到? (8认同)
  • 一般来说,我更喜欢应用程序在有意义时删除临时文件.我使用`deleteOnExit`作为额外的理智检查,从不无条件地依赖它.我知道在某些情况下(例如``kill -9`JVM)执行删除的关闭钩子永远不会被调用. (3认同)

Jan*_*omä 30

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

  • 的确,[`File#createTempFile()`](http://download.oracle.com/javase/6/docs/api/java/io/File.html#createTempFile%28java.lang.String,%20java. lang.String%29)真的是你最好的选择. (7认同)
  • 另见[`File#deleteOnExit()`](http://download.oracle.com/javase/6/docs/api/java/io/File.html#deleteOnExit%28%29),这会导致JVM尝试在JVM退出时自动删除文件.当然,一旦您知道不再需要该文件且不再使用该文件,最好立即手动删除临时文件.但在不完美的世界中,有时候不完美的解决方案是必要的. (7认同)