【问题标题】:How to convert InputStream to virtual File如何将 InputStream 转换为虚拟文件
【发布时间】:2011-05-18 01:14:46
【问题描述】:

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

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

【问题讨论】:

  • 这是一个内置函数吗?还是自定义函数?
  • @Richard:“我无法更改方法的签名。”
  • 为什么需要File 对象而不是InputStream?
  • 我无法使用 InputStream,因为我使用的 API 需要 File
  • 在我看来,有人设计了一个损坏的 API,只接受文件而不是 InputStreams,现在你必须使用这个 API

标签: java file inputstream


【解决方案1】:

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

}

【讨论】:

  • 不是 createTempFile 实际上写了一个真实的文件,你可以在文件系统中看到吗?
  • 您在技术上是正确的。使用上面的代码,临时文件将一直存在,直到程序退出或被程序删除。
  • deleteOnExit 的文档说你不应该依赖它来工作(我认为它实际上什至没有做任何事情):developer.android.com/reference/java/io/…。另外,如果你知道如何将音频流式播放,没有任何文件,请写在这里:stackoverflow.com/q/36552381/878126
  • 一般来说,我更喜欢应用程序在有意义的时候删除临时文件。我使用deleteOnExit 作为额外的健全性检查,从不无条件地依赖它。我知道在某些情况下(例如kill -9 JVM)执行删除的关闭挂钩永远不会被调用。
  • 如果您在 Android 上使用此功能,请将 implementation 'org.apache.directory.studio:org.apache.commons.io:2.4' 添加到 gradle。
【解决方案2】:

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

【讨论】:

  • 确实,File#createTempFile() 确实是您的最佳选择。
  • 另见File#deleteOnExit(),它会导致JVM在JVM退出时尝试自动删除文件。当然,一旦您知道该文件不再需要且不再使用,最好立即手动删除临时文件。但在一个不完美的世界中,有时不完美的解决方案是必要的。
猜你喜欢
  • 1970-01-01
  • 2015-12-12
  • 1970-01-01
  • 2018-11-20
  • 2011-04-12
  • 2011-12-12
  • 2011-02-19
  • 2013-06-11
  • 2016-04-11
相关资源
最近更新 更多