DirectoryFileFilter を使ったフィルタ処理のサンプル

公開日: : 最終更新日:2014/07/06 commons-io ,

Commons IOorg.apache.commons.io.filefilter (Commons IO 2.4 API) にある DirectoryFileFilter (Commons IO 2.4 API) が便利そうだったのでサンプルを交えて紹介させてもらいます。

icatch-8969238685_14dd418b01_z

photo credit: Some rights reserved by Sebastiaan ter Burg cc

目次

1. 動作確認

動作環境は次の通りです。

まずは Java のバージョン。

$ java -version
java version "1.7.0_11"
Java(TM) SE Runtime Environment (build 1.7.0_11-b21)
Java HotSpot(TM) 64-Bit Server VM (build 23.6-b04, mixed mode)

Commons IO のライブラリは2013年8月13日時点での最新である 2.4 を使いました。

JAR のダウンロードは Maven Repository: Search/Browse/Explore であれば Maven Repository: commons-io » commons-io » 2.4 に dependency が載っています。次はその dependency になります。

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

この dependency を pom.xml に貼り付けて次のコマンドを実行すればローカルリポジトリに JAR がダウンロードされます。

$ mvn eclipse:eclipse -DdownloadSources=true

また Maven などを使わずに JAR をダウンロードする場合は本家サイトからダウンロードできます。ダウンロードページの URL は次になります。

2. 基本的な使い方

この DirectoryFileFilter は、その名の通り、ディレクトリだけをピックアップするフィルタクラスになります。

JavaDoc によると、基本的な使い方は次のようになります。

File dir = new File(".");
String[] files = dir.list(DirectoryFileFilter.INSTANCE);
for (int i = 0; i < files.length; i++) {
    System.out.println(files[i]);
}

このスニペットを実行すると、カレントディレクトリにあるディレクトリが出力されます。

3. サンプルソースコード

サンプルとしてテストケースを2つ作成しました。

  • 3-1. サブディレクトリのフィルタリングを確認するテスト
  • 3-2. DirectoryFileFilter を継承したクラスを使ったフィルタ

3.1 サブディレクトリのフィルタリングを確認するテスト

サブディレクトリもフィルタリングしてくれるのかを確認するテストになっています。

public class DirectoryFileFilterTest {
    
    private File dir;

    @Before
    public void setUp() throws Exception {
        dir = new File("testdata/org_apache_commons_io_filefilter/directory_file_filter_test");
    }

    @Test
    public void ディレクトリのみを取得する() throws Exception {
        // Setup
        // Exercise
        String[] actual = dir.list(DirectoryFileFilter.DIRECTORY);
        
        // Verify
        assertThat("入れ子のディレクトリはフィルタの対象外である", actual.length, is(2));
        assertThat(actual[0], is("dir2"));
        assertThat(actual[1], is("hoge_dir1"));
    }
}

テストデータは次のディレクトリとファイルを作りました。

# ls -R
.:
dir2  fileX.txt  hoge_dir1

./dir2:
sub_dir2_1

./dir2/sub_dir2_1:
file2_1.txt

./hoge_dir1:
file1.txt

ちょっと分かりにくいですが、カレントディレクトリに dir2 というディレクトリがあり、sub_dir2_1 という名前のサブディレクトリを持っています。もし、入れ子のディレクトリもフィルタリングしてくれるのであれば、sub_dir2_1 も拾ってくれることになります。

が、実行してみると取得するディレクトリの数は2つでした。どうやらカレントディレクトリだけしか対象になっていないようです。ここはちょっと注意すべきところになりそうです。

3-2. DirectoryFileFilter を継承したクラスを使ったフィルタ

DirecotryFileFilter を継承したクラスでフィルタした場合の動作を確認するものです。

public class DirectoryFileFilterTest2 {
    
    private File dir;

    @Before
    public void setUp() throws Exception {
        dir = new File("testdata/org_apache_commons_io_filefilter/directory_file_filter_test");
    }

    @Test
    public void 継承したクラスでの動作確認() throws Exception {
        // Setup
        // Exercise
        String[] actual = dir.list(new CustomDirectoryFileFilter());
        
        // Verify
        assertThat("hoge から始まるディレクトリは1つである", actual.length, is(1));
        assertThat(actual[0], is("hoge_dir1"));
    }
    
