Linux 中使用 RandomAccessFile 将我的数据写入磁盘的位置在哪里?

Where is my data written to disk using RandomAccessFile in Linux?

我遇到了一个让我困惑了一段时间的问题。 在 Linux 中,我以 root 用户身份登录。然后我写了一个Java程序,用RandomAccessFile先把数据写入磁盘,然后我删除了文件。

但是程序继续运行,没有抛出任何异常! 但是我什至在Linux PageCache中都找不到写入的数据! 以下是代码片段:

RandomAccessFile file =  new RandomAccessFile("/opt/temp.log", "rw");
     byte[] content = "Hello!!!\n".getBytes();
     for (int i = 0; i < 2; i++) {
         file.write(content, 0, content.length);
         Thread.sleep(3000);//just for lefting time to delete the "temp.log" file! 
     }

但是如果我将file.write()方法更改为file.writeBytes(),它会重新生成新文件并将数据写入文件。以下是代码片段:

RandomAccessFile file =  new RandomAccessFile("/opt/temp.log", "rw");          
     for (int i = 0; i < 2; i++) {                                                                               
         file.writeBytes("Hello!!!\n");                                             
         Thread.sleep(3000);//just for lefting time to delete the "temp.log" file!                                                    
     }

发生了什么事? RandomAccessFile 中有错误吗?

这在 POSIX/Unix 系统和其设计深受 POSIX/Unix 影响的系统(如 Linux)中是预期的。 Unix 系统中的文件将保持可读和可写,只要有引用该文件的东西。一个文件在文件系统中可以有多个名称(硬链接),但是一个进程也可以有一个打开的文件句柄或文件上的 mmap。只要其中至少一个仍处于活动状态,系统就不会真正释放该文件。

是的,这意味着在您从文件系统中删除文件后,进程仍然可以继续读取和写入文件。出于所有意图和目的,一个没有名字的文件仍然是一个功能完美的文件,并且仍然会在磁盘上占用 space。