用于Java的Unix stat()/ lstat()

Aar*_*all 5 java unix file-io posix

假设我想获得lstat()系统调用返回的几个文件属性(所有者,大小,权限,时间).在Java中执行此操作的一种方法是创建一个java.io.File对象并对其执行调用,如length(),lastModified()等.到目前为止我有两个问题:

  1. 这些调用中的每一个都会触发stat()调用,对于我的目的,stat()被认为是昂贵的:我试图在数百个主机上并行扫描数十亿个文件,并且(以第一个近似值)唯一的方式访问这些文件是通过NFS,通常是针对文件管理器集群,其中stat()负载可能需要半秒钟.

  2. 调用不是lstat(),它通常是stat()(在符号链接之后)或fstat64()(它打开文件并可能触发写操作来记录访问时间).

有没有"正确"的方法来做到这一点,这样我最终只是做一个lstat()调用并访问struct stat的成员?到目前为止我从谷歌搜索中找到了什么:

  • JDK 7将在java.nio.file中使用PosixFileAttributes接口,包含我想要的所有东西(但如果我能避免的话,我宁愿不运行我的JDK的每晚构建).

  • 我可以用JNI或JNA滚动我自己的界面(但是如果有现有的话,我宁愿不这样做).

一个以前类似的问题得到了几个建议JNI/JNA实现.一个已经消失,另一个有问题地维护(例如,没有下载,只有一个hg存储库).

那里有更好的选择吗?

Jhe*_*ico 3

看起来您几乎已经涵盖了所有基础知识。当我开始阅读你的问题时,我的第一个想法是 JDK 7 或 JNI。在不了解这些文件的更改模式的情况下,您还可能会研究相关信息的某种持久缓存,例如嵌入式数据库。您还可以考虑除 NFS 之外的其他访问方法,例如从远程主机提供批量文件信息的自定义 Web 服务。