Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java FileInputStream在Windows和Linux中表现出不同的行为_Java_Linux_Windows_Ubuntu_Cross Platform - Fatal编程技术网

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

Java FileInputStream在Windows和Linux中表现出不同的行为,java,linux,windows,ubuntu,cross-platform,Java,Linux,Windows,Ubuntu,Cross Platform,我在为跨平台Java应用程序编写单元测试时遇到了一个奇怪的问题,特别是使用FileInputStream。此测试最初是在Windows中编写的,并已通过 FileInputStream inputStream = new FileInputStream(file.getAbsolutePath()); FileOutputStream outputStream = FileUtils.getFileOutputStream(file.getAbsolutePath

我在为跨平台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,就像这样

在Ubuntu和Windows中一切都很好

我的猜测是,这与Windows和Ubuntu使用的不同文件系统有关,但我希望有人能进一步阐述


注意:FileUtils类是自定义的,但工作正常。我检查了文件是否正在windows上的两个操作系统中手动写入,当文件打开时,无法删除它,也无法删除它所在的目录等。FileOutputStream只能截断文件,无法删除和替换它。在Unix上,文件独立于目录结构。它可以被打开、读取和写入,即使它不再出现在任何目录中。这意味着FileOutputStream可以删除文件并重新创建它,而不是重新使用现有的inode


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

区别在于文件是被截断还是被替换。在Linux上,文件即使打开也可以被替换,在Windows上则不能。谢谢,我有点理解。请您详细说明,最好是作为一个答案,以便我可以投票并将其标记为正确注意,如果您想写入同一文件,您可以通过
outputStream=new FileOutputStream(inputStream.getFD())
打开输出流…
        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');