我遇到了一个使我困惑的问题一段时间。在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系统和设计受Linux的POSIX / Unix严重影响的系统中是预期的。 Unix系统中的文件只要有引用该文件的内容,就将保持可读性和可写性。文件在文件系统中可以具有多个名称(硬链接),但是进程也可以具有打开的文件句柄或文件上的mmap。只要文件中的至少一个仍处于活动状态,文件就不会真正被系统释放。
是,这意味着从文件系统中删除文件后,进程仍然可以继续读写文件。出于所有目的和目的,没有名称的文件仍然是功能完善的文件,并且仍会占用磁盘空间。