/** * 指定されたグロブ・パターンと一致するファイルを検索するサンプル・コード。 * グロブ・パターンの構成に関する詳細は、次の説明を参照してください。 * fileOps.html#glob * * パターンに一致するファイルまたはディレクトリは、標準出力に出力されます。 * また、一致した数も出力されます。 * * このアプリケーションを実行するときは、シェルがワイルド・カードを展開しないように、 * 次のようにグロブ・パターンを引用符で囲む必要があります。 * java Find . -name "*.java" */ import java.io.*; import java.nio.file.*; import java.nio.file.attribute.*; import static java.nio.file.FileVisitResult.*; import static java.nio.file.FileVisitOption.*; import java.util.*; public class JavaFind { public static class Finder extends SimpleFileVisitor { private final PathMatcher matcher; private int numMatches = 0; Finder(String pattern) { matcher = FileSystems.getDefault().getPathMatcher("glob:" + pattern); } //グロブ・パターンとファイル名またはディレクトリ名を比較します。 void find(Path file) { Path name = file.getFileName(); if (name != null && matcher.matches(name)) { numMatches++; System.out.println(file); } } //一致した総数を標準出力に出力します。 void done() { System.out.println("Matched: " + numMatches); } //各ファイルに対してパターン・マッチング・メソッドを呼び出します。 @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) { find(file); return CONTINUE; } //各ディレクトリに対してパターン・マッチング・メソッドを呼び出します。 @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) { find(dir); return CONTINUE; } @Override public FileVisitResult visitFileFailed(Path file, IOException exc) { System.err.println(exc); return CONTINUE; } } static void usage() { System.err.println("java Find -name \"\""); System.exit(-1); } public static void main(String[] args) throws IOException { if (args.length < 3 || !args[1].equals("-name")) usage(); Path startingDir = Paths.get(args[0]); String pattern = args[2]; Finder finder = new Finder(pattern); Files.walkFileTree(startingDir, finder); finder.done(); } }