我正在使用对象 RandomAccessFile 访问文件
RandomAccessFile file = new RandomAccessFile(path, "r");
我的问题是当我执行
时文件路径是否从磁盘中删除file.seek(...);
或一个
file.readLine()
没有异常启动,我没有任何异常。
如果此文件已从磁盘中删除,是否有可能在悬挂指针的情况下出现异常?
是否有另一种方法来检测文件不可访问性?
最佳答案
编辑:Windows 的精度(感谢 pingw33n)
在以下情况下没有Exception
是完全正常的:
- 你打开一个文件
- 您或其他人删除了该文件
- 您仍然可以访问该文件,在删除之前读取它包含的内容,或者写入它
事实上,删除文件对文件本身没有任何作用。删除的是目录中的条目。只有在以下情况下,文件才会真正被销毁(并且它在磁盘上使用的扇区将被释放):
- 没有更多的目录条目指向它
- 没有文件描述符保持打开状态
所以即使你请求的字节没有缓存在内存中,文件系统仍然知道如何从磁盘中获取它。顺便说一句,创建临时文件是一种常见的模式,即在上次关闭时将被删除的文件。
当然,您可以按照 merlin2011 的建议进行操作,即通过其路径 测试文件是否存在。但是你必须知道,文件被删除然后重新创建,路径(用于打开文件)存在,但指向一个完全不同的对象。
因此,如果您确实需要该文件实际反射(reflect)目录的内容,则不能将其保持打开状态,必须在每次访问时重新打开它……这不是一个公平的选择,您仍然可以:
- 忽略对目录和文件系统的修改;你有一个文件并使用它,句号。在许多用例中这是正确的。
- 在您的文档中声明该目录是您的,其他任何人都不应删除其中的文件。毕竟,您无法阻止管理员破坏其系统或终止您的应用。
这适用于所有普通文件系统,所有 Linux 或其他 Unix 系统,NTFS 等。我不确定它是否适用于较旧的文件系统,例如 CPM 或 FAT,但它们目前不再适用用于生产:-)。但在 Windows 下,应该无法删除当前在 java 应用程序中打开的文件。
准确回答您的 2 个问题:
- 你的指针没有悬空,但仍然指向一个真实的文件(即使其他人看不到它)
- 如果文件无法访问(磁盘或连接的物理损坏、文件系统错误等),将抛出异常。但是如果只删除条目,文件仍然可以访问
关于java - RandomAccessFile 悬挂指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24270628/