Simulate touch Command in Java – 在Java中模拟触摸命令

最后修改: 2021年 12月 22日

中文/混合/英文(键盘快捷键:t)

1. Overview

1.概述

The touch command in Linux is a handy way to change the access time and modification time of a file or directory. It can also be used to create an empty file quickly.

Linux中的touch命令是改变一个文件或目录的访问时间和修改时间的一种方便的方法。它也可以用来快速创建一个空文件。

In this short tutorial, we’ll see how to simulate this command in Java.

在这个简短的教程中,我们将看到如何在Java中模拟这个命令。

2. Use Plain Java

2.使用普通的Java

2.1. Create Our touch Method

2.1.创建我们的touch方法

Let’s create our touch method in Java. This method will create an empty file if the file doesn’t exist. It can change the access time or modification time of the file, or both.

让我们在Java中创建我们的touch方法。如果文件不存在,这个方法将创建一个空文件。它可以改变文件的访问时间或修改时间,或者两者都改变。

Moreover, it can also use the custom time passed in from input:

此外,它还可以使用从输入中传入的自定义时间。

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);
}

As can be seen above, our method uses varargs to avoid overloading, and we can pass a custom time into this method in “dd-MM-yyyy hh:mm:ss” format.

从上面可以看出,我们的方法使用varargs来避免重载,我们可以将自定义的时间以 “dd-MM-yyy hh:mm:ss “格式传入这个方法。

2.2. Use Our touch Method

2.2.使用我们的touch方法

Let’s create an empty file with our method:

让我们用我们的方法创建一个空文件。

touch("test.txt");

And use the stat command in Linux to view file information:

并在Linux中使用stat命令来查看文件信息。

stat test.txt

We can see the access and modification times of the file in the stat output:

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

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

Now, let’s change its access time with our method:

现在,让我们用我们的方法改变它的访问时间。

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

Then we’ll get this file information with the stat command again:

然后我们再用stat命令获得这个文件信息。

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

3. Use Apache Commons Lang

3.使用Apache Commons Lang

We can also use the FileUtils class from the Apache Commons Lang library. This class has an easy-to-use touch() method, which will also create an empty file if the file doesn’t exist yet:

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

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

Note that if the file already exists, this method will only update the modification time of the file, not the access time.

请注意,如果文件已经存在,这个方法将只更新文件的修改时间,而不是访问时间。

4. Conclusion

4.总结

In this article, we’ve seen how to simulate the Linux touch command in Java.

在这篇文章中,我们已经看到了如何在Java中模拟Linux的touch命令。

As always, the example code from this article can be found over on GitHub.

一如既往,本文中的示例代码可以在GitHub上找到over