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-yyyyhh: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. ApacheCommonsLangを使用する

Apache CommonsLangライブラリのFileUtilsクラスを使用することもできます。 このクラスには使いやすいtouch()メソッドがあり、ファイルがまだ存在しない場合は空のファイルも作成されます。

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

ファイルがすでに存在する場合、このメソッドはファイルの変更時刻のみを更新し、アクセス時刻は更新しないことに注意してください。

4. 結論

この記事では、JavaでLinux touchコマンドをシミュレートする方法を見てきました。

いつものように、この記事のサンプルコードは、GitHubにあります。