我使用对象RandomAccessFile来访问带有
的文件RandomAccessFile file = new RandomAccessFile(path, "r");
我的问题是,当我执行
时,是否从磁盘中删除了文件路径file.seek(...);
或
file.readLine()
没有例外,我没有任何例外。
如果此文件已从磁盘中删除,是否可能在悬空指针的情况下出现异常?
是否有另一种检测文件无法访问的方法?
答案 0 :(得分:3)
编辑:Windows的精度(感谢pingw33n)
在以下情况下获得Exception
是完全正常的:
实际上删除文件对文件本身不执行任何操作。删除的是目录中的条目。并且只有在以下情况下才会实际销毁文件(以及它在磁盘上使用的扇区):
因此,即使你要求的字节没有缓冲在内存中,文件系统仍然知道如何从磁盘中获取它。顺便说一下,创建临时文件是一种常见的模式,即在最后关闭时将被删除的文件。
当然,您可以执行merlin2011建议的操作,即通过路径测试文件的存在。但是你必须知道文件被删除然后再次创建,路径(用于打开文件)存在,但指向一个完全不同的对象。
因此,如果您确实需要该文件实际上反映了目录的内容,则无法保持该文件的打开状态,并且必须在每次访问时重新打开它...这不是一个公平的选择,您仍然可以:
对于所有普通文件系统,所有Linux系统或其他类似Unix系统,NTFS等都是如此。我不确定CPM或FAT等旧版本是否仍然如此,但它们目前不再存在用于生产:-)。但是在Windows下,不应该删除当前在java应用程序中打开的文件。
准确回答2个问题:
答案 1 :(得分:0)
您的问题有两个答案。
IOException
。如果由于文件结尾之外的任何原因无法读取任何字节,则 抛出除EOFException之外的IOException。尤其是 如果流已关闭,则可能抛出IOException。
您可以使用this answer中描述的方法在尝试阅读之前明确检查文件删除。
File f = new File(filePathString);
if(f.exists() && !f.isDirectory()) { /* do something */ }