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

公開日: : 最終更新日:2014/01/27 commons-io ,

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

commons-io

目次

1. サンプル作成の経緯

過去のコードを見返す機会があって、その中でファイルのフィルタリングを自前でゴリゴリ書いている部分に目が止まりました。

このところ、Commons IO – Commons IO Overview のことを調べているからだと思いますが「確かフィルタって自分でゴリゴリ実装しなくてもさらっと書けたよなぁ」ってことに気がついたので、ファイルフィルタのサンプルをいくつか実装してみました。

2. 動作環境

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

2-1. Java

まずは 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)

2-2. commons-io

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

JAR のダウンロードは Maven Repository であれば Maven Repository: commons-io » commons-io » 2.4 に dependency が載っています。

次は commons-io の 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 は次になります。

3. 自前でゴリゴリ書くパターン

指定した拡張子と一致するファイルを取得するフィルタクラスを自分でゴリゴリ実装してみました。

/**
 * 指定した拡張子と一致するファイルを取得するフィルタクラス。
 * 
 * @author tomoyamkung
 *
 */
public class ExtensionFileFilter implements FilenameFilter {

    private String extension;

    public ExtensionFileFilter(String extension) {
        this.extension = extension;
    }

    @Override
    public boolean accept(File dir, String name) {
        File file = new File(name);
        if(file == null || file.isDirectory()) {
            return false;
        }
        return name.endsWith(extension);
    }

}

このフィルタクラスのテストケースは次の通りです。

public class ExtensionFileFilterTest {

    @Test
    public void 拡張子がtxtのファイル名を取得する() throws Exception {
        // Setup
        String extension = ".txt";
        ExtensionFileFilter filter = new ExtensionFileFilter(extension);
        File dir = new File("testdata/file_filter_test");
        
        // Exercise
        String[] list = dir.list(filter);
        
        // Verify
        assertThat(list.length, is(2));
        assertThat(list[0], is("hoge1.txt"));
        assertThat(list[1], is("hoge2.txt"));
    }

}

テストデータですが testdata/file_filter_test ディレクトリに次のファイルが存在する想定となっています。

  • hoge1.txt
  • hoge2.txt
  • piyo.jpg
  • var.csv

4. FileUtils#iterateFiles を使ったファイルフィルタ

続いて、FileUtils#iterateFiles を使ったファイルフィルタです。

public class FileUtilsTest {

    @Test
    public void 拡張子がtxtのFileオブジェクトを取得する() throws Exception {
        // Setup
        File directory = new File("testdata/commons_io_fileutils/fileutilstest");
        String[] extensions = {"txt"};
        boolean recursive = false;
        
        // Exercise
        Iterator<File> actual = FileUtils.iterateFiles(directory, extensions, recursive);
        
        // Verify
        assertThat(actual.hasNext(), is(true));
        File next = actual.next();
        assertThat(next.getName(), is("hoge1.txt"));
        
        assertThat(actual.hasNext(), is(true));
        next = actual.next();
        assertThat(next.getName(), is("hoge2.txt"));
        
        assertThat(actual.hasNext(), is(false));
    }
}

これはテストケースのみです。
FileUtils.iterateFiles に検索対象のディレクトリとフィルタする拡張子を指定して動作確認しています。

テストデータですが testdata/commons_io_fileutils/fileutilstest ディレクトリに次のファイルが存在する想定となっています。

  • hoge1.txt
  • hoge2.txt
  • piyo.jpg
  • var.csv

5. SuffixFileFilter を使ったファイルフィルタ

最後に、SuffixFileFilter を使ったファイルフィルタです。

public class SuffixFileFilterTest {

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

    @Test
    public void 拡張子がtxtのファイル名を取得する() throws Exception {
        // Setup
        String suffix = ".txt";
        
        // Exercise
        String[] list = dir.list(new SuffixFileFilter(suffix));
        
        // Verify
        assertThat(list.length, is(2));
        assertThat(list[0], is("hoge1.txt"));
        assertThat(list[1], is("hoge2.txt"));
    }
    
    @Test
    public void 拡張子がjpgとcsvのファイル名を取得する() throws Exception {
        // Setup
        String[] suffix = {".jpg", ".csv"};
        
        // Exercise
        String[] list = dir.list(new SuffixFileFilter(suffix));
        
        // Verify
        assertThat(list.length, is(2));
        assertThat(list[0], is("piyo.jpg"));
        assertThat(list[1], is("var.csv"));
    }

}

これもテストケースのみです。

ここでは次のフィルタの動作確認をしています。

  • 拡張子が txt のファイルをフィルタする
  • 拡張子が jpg と csv のファイルをフィルタする

テストデータですが testdata/org_apache_commons_io_filefilter/suffix_file_filter_test ディレクトリに次のファイルが存在する想定となっています。

  • hoge1.txt
  • hoge2.txt
  • piyo.jpg
  • var.csv

6. 自作は最後に検討する

自作は柔軟に実装できますが、コストとバグの心配があります。

org.apache.commons.io.filefilter パッケージには SuffixFileFilter 以外にも次のようなフィルタクラスが用意されています。

  • AgeFileFilter
  • DirectoryFileFilter
  • EmptyFileFilter
  • FileFileFilter
  • HiddenFileFilter
  • NameFileFilter
  • PrefixFileFilter
  • SizeFileFilter
  • WildCardFileFilter

まずはこれらのフィルタクラスを検討してみて、それでも難しいようであれば自作を検討されるのがベターかなと思います。

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

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

Googleアドセンス用(PC)

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

関連記事

commons-io

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

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

記事を読む

icatch-lineiterator_mini

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

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

記事を読む

no image

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

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

記事を読む

icatch-8969238685_14dd418b01_z-resized

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

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

記事を読む

commons-io

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

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

記事を読む

commons-io

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

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

記事を読む

icatch-8597609828_ab32aba876_z-resized

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

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

記事を読む

icatch-teacher_3509507274_mini-thumbnail

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

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

記事を読む

commons-io

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

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

記事を読む

Googleアドセンス用(PC)

Message

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


3 × 二 =

次の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 ↑