【问题标题】:Java: What constitutes a "normal" file in the context of File.isFile()?Java:什么构成 File.isFile() 上下文中的“正常”文件?
【发布时间】:2014-09-22 05:35:03
【问题描述】:

我遇到过 file.isFile() 返回 false 的情况,这表明文件不是“正常”的。但是,我找不到“正常”意味着什么的定义。文档link to Oracle 状态:

如果文件不是目录,并且满足其他系统相关标准,则该文件是正常的。

该文件归_www:staff 所有,权限为-rw-r--r--。该目录也归_www:staff 所有,并拥有drwxrw-r-- 的权限。访问文件的进程归bob:staff 所有。系统为 MacOS 10.9。该进程可以很好地读取和加载和显示文件;唯一的问题是对 isFile() 的调用返回 false,这意味着 Java 认为它不是普通文件。

那么,回到更大的问题,在什么情况下,即使文件确实存在、路径正确且文件可访问,此调用也会返回 false?

【问题讨论】:

  • 该文件显然不“满足其他系统相关标准”
  • 可能是某种符号链接,或者在使用 Mac OS 时,它是别名 en.wikipedia.org/wiki/Alias_(Mac_OS)
  • 您缺少一个信息:File#isFile() 在文件不存在时也会返回false (demo)。有趣的是它不会触发FileNotFoundException,它只是返回false。所以我的问题是:你 100% 确定你的文件存在吗?
  • @Andi Krusch:该文件是真实文件,而不是符号链接。
  • @BackSlash:文件存在:我的Java代码可以打开文件并处理它;只是 isFile() 返回 false。

标签: java macos file osx-mavericks


【解决方案1】:

在 Unix 系统中,文件可以是:

  • 常规文件
  • 目录
  • 符号链接
  • 命名管道
  • 套接字
  • 设备文件
  • 门(Sun Solaris 系统)

这里的“普通”文件是指普通文件。它是一种文件类型,系统对文件的内部结构没有任何要求。

【讨论】:

    【解决方案2】:

    该目录也归_www:staff 所有,并拥有drwxrw-r-- 的权限。访问文件的进程归bob:staff所有。

    进程对目录没有“x”权限(检查)。 JVM 用来执行File.isFile() 的系统调用需要此权限。此系统调用失败,因此就File.isFile() 而言,该文件不存在。

    在授予“r”权限的同时删除目录的“x”权限几乎总是一个错误。

    【讨论】:

    • 解决了这个问题:为组人员添加执行权限到目录现在会导致 isFile() 返回 true。
    猜你喜欢
    • 2011-01-23
    • 2020-08-26
    • 2013-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 2018-03-07
    • 1970-01-01
    相关资源
    最近更新 更多