java - RandomAccessFile 悬挂指针

标签 java randomaccessfile

我正在使用对象 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/

相关文章:

java - java中的Scanner如何向hasNext()返回true?

java - JSP 页面不显示图片,即使它指向正确的目录?

java - RandomAccessFile 长度多久更新一次?

java - WifiManager 中的 startScan() 在 Android P 中已弃用

java - 如何在SmartTabLayout中以编程方式定义选项卡的宽度

c++使用包含 vector 的类的随机访问文件

java - 将数组的元素加载到集合中

c# - 在 C# 中读取随机访问文件

java - Java外部文件的哈希函数

java - Mockito 监视具有内部方法引用的类