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

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

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

icatch-10139609144_5bc33706f9_z

photo credit: Some rights reserved by Jesse Clockwork 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. 基本的な使い方

この AgeFileFilter は、指定した日付より過去に作成されたファイル、もしくは、未来に作成されたファイルをピックアップするフィルタクラスになります。

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

File dir = new File(".");
// We are interested in files older than one day
long cutoff = System.currentTimeMillis() - (24 * 60 * 60 * 1000);
String[] files = dir.list( new AgeFileFilter(cutoff) );
for ( int i = 0; i < files.length; i++ ) {
    System.out.println(files[i]);
}

このスニペットを実行すると、前日以前に作成されたファイルが出力されます。

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

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

  • 3-1. 指定日よりも過去に作成されたファイルを取得する
  • 3-2. 指定日よりも未来に作成されたファイルを取得する
  • 3-3. サブディレクトリがあった場合の動作確認

3-1 指定日よりも過去に作成されたファイルを取得する

指定日を 2010/03/01 として、その日を含む過去に作成されたファイルの一覧が取得できることを確認してみました。

public class AgeFileFilterTest {
 
    /**
     * AgeFileFilter の使い方を確認する。
     * 
     * AgeFileFilter のコンストラクタに第2引数を指定しない場合、指定日を含んだ過去に作成されたファイル一覧を取得することを確認する。
     * 
     * ディレクトリに次のファイルがあった場合、、、
     * 
     * <ul>
     * <li>date_2000_01_01.txt → 2000/01/01 が最終更新日時のファイル</li>
     * <li>date_2005_02_01.txt → 2005/02/01 が最終更新日時のファイル</li>
     * <li>date_2010_03_01.txt → 2010/03/01 が最終更新日時のファイル</li>
     * <li>date_2015_04_01.txt → 2015/04/01 が最終更新日時のファイル</li>
     * <li>date_2020_05_01.txt → 2020/05/01 が最終更新日時のファイル</li>
     * </ul>
     * 
     * 指定日を 2010/03/01 で実行すると、上3つのファイルが取得できることを確認する。
     * 
     * @throws Exception
     */
    @Test
    public void 指定日よりも過去に作成されたファイルを取得する_指定日含む() throws Exception {
        // Setup
        Date date = getDate(2010, 3, 1, 0, 0, 0); // 指定日を 2010/03/01 0:00:00 にする
        File dir = getDir(); // テストするディレクトリを取得する
        
        // Exercise
        String[] actual = dir.list(new AgeFileFilter(date));
        
        // Verify
        assertThat("指定日のファイルが実行結果に含まれること", actual.length, is(3)); 
            // 検索結果に 2010/03/01 のファイルが含まれること
        assertThat(actual[0], is("date_2000_01_01.txt")); 
        assertThat(actual[1], is("date_2005_02_01.txt")); 
        assertThat(actual[2], is("date_2010_03_01.txt")); 
    }

    private File getDir() {
        return new File("testdata/org_apache_commons_io_filefilter/age_file_filter_test");
    }

    private Date getDate(int year, int month, int date, int hour, int minute, int second) {
        Calendar instance = Calendar.getInstance();
        instance.set(Calendar.YEAR, year);
        instance.set(Calendar.MONTH, month);
        instance.set(Calendar.DATE, date);
        instance.set(Calendar.HOUR_OF_DAY, hour);
        instance.set(Calendar.MINUTE, minute);
        instance.set(Calendar.SECOND, second);
        return instance.getTime();
        
    }
}

コメントは多めに書きましたが簡単に補足すると、フィルタリングするディレクトリに次の5つのファイルを作成しました。

# ls -R
.:
-rw-r--r-- 1 tomoyamkung 0 1月   1  2000 date_2000_01_01.txt
-rw-r--r-- 1 tomoyamkung 0 2月   1  2005 date_2005_02_01.txt
-rw-r--r-- 1 tomoyamkung 0 3月   1  2010 date_2010_03_01.txt
-rw-r--r-- 1 tomoyamkung 0 4月   1  2015 date_2015_04_01.txt
-rw-r--r-- 1 tomoyamkung 0 5月   1  2020 date_2020_05_01.txt

フィルタリングする指定日を 2010/03/01 とした場合に、実行結果に "date_2010_03_01.txt" も含まれることを確認するテストになります。

結果は "date_2010_03_01.txt" も含まれました。
AgeFileFilter はコンストラクタに第2引数を指定しないと、指定日も含まれる仕様になっています。

