是否可以创建 Java RAM 磁盘以与 java.io.* API 一起使用?

2022-09-04 21:47:56

我正在使用第三方库,它基本上创建了一个输出目录,其中包含不同类型的文件和子目录。我希望能够编写单元测试以确认输出是否正确。

我希望能够将lib与RAM磁盘一起使用,以便库所做的任何事情都不会以任何方式接触实际的磁盘板。这个想法是使测试非常快速地运行和清理(丢弃RAM磁盘?

我可用的两个最突出的选项是Commons VFSJSR 203。前者对我来说没有用,因为我希望使用 java.io.*API而不是Commons VFS类来透明地工作。后者不会削减它,因为我必须使用JDK 6(它应该是JDK 7的一部分),我不知道它是否会与 java.io 无缝协作。无论如何(我不会打赌)。

还有其他解决方案,但我不能使用它们,原因与我不能使用Commons VFS的原因相同。由于所讨论的库的复杂性,Mocks是不可能的。

在我的 Linux 计算机上,我可以轻松地创建 RAM 驱动器并使用 java.io.* API,就像处理磁盘上的文件一样。问题是,我希望它是跨平台的,更具体地说,是使磁盘设置成为测试过程的一部分,而不是外部的东西。

那么,有没有办法在Java中注册一个RAM驱动器,该驱动器可以与标准的 java.io.* API一起使用?


答案 1

那么,有没有办法在Java中注册一个RAM驱动器,该驱动器可以与标准的 java.io.* API一起使用?

不适用于 Java 6 或更早版本的 JVM。Java 6 及更早版本不提供任何用于注册文件系统或文件系统类型的 SPI。因此,要实现应用程序将像普通 FS 一样使用的 RAM FS,需要修改许多类的行为。java.io.*

我认为您可以做的最好的事情是使用由主机操作系统实现的RAM FS。您应该能够从Java访问它,就好像它是一个普通的文件系统一样。但是,I/O 需要系统调用,因此它不会像 RAM 文件系统保存在 JVM 托管内存中那样快。


答案 2

从理论上讲,斯蒂芬是对的。但我可以给你一个技巧。您可以实现自己的 FileInputStream 和 FileOutputStream,并将它们放入 bootclasspath 中。例如,您的实现将实现 open()、read() 和 readBytes() (它们是常规 FileInputStream 中的本机方法)。

这是针对您的问题的纯java解决方案。它的缺点是您必须在单独的 JVM 实例中运行测试。


推荐