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

Tom*_*vic 10 java unit-testing ramdisk

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

我希望能够将lib与RAM磁盘一起使用,这样磁带库就不会以任何方式触及实际的磁盘板.我们的想法是让测试运行和清理非常快(丢弃RAM磁盘?).

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

还有其他解决方案,但我不能使用它们的原因与我不能使用Commons VFS相同.由于所涉及的库的复杂性,模拟是不可能的.

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

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

Ste*_*n C 6

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

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

我认为你能做的最好的事情就是使用主机操作系统实现的RAM FS.您应该能够从Java访问它,就像它是一个普通的文件系统一样.然而,I/O 意味着一个系统调用,这样如果RAM文件系统是在JVM持有管理的内存也不会那么快.


Ale*_*exR 5

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

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

  • 它并不是真正的“纯 Java”,因为修改系统类不在 Java 规范的范围内,即这可能适用于某些 Java 实现,但不适用于其他实现。 (2认同)
  • 我的理解是,即使他愿意,他也做不到。他说*“他后来没有削减它,因为我必须使用 JDK 6”*。如果他用自定义版本替换“java.io.*”类,那么它就不再是 Java 6。(事实上​​,从技术上来说它根本不是 Java!) (2认同)
  • 此外,替换标准java类绝对不是“纯Java”;请参阅此链接 - http://www.javacoffeebreak.com/faq/faq0006.html 。在我看来,受黑客攻击的 JVM 会自动使您的代码不可移植,因此不是“纯 Java”。 (2认同)