使用尽可能少的 IO 操作读取树中所有文件的文件属性

Read file attibutes for all files in the tree using as few IO operation as possible

我的 NFS 驱动器(在我的例子中是 Amazon EFS)上有很多小文件。文件通过 HTTP 协议提供,与它所做的经典 Web 服务器非常相似。由于我需要验证文件的最后修改,因此每个文件请求至少需要一个 I/O。即使我已经将文件主体缓存在 RAM 中也是如此。

有没有办法只使用一个 I/O 操作来读取树中所有文件(或至少在一个目录中)的最后修改属性?

这里有一个方法 Files.readAttributes,它以批量操作的形式读取单个文件的多个属性。我正在寻找批量操作来读取多个文件的单个属性。

更新: 如果是 NFS,这个问题是如何使用 NFS 命令 READDIRPLUS。这个命令完全符合我的需要,但似乎无法从 Java I/O 库中使用它。

我认为这个问题可能与 Getting the last modified date of a file in Java 重复。尽管如此,我认为如果你使用 File class 的 lastModified(),你可能使用最少的 IO 操作。因此,为此,我会使用类似于 icyrock.com 的答案。这将是:

new File("/path/to/file").lastModified()

另外,java - File lastModified vs reading the file 问题的答案或许能为您提供有用的信息。

我不知道在一次操作中列出所有文件和修改时间的标准 Java class,但是如果您被允许使用主机环境并且 NFS 驱动器是安装您可以采用以下技术以适应您的环境:

ProcessBuilder listFiles = new ProcessBuilder("bash", "", "ls -l");
Process p = listFiles.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
String inputLine;
List<String> filesWithAttributes = new ArrayList<String>();

while ((inputLine = reader.readLine()) != null) {
    filesWithAttributes.add(inputLine);
}