1. 概要

このクイックチュートリアルでは、Javaの特定のディレクトリで最後に変更されたファイルを見つける方法を詳しく見ていきます。

まず、レガシーIO最新のNIOAPIから始めます。 次に、 Apache CommonsIOライブラリを使用して同じことを実現する方法を説明します。

2. を使用して java .io API

従来のjava.ioパッケージは、ファイルとディレクトリのパス名の抽象表現をカプセル化するためのFileクラスを提供します。

ありがたいことに、 ファイルクラスには、という便利なメソッドが付属しています最終更新日()。 このメソッドは、抽象パス名で示されるファイルの最終変更時刻を返します

次に、 java.io.Fileクラスを使用して目的を達成する方法を見てみましょう。

public static File findUsingIOApi(String sdir) {
    File dir = new File(sdir);
    if (dir.isDirectory()) {
        Optional<File> opFile = Arrays.stream(dir.listFiles(File::isFile))
          .max((f1, f2) -> Long.compare(f1.lastModified(), f2.lastModified()));

        if (opFile.isPresent()){
            return opFile.get();
        }
    }

    return null;
}

ご覧のとおり、 Java 8 StreamAPIを使用してファイルの配列をループします。 次に、 max()操作を呼び出して、最新の変更が加えられたファイルを取得します

オプションのインスタンスを使用して、最後に変更されたファイルをカプセル化することに注意してください。

このアプローチは古風で時代遅れと見なされていることに注意してください。 ただし、JavaレガシーIOワールドとの互換性を維持したい場合は使用できます。

3.3。 使用する the java .nio API

NIO APIの導入は、ファイルシステム管理のターニングポイントです。 Java7に同梱されている新しいバージョンのNIO.2には、ファイルの管理と操作を改善するための一連の拡張機能が付属しています。

実際のところ、 java.nio.file.Files クラスは、Javaでのファイルとディレクトリの操作に関して非常に柔軟性があります。

それでは、 Files クラスを使用して、ディレクトリ内の最後に変更されたファイルを取得する方法を見てみましょう。

public static Path findUsingNIOApi(String sdir) throws IOException {
    Path dir = Paths.get(sdir);
    if (Files.isDirectory(dir)) {
        Optional<Path> opPath = Files.list(dir)
          .filter(p -> !Files.isDirectory(p))
          .sorted((p1, p2)-> Long.valueOf(p2.toFile().lastModified())
            .compareTo(p1.toFile().lastModified()))
          .findFirst();

        if (opPath.isPresent()){
            return opPath.get();
        }
    }

    return null;
}

最初の例と同様に、ファイルのみを取得するためにSteamAPIに依存しています。 次に、ラムダ式を使用して、最終変更時刻に基づいてファイルを並べ替えます。

4. ApacheCommonsIOの使用

Apache Commons IOは、ファイルシステム管理を次のレベルに引き上げました。 便利なクラス、ファイルコンパレータ、ファイルフィルタなどのセットを提供します。

幸いなことに、ライブラリには LastModifiedFileComparatorクラスがあり、 コンパレータとして使用して、ファイルの配列を最終変更時刻で並べ替えることができます。

まず、commons-io依存関係pom.xmlに追加する必要があります。

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.11.0</version>
</dependency>

最後に、ApacheCommonsIOを使用してフォルダー内で最後に変更されたファイルを見つける方法を紹介しましょう。

public static File findUsingCommonsIO(String sdir) {
    File dir = new File(sdir);
    if (dir.isDirectory()) {
        File[] dirFiles = dir.listFiles((FileFilter)FileFilterUtils.fileFileFilter());
        if (dirFiles != null && dirFiles.length > 0) {
            Arrays.sort(dirFiles, LastModifiedFileComparator.LASTMODIFIED_REVERSE);
            return dirFiles[0];
        }
     }

    return null;
}

上記のように、 シングルトンインスタンスLASTMODIFIED_REVERSEを使用して、ファイルの配列を逆の順序で並べ替えます

配列は逆にソートされるため、最後に変更されたファイルが配列の最初の要素になります。

5. 結論

このチュートリアルでは、特定のディレクトリで最後に変更されたファイルを見つけるためのさまざまな方法を検討しました。 その過程で、JDKおよびApacheCommonsIO外部ライブラリの一部であるAPIを使用しました。

いつものように、例の完全なコードソースは、GitHubから入手できます。