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

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

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

icatch-8597609828_ab32aba876_z

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

この SizeFileFilter は、指定したサイズ(容量)以上のファイルやディレクトリをピックアップするフィルタクラスになります。

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

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

このスニペットを実行すると、カレントディレクトリにあるサイズが 1024 * 1024 以上のファイルやディレクトリが出力されます。

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

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

  • 3-1. フィルタした結果に閾値と同じサイズのファイルが含まれるのかを確認するテスト
  • 3-2. 閾値未満のファイルをフィルタできるのかを確認するテスト
  • 3-3. サブディレクトリがあった場合の動作確認

3.1 フィルタした結果に閾値と同じサイズのファイルが含まれるのかを確認するテスト

いわゆる境界値テストです。

public class SizeFileFilterTest {
    
    /** フィルタリングするファイルのサイズ(単位:バイト) */
    private int size;
 
    @Before
    public void setUp() throws Exception {
        // 1024 バイトを閾値に設定。
        size = 1024;
    }
    
    /**
     * 閾値と同じサイズのファイルが実行結果に含まれるかを確認する。
     * 
     * ディレクトリに次のファイルがあった場合、、、
     * 
     * <ul>
     * <li>size1023.txt → ファイルサイズが 1023 バイトのファイル</li>
     * <li>size1024.txt → ファイルサイズが 1024 バイトのファイル</li>
     * <li>size1025.txt → ファイルサイズが 1025 バイトのファイル</li>
     * </ul>
     * 
     * "size1024.txt" も実行結果に含まれるのかを確認する。
     * 
     * @throws Exception
     */
    @Test
    public void 閾値の動作確認() throws Exception {
        // Setup
        File dir = new File("testdata/org_apache_commons_io_filefilter/size_file_filter_test/dir");
        
        // Exercise
        String[] actual = dir.list(new SizeFileFilter(size));
        
        // Verify
        assertThat(String.format("%d Byte 以上のファイルは2つである", size), actual.length, is(2)); 
            // → size1023.txt は結果に含まれていない
            // → size1024.txt が結果に含まれている
        assertThat(actual[0], is("size1024.txt"));
        assertThat(actual[1], is("size1025.txt"));
    }
}

コメントは多めに書きましたが簡単に補足すると、カレントディレクトリに次の3つのファイルが存在する状態で、、、

ls -l
-rw-r--r--  1 tomoyamkung 1023 yyyy/MM/dd hh:mm:ss size1023.txt
-rw-r--r--  1 tomoyamkung 1024 yyyy/MM/dd hh:mm:ss size1024.txt
-rw-r--r--  1 tomoyamkung 1025 yyyy/MM/dd hh:mm:ss size1025.txt

フィルタリングするファイルサイズを 1024 バイトとした場合に、"size1024.txt" は取得できるのかを確認するというテストケースになっています。

結果は "size1024.txt" が含まれました。
この辺りは実際に使うときになって「あれ、どっちだったっけなぁ?」と迷うところかもしれませんね。

3-2. 閾値未満のファイルをフィルタできるのかを確認するテスト

デフォルトでは閾値以上のファイルをフィルタリングしますが、逆に閾値未満のファイルをフィルタリングできることを確認したテストになっています。

public class SizeFileFilterTest2 {
    
    /** フィルタリングするファイルのサイズ(単位:バイト) */
    private int size;
 
    @Before
    public void setUp() throws Exception {
        // 1024 バイトを閾値に設定。
        size = 1024;
    }
    
    /**
     * 閾値未満のファイルもピックアップできることを確認する。
     * 
     * ディレクトリに次のファイルがあった場合、、、
     * 
     * <ul>
     * <li>size1023.txt → ファイルサイズが 1023 バイトのファイル</li>
     * <li>size1024.txt → ファイルサイズが 1024 バイトのファイル</li>
     * <li>size1025.txt → ファイルサイズが 1025 バイトのファイル</li>
     * </ul>
     * 
     * "size1024.txt" が実行結果に含まれないことを確認する。
     * 
     * @throws Exception
     */
    @Test
    public void 閾値未満のファイルをピックアップする() throws Exception {
        // Setup
        File dir = new File("testdata/org_apache_commons_io_filefilter/size_file_filter_test/dir");
        
        // Exercise
        String[] actual = dir.list(new SizeFileFilter(size, false));
            // SizeFileFilter の第2引数に false を指定すると、第1引数に指定したサイズ未満のファイルをピックアップする
        
        // Verify
        assertThat(String.format("%d Byte のファイルは含まれていないこと", size), actual.length, is(1)); 
        assertThat(actual[0], is("size1023.txt")); 
            // → size1024.txt が結果に含まれていない
    }
}

