RandomAccessFile悬空指针

时间:2014-06-17 18:12:16

标签: java randomaccessfile

我使用对象RandomAccessFile来访问带有

的文件
RandomAccessFile file = new RandomAccessFile(path, "r");

我的问题是,当我执行

时,是否从磁盘中删除了文件路径
file.seek(...); 

file.readLine()

没有例外,我没有任何例外。

如果此文件已从磁盘中删除,是否可能在悬空指针的情况下出现异常?

是否有另一种检测文件无法访问的方法?

2 个答案:

答案 0 :(得分:3)

编辑:Windows的精度(感谢pingw33n)

在以下情况下获得Exception是完全正常的:

  • 你打开一个文件
  • 您或其他人删除文件
  • 你仍然可以访问该文件,在删除之前阅读它包含的内容,或者写入

实际上删除文件对文件本身不执行任何操作。删除的是目录中的条目。并且只有在以下情况下才会实际销毁文件(以及它在磁盘上使用的扇区):

  • 没有更多目录条目指向它
  • 没有文件描述符保持打开

因此,即使你要求的字节没有缓冲在内存中,文件系统仍然知道如何从磁盘中获取它。顺便说一下,创建临时文件是一种常见的模式,即在最后关闭时将被删除的文件。

当然,您可以执行merlin2011建议的操作,即通过路径测试文件的存在。但是你必须知道文件被删除然后再次创建,路径(用于打开文件)存在,但指向一个完全不同的对象。

因此,如果您确实需要该文件实际上反映了目录的内容,则无法保持该文件的打开状态,并且必须在每次访问时重新打开它...这不是一个公平的选择,您仍然可以:

  • 忽略对目录和文件系统的修改;你有一个文件,你使用它,完全停止。有许多用例,这是正确的。
  • 在您的文档中声明该目录是您的,其他人不应删除其中的文件。毕竟,你无法阻止管理员破坏其系统或杀死你的应用程序。

对于所有普通文件系统,所有Linux系统或其他类似Unix系统,NTFS等都是如此。我不确定CPM或FAT等旧版本是否仍然如此,但它们目前不再存在用于生产:-)。但是在Windows下,不应该删除当前在java应用程序中打开的文件。

准确回答2个问题:

  • 你的指针没有悬空,但仍然指向一个真实的文件(即使没有其他人可以看到它)
  • 如果文件无法访问(磁盘或连接的物理损坏,文件系统错误等),将抛出异常。但是,如果仅删除了该条目,则该文件仍可访问

答案 1 :(得分:0)

您的问题有两个答案。

  • 根据Javadoc,如果因任何原因无法读取任何字节,则应获得IOException
  

如果由于文件结尾之外的任何原因无法读取任何字节,则   抛出除EOFException之外的IOException。尤其是   如果流已关闭,则可能抛出IOException。

  • 您可以使用this answer中描述的方法在尝试阅读之前明确检查文件删除。

    File f = new File(filePathString);
    if(f.exists() && !f.isDirectory()) { /* do something */ }