当前位置: 代码迷 >> java >> Java FileInputStream 在 Windows 和 Linux 中表现出不同的行为
  详细解决方案

Java FileInputStream 在 Windows 和 Linux 中表现出不同的行为

热度:33   发布时间:2023-07-17 20:40:51.0

我在为跨平台 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 类是自定义的,但工作正常。 我检查了文件是否正在手动写入两个操作系统中

在windows上,打开文件时不能删除,也不能删除它所在的目录等。 FileOutputStream只能截断文件,不能删除和替换它。 在 Unix 上,文件独立于目录结构。 即使它不再出现在任何目录中,它也可以被打开、读取和写入。 这意味着 FileOutputStream 可以删除文件并重新创建它,而不是重新使用现有的 inode。

区别在于文件是被截断还是被替换。 在 Linux 上,即使文件处于打开状态,也可以替换,而在 Windows 上则不能。

  相关解决方案