3-2 指定日よりも未来に作成されたファイルを取得する

今度は逆に指定日よりも未来に作成されたファイルの一覧が取得できることを確認してみました。

public class AgeFileFilterTest2 {

    /**
     * AgeFileFilter の使い方を確認する。
     * 
     * AgeFileFilter のコンストラクタに第2引数を指定した場合、指定日よりも未来に作成されたファイル一覧を取得することを確認する。
     * 
     * ディレクトリに次のファイルがあった場合、、、
     * 
     * <ul>
     * <li>date_2000_01_01.txt → 2000/01/01 が最終更新日時のファイル</li>
     * <li>date_2005_02_01.txt → 2005/02/01 が最終更新日時のファイル</li>
     * <li>date_2010_03_01.txt → 2010/03/01 が最終更新日時のファイル</li>
     * <li>date_2015_04_01.txt → 2015/04/01 が最終更新日時のファイル</li>
     * <li>date_2020_05_01.txt → 2020/05/01 が最終更新日時のファイル</li>
     * </ul>
     *
     * 指定日を 2010/03/01 で実行すると、下2つのファイルが取得できることを確認する。
     * 
     * @throws Exception
     */
    @Test
    public void 指定日よりも未来に作成されたファイルを取得する_指定日含まない() throws Exception {
        // Setup
        Date date = getDate(2010, 3, 1, 0, 0, 0); // 指定日を 2010/03/01 0:00:00 にする
        File dir = getDir(); // テストするディレクトリを取得する
        
        // Exercise
        Strind[] actual = dir.list(new AgeFileFilter(date, false));
            // 第2引数に false を指定すると指定日よりも未来に作成されたファイルを取得するようになる
        
        // Verify
        assertThat("指定日よりも未来のファイルを取得する場合は、指定日に生成されたファイルが実行結果に含まれないこと", actual.length, is(2)); 
            // 検索結果に 2010/03/01 のファイルが含まれないこと
        assertThat(actual[0], is("date_2015_04_01.txt")); 
        assertThat(actual[1], is("date_2020_05_01.txt")); 
    }

    private File getDir() {
        return new File("testdata/org_apache_commons_io_filefilter/age_file_filter_test");
    }

    private Date getDate(int year, int month, int date, int hour, int minute, int second) {
        Calendar instance = Calendar.getInstance();
        instance.set(Calendar.YEAR, year);
        instance.set(Calendar.MONTH, month);
        instance.set(Calendar.DATE, date);
        instance.set(Calendar.HOUR_OF_DAY, hour);
        instance.set(Calendar.MINUTE, minute);
        instance.set(Calendar.SECOND, second);
        return instance.getTime();
    }
}

AgeFileFilter のコンストラクタの第2引数に false を指定すると、指定日よりも未来に作成されたファイルの一覧が取得できます。

テストデータは先ほどと同じものを使いました。

# ls -R
.:
-rw-r--r-- 1 tomoyamkung 0 1月   1  2000 date_2000_01_01.txt
-rw-r--r-- 1 tomoyamkung 0 2月   1  2005 date_2005_02_01.txt
-rw-r--r-- 1 tomoyamkung 0 3月   1  2010 date_2010_03_01.txt
-rw-r--r-- 1 tomoyamkung 0 4月   1  2015 date_2015_04_01.txt
-rw-r--r-- 1 tomoyamkung 0 5月   1  2020 date_2020_05_01.txt

指定日を 2010/03/01 で実行した場合、結果に "date_2010_03_01.txt" が含まれないことを確認するテストになります。

3-3 サブディレクトリがあった場合の動作確認

上記の2つはカレントディレクトリのファイルについて確認したテストケースになりますが、サブディレクトリに対するフィルタリングを確認したテストになります。

テストデータは次のものを使いました。

# ls -R
.:
合計 4
-rw-r--r--  1 tomoyamkung 0 1月   1  2000 date_2000_01_01.txt
-rw-r--r--  1 tomoyamkung 0 2月   1  2005 date_2005_02_01.txt
-rw-r--r--  1 tomoyamkung 0 3月   1  2010 date_2010_03_01.txt
-rw-r--r--  1 tomoyamkung 0 4月   1  2015 date_2015_04_01.txt
-rw-r--r--  1 tomoyamkung 0 5月   1  2020 date_2020_05_01.txt
drwxr-xr-x+ 1 tomoyamkung 0 8月  22 11:39 subdir

