Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 随机存取文件悬挂指针_Java_Randomaccessfile - Fatal编程技术网

Java 随机存取文件悬挂指针

Java 随机存取文件悬挂指针,java,randomaccessfile,Java,Randomaccessfile,我正在使用对象RandomAccessFile访问具有 RandomAccessFile file = new RandomAccessFile(path, "r"); 我的问题是,当我执行某个操作时,文件路径是否从磁盘中删除 file.seek(...); 或者 没有异常开始,我没有任何异常 如果该文件已从磁盘中删除,指针悬空时是否可能出现异常 是否有其他方法检测文件不可访问性?您的问题有两个答案 基于,如果由于任何原因无法读取任何字节,则应获得一个IOException 如果由于文

我正在使用对象RandomAccessFile访问具有

RandomAccessFile file = new RandomAccessFile(path, "r");
我的问题是,当我执行某个操作时,文件路径是否从磁盘中删除

file.seek(...); 
或者

没有异常开始,我没有任何异常

如果该文件已从磁盘中删除,指针悬空时是否可能出现异常


是否有其他方法检测文件不可访问性?

您的问题有两个答案

  • 基于,如果由于任何原因无法读取任何字节,则应获得一个
    IOException
如果由于文件结尾以外的任何原因无法读取任何字节,则 引发EOFEException以外的IOException。特别是 如果流已关闭,则可能引发IOException

  • 您可以使用中描述的方法在尝试读取之前显式检查文件删除


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

在以下情况下,您不会出现异常,这是完全正常的:

  • 你打开一个文件
  • 您或其他人删除该文件
  • 您仍然可以访问该文件,在删除之前读取其中包含的内容,或者对其进行写入
事实上,删除文件对文件本身没有任何影响。删除的是目录中的一个条目。只有在以下情况下,文件才会被实际销毁(并且它在磁盘上使用的扇区将被释放):

  • 没有更多的目录条目指向它
  • 没有文件描述符使其保持打开状态
因此,即使您在内存中请求的字节没有缓冲,文件系统仍然知道如何从磁盘获取它。顺便说一下,创建临时文件是一种常见的模式,即在上次关闭时删除的文件

当然,您可以按照merlin2011的建议,通过文件路径测试文件的存在性。但您必须知道,如果文件被删除,然后再次创建,则路径(用于打开文件)存在,但指向完全不同的对象

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

  • 忽略对目录和文件系统的修改;你有一个文件,你使用它,句号。在许多用例中,这是正确的
  • 在文档中声明该目录是您的,其他人不应删除其中的文件。毕竟,你无法阻止管理员破坏其系统或杀死你的应用程序
这适用于所有普通文件系统,所有Linux或其他类似Unix的系统、NTFS等。我不确定这是否适用于旧的文件系统,如CPM或FAT,但它们目前已不再用于生产:-)。但在Windows下,不应该能够删除java应用程序中当前打开的文件

要准确回答您的两个问题:

  • 您的指针没有悬空,但仍然指向真实文件(即使其他人看不到)
  • 如果文件不可访问(磁盘或连接的物理损坏、文件系统错误等),将引发异常。但是,如果只删除了条目,则仍然可以访问该文件

新建随机访问文件(路径“r”)时,文件已存在;完成后,它将被删除。@Albertoacepsut,我对文档的解释是,如果文件稍后被删除,然后您尝试读取,它将抛出
IOException
。(这是假设您正在尝试读取内存中未缓冲的字节)。@merlin2011您的解释符合逻辑,但不正确。“详细情况见我的回答。”谢尔盖·巴列斯塔,我被纠正了。我将把这个答案留给子孙后代,因为我认为这是一个很常见的误解。在Java环境中,所有这些都适用于*nix,因为对于Windows,Java中没有标准的方法来设置正在创建/打开的文件的
FILE\u SHARE\u DELETE
,所以它们永远不能正常删除。感谢Serge Ballesta和Merlin2011的帮助。最后一个问题:我检查file.readLine()==null,如果是,我关闭并重新打开该文件。这是正确的过程吗?否,因为文件已被删除(条目已删除)这一事实与您自己的访问无关。@Serge Ballesta check file.readLine()==null在linux中似乎可以识别已删除的文件(以前打开过)
file.readLine()
File f = new File(filePathString);
if(f.exists() && !f.isDirectory()) { /* do something */ }