在为跨平台Java应用程序编写单元测试时遇到了一个奇怪的问题,特别是使用FileInputStream。此测试最初是在Windows中编写并通过
FileInputStream inputStream = new FileInputStream(file.getAbsolutePath());
FileOutputStream outputStream = FileUtils.getFileOutputStream(file.getAbsolutePath());
outputStream.write('a');
outputStream.close();
Assert.assertEquals(inputStream.read(), 'a');
这在Windows中完美运行但在Ubuntu中失败,因为 inputStream 返回-1(即EOF)
但是,如果我在关闭 outputStream 之后重新分配 inputStream ,
FileInputStream inputStream = new FileInputStream(file.getAbsolutePath());
FileOutputStream outputStream = FileUtils.getFileOutputStream(file.getAbsolutePath());
outputStream.write('a');
outputStream.close();
inputStream = new FileInputStream(file.getAbsolutePath());
Assert.assertEquals(inputStream.read(), 'a');
在Ubuntu和Windows中一切正常。
我的猜测是它与Windows和Ubuntu使用的不同文件系统有关,但我希望有人可以进一步详细说明。
注意:FileUtils类是自定义的,但可以正常工作。我检查了文件是在两个操作系统中手动写入的
答案 0 :(得分:1)
在Windows上,文件打开时无法删除,也无法删除目录等.FileOutputStream只能截断文件,不能删除和替换文件。在Unix上,该文件独立于目录结构。它可以打开,读取和写入,即使它不再出现在任何目录中。这意味着FileOutputStream可以删除该文件并重新创建它,而不是重用现有的inode。
区别在于文件是被截断还是被替换。在Linux上,即使文件是打开的,也可以替换它,但在Windows上则不能。