./subdir:
合計 0
-rw-r--r-- 1 tomoyamkung 0 1月   1  2000 subdir_date_2000_01_01.txt
-rw-r--r-- 1 tomoyamkung 0 2月   1  2005 subdir_date_2005_02_01.txt
-rw-r--r-- 1 tomoyamkung 0 3月   1  2010 subdir_date_2010_03_01.txt
-rw-r--r-- 1 tomoyamkung 0 4月   1  2015 subdir_date_2015_04_01.txt
-rw-r--r-- 1 tomoyamkung 0 5月   1  2020 subdir_date_2020_05_01.txt

サブディレクトリ subdir にカレントディレクトリと同じ年月日に作成したファイルを置いてあります。
この状態でフィルタリングするとサブディレクトリのファイルも取得できるのかを検証したテストケースが次のものになります。

public class AgeFileFilterTest3 {

    /**
     * 対象となるディレクトリにサブディレクトリがあった場合の実行結果を確認する。
     * 
     * ファイルが次のようになっていた場合の動作確認。
     * 
     * <ul>
     * <li>date_2000_01_01.txt → 2000/01/01 が最終更新日時のファイル</li>
     * <li>date_2005_02_01.txt → 2005/02/01 が最終更新日時のファイル</li>
     * <li>date_2010_03_01.txt → 2010/03/01 が最終更新日時のファイル</li>
     * <li>date_2015_04_01.txt → 2015/04/01 が最終更新日時のファイル</li>
     * <li>date_2020_05_01.txt → 2020/05/01 が最終更新日時のファイル</li>
     * <li>subdir</li>
     * <ul>
     * <li>subdir_date_2000_01_01.txt → 2000/01/01 が最終更新日時のファイル</li>
     * <li>subdir_date_2005_02_01.txt → 2005/02/01 が最終更新日時のファイル</li>
     * <li>subdir_date_2010_03_01.txt → 2010/03/01 が最終更新日時のファイル</li>
     * <li>subdir_date_2015_04_01.txt → 2015/04/01 が最終更新日時のファイル</li>
     * <li>subdir_date_2020_05_01.txt → 2020/05/01 が最終更新日時のファイル</li>
     * </ul>
     * </ul>
     * 
     * @throws Exception
     */
    @Test
    public void サブディレクトリがある場合に指定日よりも過去に作成されたファイルを取得する() throws Exception {
        // Setup
        Date date = getDate(2010, 3, 1, 0, 0, 0); // 指定日を 2010/03/01 0:00:00 にする
        File dir = getDir(); // テストするディレクトリを取得する
        
        // Exercise
        String[] actual = dir.list(new AgeFileFilter(date));
        
        // Verify
        assertThat("サブディレクトリに指定日よりも過去のファイルがあっても、検索対象はカレントディレクトリのみである", actual.length, is(3)); 
        assertThat(actual[0], is("date_2000_01_01.txt")); 
        assertThat(actual[1], is("date_2005_02_01.txt")); 
        assertThat(actual[2], is("date_2010_03_01.txt")); 
    }

    private File getDir() {
        return new File("testdata/org_apache_commons_io_filefilter/age_file_filter_test");
    }

    private Date getDate(int year, int month, int date, int hour, int minute, int second) {
        Calendar instance = Calendar.getInstance();
        instance.set(Calendar.YEAR, year);
        instance.set(Calendar.MONTH, month);
        instance.set(Calendar.DATE, date);
        instance.set(Calendar.HOUR_OF_DAY, hour);
        instance.set(Calendar.MINUTE, minute);
        instance.set(Calendar.SECOND, second);
        return instance.getTime();
    }
}

指定日は 2010/03/01 のままで実行すると、サブディレクトリのファイルはピックアップされずに、カレントディレクトリのファイルだけがピックアップされました。

AgeFileFilter はカレントディレクトリのファイルしかフィルタリングの対象としない仕様になっているようです。

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

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

Googleアドセンス用(PC)

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

関連記事

commons-io

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

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

記事を読む

commons-io

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

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

記事を読む

commons-io

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

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

記事を読む

icatch-8969238685_14dd418b01_z-resized

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

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

記事を読む

icatch-teacher_3509507274_mini-thumbnail

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

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

記事を読む

icatch-8597609828_ab32aba876_z-resized

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

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

記事を読む

commons-io

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

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

記事を読む

icatch-lineiterator_mini

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

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

記事を読む

commons-io

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

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

記事を読む

Googleアドセンス用(PC)

Message

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


六 + = 13

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