Java プログラムメモ


トップ

ファイルの一覧を再帰的に探索する

Unix の find コマンドの様に、ファイルの一覧を再帰的に処理を行い、サブディレクトリも含めて全て探索する方法を紹介します。

ファイル名のマッチングには FilenameFilter を利用します。正規表現を使用できるようにしてあります。

FilenameFilter の実装例

public class FileNamePatternFilter implements FilenameFilter { private Pattern namePattern_; public FileNamePatternFilter(Pattern namePattern) { if (namePattern == null) { throw new NullPointerException(); } namePattern_ = namePattern; } public boolean accept(File dir, String name) { return namePattern_.matcher(name).matches(); } }

ファイルの一覧を取得する為に、FileFinder クラスを作成します。find の機能制限版みたいな物です。
find() にてファイルの探索を行い、listFiles() ファイルの一覧の取得、print() で標準出力への出力を行います。

FileFinder の実装例

public class FileFinder { private File base_; private FileNamePatternFilter filter_; private List list_; public FileFinder(File base, Pattern pattern) { if (base == null || pattern == null) { throw new NullPointerException(); } base_ = base; filter_ = new FileNamePatternFilter(pattern); list_ = new ArrayList(); find(); } public FileFinder(File base, String regex) { this(base, Pattern.compile(regex)); } public FileFinder(String baseDir, String regex) { this(new File(baseDir), Pattern.compile(regex)); } public File[] listFiles() { File[] arr = new File[list_.size()]; return (File[])list_.toArray(arr); } public String[] list() { List list = new ArrayList(); for (Iterator it = list_.iterator(); it.hasNext();) { list.add(((File)it.next()).getPath()); } String[] arr = new String[list.size()]; return (String[])list.toArray(arr); } public void print() { String[] lists = list(); for (int i = 0; i < lists.length; i++) { System.out.println(lists[i]); } } public void find() { list_.clear(); findPattern(base_); findDirectory(base_.listFiles()); } private void findDirectory(File[] baseDirs) { for (int i = 0; i < baseDirs.length; i++) { findPattern(baseDirs[i]); if (baseDirs[i].isDirectory()) { findDirectory(baseDirs[i].listFiles()); } } } private void findPattern(File directory) { File[] matches = directory.listFiles(filter_); for (int i = 0; i < matches.length; i++) { list_.add(matches[i]); } } // print. public static void main(String[] args) { try { FileFinder finder = new FileFinder(args[0], args[1]); finder.print(); } catch (Exception e) { System.err .println("Usage:java com.fc2web.himtodo.FileFinder" + " directory regex"); System.exit(-1); } } }


プログラムメモ アフリカ雑貨・珈琲豆・アールブリュット作品 マゴソスクール クラウドファンディング
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送