こちらのテストもカレントディレクトリに次の3つのファイルが存在する状態で、、、

ls -l
-rw-r--r--  1 tomoyamkung 1023 yyyy/MM/dd hh:mm:ss size1023.txt
-rw-r--r--  1 tomoyamkung 1024 yyyy/MM/dd hh:mm:ss size1024.txt
-rw-r--r--  1 tomoyamkung 1025 yyyy/MM/dd hh:mm:ss size1025.txt

"size1023.txt" だけが取得できるのかを確認するというテストケースになっています。

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

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

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

# ls -R
.:
合計 16
-rw-r--r--  1 tomoyamkung 1023 yyyy/MM/dd hh:mm:ss size1023.txt
-rw-r--r--  1 tomoyamkung 1024 yyyy/MM/dd hh:mm:ss size1024.txt
-rw-r--r--  1 tomoyamkung 1025 yyyy/MM/dd hh:mm:ss size1025.txt
drwxr-xr-x+ 1 tomoyamkung 0 yyyy/MM/dd hh:mm:ss subdir

./subdir:
合計 12
-rw-r--r-- 1 tomoyamkung 1023 yyyy/MM/dd hh:mm:ss subdir_size1023.txt
-rw-r--r-- 1 tomoyamkung 1024 yyyy/MM/dd hh:mm:ss subdir_size1024.txt
-rw-r--r-- 1 tomoyamkung 1025 yyyy/MM/dd hh:mm:ss subdir_size1025.txt

サブディレクトリ subdir にカレントディレクトリにあるファイルと同じサイズのファイルを用意しました。

検証したテストケースはこちらです。

public class SizeFileFilterTest3 {
    
    /** フィルタリングするファイルのサイズ(単位:バイト) */
    private int size;
 
    @Before
    public void setUp() throws Exception {
        // 1024 バイトを閾値に設定。
        size = 1024;
    }
    
    /**
     * サブディレクトリがある場合の実行結果がどのようになるのかを確認する。
     * 
     * カレントディレクトリが次のようになっていた場合の動作確認。
     * 
     * <ul>
     * <li>size1023.txt</li>
     * <li>size1024.txt</li>
     * <li>size1025.txt</li>
     * <li>subdir</li>
     * <ul>
     * <li>subdir_size1023.txt</li>
     * <li>subdir_size1024.txt</li>
     * <li>subdir_size1025.txt</li>
     * </ul>
     * </ul>
     * 
     * @throws Exception
     */
    @Test
    public void サブディレクトリのファイルも検査するのか確認する() throws Exception {
        // Setup
        File dir = new File("testdata/org_apache_commons_io_filefilter/size_file_filter_test");
        
        // Exercise
        String[] actual = dir.list(new SizeFileFilter(size));
        
        // Verify
        assertThat(String.format("サブディレクトリ自体もピックアップされること"), actual.length, is(3)); 
        assertThat(actual[0], is("size1024.txt")); 
        assertThat(actual[1], is("size1025.txt")); 
        assertThat(actual[2], is("subdir")); 
            // サブディレクトリにある個々のファイルをピックアップするのではなく、ディレクトリ自体がピックアップされる
    }
}

閾値を 1024 バイトで実行してみると、実行結果は次のようになりました。

  • カレントディレクトリからは "size1024.txt" と "size1025.txt" の2ファイルがフィルタリングされた
  • サブディレクトリは個々のファイルがフィルタリングされるのではなく、サブディレクトリ自体がフィルタリングされた

サブディレクトリの扱いがちょっと意外でした。

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

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

Googleアドセンス用(PC)

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

関連記事

commons-io

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

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

記事を読む

no image

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

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

記事を読む

commons-io

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

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

記事を読む

icatch-teacher_3509507274_mini-thumbnail

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

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

記事を読む

icatch-lineiterator_mini

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

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

記事を読む

commons-io

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

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

記事を読む

commons-io

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

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

記事を読む

commons-io

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

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

記事を読む

icatch-8969238685_14dd418b01_z-resized

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

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

記事を読む

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 ↑