【问题标题】:Converting stream to path/filename without writing to physical disk将流转换为路径/文件名而不写入物理磁盘
【发布时间】:2015-10-25 07:18:09
【问题描述】:

我正在使用专有的 Java API(源代码未公开),该 API 在其接口之一中定义了一个方法:

Foo.bar(String fileName, String formatName);

这个方法的问题是它需要一个String fileName。我希望有一种方法可以采用 File file 或某种 stream 代替,但这种方法不存在。反编译 .class 文件显示 API 在内部执行了 new File(fileName),但模仿其整个行为太吓人且风险太大。

在我的代码中,我创建了一个流,我希望能够调用bar() 而无需先将任何内容写入磁盘(至少不是物理上的)。

有什么办法可以欺骗Foo.bar() 接受我的信息流吗?也许通过在 Java 中利用一些虚拟文件系统?

我们在这方面使用的是 Java 1.7。

【问题讨论】:

    标签: java file path stream filesystems


    【解决方案1】:

    这是否满足您的需求?

    https://docs.oracle.com/javase/8/docs/technotes/guides/io/fsp/filesystemprovider.html

    java.nio.file.spi.FileSystemProvider 类允许您开发一个 自定义文件系统提供程序。自定义文件系统提供程序很有用 在以下情况:

    开发基于内存或基于 zip 文件的文件系统

    通过扩展类java.nio.file.spi.FileSystemProvider 并覆盖其方法newInputStreamnewOutputStream,您应该能够将流作为文件提供。

    【讨论】:

    • 感谢回复,我会调查的。马上,你知道它是否也适用于 Java 1.7(我现在编辑了我的问题)?
    • 啊,第一句:Java SE 7版本中引入的NIO.2 API ... :-)
    • 根据 FileSystemProvider 的 Javadoc,它从 Java 1.7 开始可用。
    • 我猜您希望 API 写入您的流,但必须为其提供文件名。即使您的流首先是从文件(名称)构造的,有问题的 API 在打开文件时也不会获取您的流对象,它会获取一个新流。在我看来,以可逆方式将流映射到文件名的唯一方法是创建一个自定义文件系统,按名称管理流对象。
    • 我认为你是对的,Rolf Rander,我自己也是这么想的。它让我对 Google Jimfs(一个实现 Java NIO 文件 API 的内存中的 FS)感到困惑。我尝试保存到使用这些库创建的新路径,然后将其名称提供给原始 bar() 方法 - 似乎有效!还有一些测试要做,但我只是认为 Jimfs 可能已经解决了 :-) 感谢您的评论!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多