我有一个代码库,它广泛使用文件来表示单个数据对象。我重构了代码,以便数据对象现在是一个显式的java对象,它主要隐藏与底层文件系统的交互。但是,我们使用一些外部工具(如Weka)来读写文件。

理想情况下,我希望有一个File的子类,我可以将其传递给由内存中的字节数组支持的其他库 - 用于读取或写入。

我的谷歌搜索显示了内存映射文件,但这不是我的问题,因为我不希望文件系统上有任何实际文件。是否有任何解决方案,或者我应该自己继承File并覆盖所有引用真实文件系统的方法?

有帮助吗?

解决方案

这通常是为什么你永远不应该编写方法来获取文件,除非它确实是必要的。您的库不提供采用任意InputStream的方法吗?在这种情况下,传递ByteArrayInputStream或从内存中读取的任何输入流都是微不足道的。

覆盖文件的问题是你不太可能以对你有帮助的方式覆盖它。例如,如果库使用FileInputStream打开它,那么来自该点的字节实际上由FileInputStream实现控制,而不是由您的文件控制。

其他提示

java.io.File 本质上是代表文件路径的 String 的包装器(它应该是 final 类,但你去了)。所以你对这种方法感到不快。当然,您可以在“RAM光盘”上创建临时文件和文件。

你应该注意OutputStreams / InputStreams的内存实现,例如 ByteArrayOutputStream 及其toByteArray()方法,或 ByteArrayInputStream 。 如果您的数据表示更复杂,您可以直接实现该接口。

您必须找出第三方正在使用的文件方法,并为它们提供自定义实现。

几乎可以肯定,您将无法成功,因为java.io.File对象不负责读取/写入文件内容。

最好的方法是重构代码,使其不依赖于File对象,而是依赖于该文件返回的字节数组。

可以创建文件的子类。

public class InMemoryFile extends File { 
    public InMemody() { 
         super( "/dev/null" );
    }
    // find out what methods should be overwritten ?????
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top