Java FileInputStream 在 Windows 和 Linux 中表现出不同的行为
Java FileInputStream exhibits different behaviour in Windows and Linux
我在为跨平台 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 returns -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 class 是自定义的,但可以正常工作。我检查过 OS 中的文件是否被手动写入
在windows,当文件打开时不能删除,也不能删除它所在的目录等。FileOutputStream 只能截断文件,不能删除和替换它。在 Unix 上,文件独立于目录结构存在。即使它不再出现在任何目录中,也可以打开、读取和写入它。这意味着 FileOutputStream 可以删除文件并重新创建它,而不是重新使用现有的 inode。
区别在于文件是被截断还是被替换。在 Linux 上,即使文件打开也可以被替换,在 Windows 上则不能。
我在为跨平台 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 returns -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 class 是自定义的,但可以正常工作。我检查过 OS 中的文件是否被手动写入
在windows,当文件打开时不能删除,也不能删除它所在的目录等。FileOutputStream 只能截断文件,不能删除和替换它。在 Unix 上,文件独立于目录结构存在。即使它不再出现在任何目录中,也可以打开、读取和写入它。这意味着 FileOutputStream 可以删除文件并重新创建它,而不是重新使用现有的 inode。
区别在于文件是被截断还是被替换。在 Linux 上,即使文件打开也可以被替换,在 Windows 上则不能。