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

时间:2009-12-15 19:05:13

标签: java unix file-io posix

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

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

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

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

    • JDK 7将在java.nio.file中拥有PosixFileAttributes接口,包含我想要的所有内容(但如果可以避免的话,我宁愿不运行我的JDK的每晚构建)。

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

    A previous similar question得到了一些建议的JNI / JNA实现。一个已经消失,另一个有问题(例如,没有下载,只有一个hg存储库)。

    那里有更好的选择吗?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

是的,stat()在所有调用和库下。这是一个延迟问题。但是,您可以同时执行许多stat(),因为有许多NFS服务器守护程序支持您的连接,使用线程除非有人有异步stat()!如果你可以登上主机,就像使用ssh一样,stat()也会便宜得多。您甚至可以编写一个tcp服务来在路径中流式传输并流出stat()。遗憾的是,访问NFS服务器很难或不可能,因为它可能只有管理员帐户,可能是Hitachi SAN或其他东西。