忍者ブログ
Flex,Java,Html など、調べた事のメモ帳です。 間違ってたらゴメンなさい。
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

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

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);
        }
    }
}
 



この記事にコメントする
name
title
color
mail
URL
comment
pass   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
secret (チェックを入れると管理人だけに表示できます)
ブログランキング
にほんブログ村 IT技術ブログ IT技術メモへ
 
カレンダー
05 2017/06 07
S M T W T F S
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30
人気ブログランキング
ブログランキング ブログランキング
最新CM
最新TB
ブログ内検索
PR
ATOM  
ATOM 
RSS  
RSS 
Copyright ©   プログラムメモ   All Rights Reserved
Design by MMIT  Powered by NINJA TOOLS
忍者ブログ [PR]