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

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

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

検証プログラムは Github に登録してあります。

よかったら参考にしてみてください。

icatch-lineiterator_mini

photo credit: Adam Lerner via photopin cc

目次

1. ファイルを行単位で読み込む典型処理を簡単に書ける LineIterator クラス

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

LineIterator it = FileUtils.lineIterator(file, "UTF-8");
try {
    while (it.hasNext()) {
        String line = it.nextLine();
        // do something with line
    }
} finally {
    it.close();
}

LineIterator を使えば、ファイルを行単位に読み込んで何か処理する典型的な処理を少しだけ短いコードで書けるようになります。

「コードが簡単に書けるから便利だけど、でも知らなくても困らないかな」っていう印象でスルーしようとしましたが、LineIterator#isValieLine をオーバーライドすると不要な行を読み飛ばしてくれるようです。

これを検証してみます。

2. 動作環境

2-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)

ですが、いろいろ都合があって、pom.xml にはコンパイラのバージョンを 1.6 で定義しています。

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.0</version>
  <configuration>
    <source>1.6</source>
    <target>1.6</target>
    <encoding>UTF-8</encoding>
  </configuration>
</plugin>

2-2. Maven

この検証プログラムは Maven を使ってビルドしています。 プログラム作成時に使用した Maven のバージョンは次の通りです。

$ mvn -v
Apache Maven 3.0.4 (r1232337; 2012-01-17 17:44:56+0900)
Maven home: C:\Users\xxx\maven-3.0.4
Java version: 1.7.0_11, vendor: Oracle Corporation
Java home: C:\Program Files\Java\jdk1.7.0_11\jre
Default locale: ja_JP, platform encoding: MS932
OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows"

2-3. commons-io

pom.xml を見ればそこにバージョンは書いてありますが。

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

3. サンプルプログラムについて

3-1. “#” から始まる行を読み飛ばす LineIterator サンプル

サンプルプログラムは次のものです。

  • net.tomoyamkung.commons_io_sample.lineiterator.CommentSkipLineIterator

JavaDoc を載せておきます。
こんな動作を検証するサンプルプログラムです。

/**
 * ">" から始まる行を読み飛ばす LineIterator クラス。
 * 
 * @author tomoyamkung
 *
 */

CommentSkipLineIterator のテストケースとテストデータは次のものになります。

  • net.tomoyamkung.commons_io_sample.lineiterator.CommentSkipLineIteratorTest
  • src/test/resources/CommentSkipLineIteratorTest.csv

3-2. カラムのフォーマットが正しくない行を読み飛ばす LineIterator サンプル

サンプルプログラムは次のものです。

  • net.tomoyamkung.commons_io_sample.lineiterator.ColumnFormatCheckLineIterator

JavaDoc を載せておきます。
こんな動作を検証するサンプルプログラムです。

/**
 * カラムのフォーマットが正しくない行を読み飛ばす LineIterator クラス。
 * 
 * @author tomoyamkung
 *
 */

ColumnFormatCheckLineIterator のテストケースとテストデータは次のものになります。

  • net.tomoyamkung.commons_io_sample.lineiterator.ColumnFormatCheckLineIteratorTest
  • src/test/resources/ColumnFormatCheckLineIteratorTest.csv

指定したカラムのフォーマットが期待しているものとは違う場合にその行を読み飛ばす、ってことを検証したプログラムです。

4. 動作方法

  1. 本プロジェクトを clone する、もしくはダウンロードする
  2. プロジェクトに移動してビルドする

ビルドコマンドは次の通りです。

$ mvn clean package

上記コマンドを実行すると、次のようにコンソールに出力されます。

# mvn clean package
Listening for transport dt_socket at address: 8000
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building commons-io-sample 0.1
[INFO] ------------------------------------------------------------------------

:
:
:

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running net.tomoyamkung.commons_io_sample.lineiterator.ColumnFormatCheckLineIteratorTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.042 sec
Running net.tomoyamkung.commons_io_sample.lineiterator.CommentSkipLineIteratorTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec

Results :

Tests run: 2, Failures: 0, Errors: 0, Skipped: 0

[INFO] 
[INFO] --- maven-jar-plugin:2.3.2:jar (default-jar) @ commons-io-sample ---
[INFO] Building jar: C:\XXX\commons-io-sample\target\commons-io-sample-0.1.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.867s
[INFO] Finished at: Tue Jan 28 13:40:10 GMT+09:00 2014
[INFO] Final Memory: 9M/244M
[INFO] ------------------------------------------------------------------------

5. まとめ

テキストファイルの読み込み処理をスッキリ書けそうな印象です。

サンプルは CSV を読み込んでアレコレするってものですが、CSV の読み込みであれば、そもそも opencsv などのライブラリを使うほうがベターです。

6. 検証プログラムを Github に登録しました

今回の記事で使用したサンプルプログラムを Github に登録しました。

よかったら参考にしてみてください。

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

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

Googleアドセンス用(PC)

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

関連記事

icatch-8597609828_ab32aba876_z-resized

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

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

記事を読む

commons-io

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

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

記事を読む

icatch-8969238685_14dd418b01_z-resized

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

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

記事を読む

commons-io

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

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

記事を読む

commons-io

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

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

記事を読む

commons-io

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

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

記事を読む

commons-io

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

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

記事を読む

icatch-teacher_3509507274_mini-thumbnail

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

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

記事を読む

no image

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

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

記事を読む

Googleアドセンス用(PC)

Message

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


九 × 9 =

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