1. 概述

Linux 中的 touch 命令是一个便捷的方式,用于改变文件或目录的访问时间和修改时间,也可以快速创建一个空文件。在这篇简短教程中,我们将学习如何在 Java 中模拟这个命令。

2. 使用纯 Java

2.1. 创建 touch 方法

首先,我们来在 Java 中实现 touch 方法。这个方法会在文件不存在时创建一个空文件,可以更改文件的访问时间和修改时间,或者两者都更改。此外,它还可以接受用户输入的自定义时间:

public static void touch(String path, String... args) throws IOException, ParseException {
    File file = new File(path);
    if (!file.exists()) {
        file.createNewFile();
        if (args.length == 0) {
            return;
        }
    }
    long timeMillis = args.length < 2 ? System.currentTimeMillis() : new SimpleDateFormat("dd-MM-yyyy hh:mm:ss").parse(args[1]).getTime();
    if (args.length > 0) {
        // change access time only
        if ("a".equals(args[0])) {
            FileTime accessFileTime = FileTime.fromMillis(timeMillis);
            Files.setAttribute(file.toPath(), "lastAccessTime", accessFileTime);
            return;
        }
        // change modification time only
        if ("m".equals(args[0])) {
            file.setLastModified(timeMillis);
            return;
        }
    }
    // other inputs will change both
    FileTime accessFileTime = FileTime.fromMillis(timeMillis);
    Files.setAttribute(file.toPath(), "lastAccessTime", accessFileTime);
    file.setLastModified(timeMillis);
}

如上所示,我们的方法使用了可变参数(varargs),以避免方法重载,并且可以将格式为 "dd-MM-yyyy hh:mm:ss" 的自定义时间传递给该方法。

2.2. 使用 touch 方法

现在,我们用这个方法创建一个空文件:

touch("test.txt");

然后使用 Linux 中的 stat 命令查看文件信息:

stat test.txt

我们可以看到文件的访问和修改时间在 stat 输出中:

Access: 2021-12-07 10:42:16.474007513 +0700
Modify: 2021-12-07 10:42:16.474007513 +0700

接下来,我们用这个方法更改文件的访问时间:

touch("test.txt", "a", "16-09-2020 08:00:00");

再次使用 stat 命令查看文件信息:

Access: 2020-09-16 08:00:00.000000000 +0700
Modify: 2021-12-07 10:42:16.474007000 +0700

3. 使用 Apache Commons Lang

我们还可以使用 Apache Commons Lang 库中的 FileUtils 类。这个类有一个易于使用的 touch() 方法,如果文件不存在,它也会创建一个空文件:

FileUtils.touch(new File("/home/baeldung/test.txt"));

请注意,如果文件已经存在,此方法只会更新文件的修改时间,不会更改访问时间

4. 总结

在这篇文章中,我们了解了如何在 Java 中模拟 Linux 中的 touch 命令。如往常一样,本文的示例代码可在 GitHub 上找到。


» 下一篇: JBang指南