    /**
     * DirectoryFileFilter を継承したクラス。
     * 
     * ディレクトリ名が "hoge" から始まるものをピックアップするクラス。
     * 
     * @author tomoyamkung
     *
     */
    class CustomDirectoryFileFilter extends DirectoryFileFilter {

        private static final long serialVersionUID = -8061218320524169863L;
        
        /* (non-Javadoc)
         * @see org.apache.commons.io.filefilter.DirectoryFileFilter#accept(java.io.File)
         */
        @Override
        public boolean accept(File file) {
            return file.getName().startsWith("hoge");
            // "hoge" から始まるディレクトリをピックアップ対象とする
        }
    }
}

CustomDirectoryFileFilterDirecotryFileFilter を継承したクラスになり、accept() メソッドをオーバーライドしています。ディレクトリ名が "hoge" から始まるディレクトリをピックアップする、というフィルタクラスになっています。

テストデータは 3-1. サブディレクトリのフィルタリングを確認するテスト と同じです。

# ls -R
.:
dir2  fileX.txt  hoge_dir1

./dir2:
sub_dir2_1

./dir2/sub_dir2_1:
file2_1.txt

./hoge_dir1:
file1.txt

テストの実行結果から分かるように "hoge_dir1" だけがフィルタリングされています。

4. その他の commons-io に関する記事

commons-io に関する記事は次の通りです。
気になる記事があったらぜひチェックしてみてください!

Googleアドセンス用(PC)

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

関連記事

icatch-8597609828_ab32aba876_z-resized

SizeFileFilter を使ったフィルタ処理のサンプル

Commons IO の org.apache.commons.io.filefilter (Com

記事を読む

icatch-lineiterator_mini

Commons IO の LineIterator#isValidLine メソッドをオーバーライドしたサンプル

CommonsIO にテキストファイルの読み込み処理で役立ちそうなクラスがあったので検証してみました

記事を読む

commons-io

commons-io に見るファイル操作処理のヒント(IOUtils編)

今回も commons-io の JavaDoc とソースコードを眺めて発見した便利なメソッドや実装

記事を読む

icatch-teacher_3509507274_mini-thumbnail

commons-io に見るファイル操作処理のヒント(FilenameUtils編)

commons-io の JavaDoc とソースコードを眺めて発見した便利なメソッドや実装のヒント

記事を読む

no image

AgeFileFilter を使ったフィルタ処理のサンプル

Commons IO の org.apache.commons.io.filefilter (Com

記事を読む

commons-io

拡張子を指定したフィルタの実装サンプル

Commons-io の FileFilter のサンプルをいくつか書いてみたのでメモしておきます。

記事を読む

commons-io

commons-io に見るファイル操作処理のヒント(FileUtils編その1)

今回も commons-io の JavaDoc とソースコードを眺めて発見した便利なメソッドや実装

記事を読む

commons-io

commons-io に見るファイル操作処理のヒント(FileBasedTestCase編)

次のプロジェクトはファイルを頻繁に扱うので、楽を出来ないかと Commons IO の JavaDo

記事を読む

commons-io

commons-io に見るファイル操作処理のヒント(FileUtils編その2)

commons-io の JavaDoc とソースコードを眺めて発見した便利なメソッドや実装のヒント

記事を読む

Googleアドセンス用(PC)

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


二 + = 4

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Googleアドセンス用(PC)

icatch-jersey_multi_pathparams
Jerseyの@PathParamはスラッシュの間に複数指定できる

http://hoge-api/user/{id}.{format}

icatch-vagrant_box_customize
VagrantのBoxファイルをカスタマイズして独自のBoxファイルを作成する

配布されている Vagrant の Box ファイルを使って検証環境を

icatch-2015-006-1
バリデーションチェックにJava8のOptionalを使ってスマートに書く(自分比)

Web アプリのバリデーションチェックにアノテーションを使うことが増え

icatch-2015-005-1
ユニットテストの偏りを防ぐ命名規則の付け方

ユニットテスト名に以下の命名規則を付けるようにして二ヶ月ぐらい経った。

icatch-2015-004-1
Vagrantで起動したCentOS上のOctopressをホストOSから確認する設定

タイトルの通りだが、Vagrant を使って起動した CentOS に

→もっと見る

PAGE TOP ↑