1. 概要

このチュートリアルでは、Javaでワイルドカード文字列を使用してファイルを検索する方法を学習します。

2. 序章

プログラミングの領域では、globはファイル名と一致するワイルドカードを使用したパターンです。 この例では、globパターンを使用してファイル名のリストをフィルタリングします。 人気のワイルドカード「*」と「?」を使用します。 Javaは、JavaSE7以降この機能をサポートしています。

Javaは、FileSystemクラスにgetPathMatcher()メソッドを提供しています。 正規表現(regex)またはグロブパターンのいずれかを取ることができます。 この例では、正規表現と比較してワイルドカードを適用するのが簡単なため、グロブパターンを利用します。

このメソッドをグロブパターンで使用する例を見てみましょう。

String pattern = "myCustomPattern";
PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:" + pattern);

Javaのグロブパターンの例を次に示します。

グロブ 説明
*。java 拡張子が「java」のすべてのファイルに一致します
*。{java、class} 拡張子が「java」または「class」のすべてのファイルに一致します
*.* すべてのファイルを「。」で照合します。 その名前のどこかに
???? 名前に4文字が含まれるすべてのファイルに一致します
[テスト].docx ファイル名が「t」、「e」、「s」、または「t」で拡張子が「docx」のすべてのファイルに一致します
[0-4] .csv ファイル名が「0」、「1」、「2」、「3」、または「4」で拡張子が「csv」のすべてのファイルに一致します
C:\\ temp \\\ Windowsシステムの「C:\temp」ディレクトリ内のすべてのファイルに一致します
src / test / * Unixベースのシステムの「src/test/」ディレクトリ内のすべてのファイルに一致します

3. 実装

このソリューションの実装の詳細を見てみましょう。 このタスクを完了するには2つのステップがあります。

最初に、2つの引数を取るメソッドを作成します。検索するルートディレクトリと検索するワイルドカードパターンです。このメソッドには、globパターンを利用して、すべてのファイルとディレクトリにアクセスするためのプログラミングロジックが含まれます。最後に、一致するファイル名のリストを返します。

次に、Javaが提供するFilesクラスのwalkFileTreeメソッドを使用して、検索プロセスを呼び出します。

まず、 searchWithWc()メソッドを使用して SearchFileByWildcard クラスを作成します。このメソッドは、PathおよびStringパターンをパラメーターとして受け取ります。

class SearchFileByWildcard {
    static List<String> matchesList = new ArrayList<String>();
    List<String> searchWithWc(Path rootDir, String pattern) throws IOException {
        matchesList.clear();
        FileVisitor<Path> matcherVisitor = new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attribs) throws IOException {
                FileSystem fs = FileSystems.getDefault();
                PathMatcher matcher = fs.getPathMatcher(pattern);
                Path name = file.getFileName();
                if (matcher.matches(name)) {
                    matchesList.add(name.toString);
                }
	        return FileVisitResult.CONTINUE;
            }
        };
        Files.walkFileTree(rootDir, matcherVisitor);
        return matchesList;
    }
}

rootDir 内のファイルにアクセスするには、FileVisitorインターフェイスを使用します。 getDefault()メソッドを呼び出してファイルシステムへのインターフェイスを取得したら、 FileSystemクラスのgetPathMatcher()メソッドを使用します。 ここで、rootDir内の個々のファイルパスにglobパターンを適用します。

この場合、結果の PathMatcher を使用して、一致するファイル名のArrayListを取得できます。

最後に、NIO FilesクラスからwalkFileTreeメソッドを呼び出します。 ファイルトラバーサルはrootDirから始まり、ツリー内の各ノードは深さ優先の方法で再帰的にアクセスされます。 matcherVisitor には、SimpleFileVisitorクラスのvisitFileメソッドの実装が含まれています。

ワイルドカードベースのファイル検索の実装について説明したので、いくつかのサンプル出力を見てみましょう。 例では、次のファイル構造を使用します。

String “ glob:*。{txt、docx}” パターンで渡すと、コードは拡張子“ txt”の3つのファイル名を出力します。拡張子が“ docx” の1つのファイル名:

SearchFileByWildcard sfbw = new SearchFileByWildcard();
List<String> actual = sfbw.searchWithWc(Paths.get("src/test/resources/sfbw"), "glob:*.{txt,docx}");

assertEquals(new HashSet<>(Arrays.asList("six.txt", "three.txt", "two.docx", "one.txt")), 
  new HashSet<>(actual));

String “ glob:????。{csv}” パターンで渡すと、コードは4文字の後に「。」が続く1つのファイル名を出力します。 拡張子「csv」

SearchFileByWildcard sfbw = new SearchFileByWildcard();
List<String> actual = sfbw.searchWithWc(Paths.get("src/test/resources/sfbw"), "glob:????.{csv}");

assertEquals(new HashSet<>(Arrays.asList("five.csv")), new HashSet<>(actual));

4. 結論

このチュートリアルでは、Javaでワイルドカードパターンを使用してファイルを検索する方法を学びました。

ソースコードは、GitHubから入手できます。