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

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

今回も commons-io の JavaDoc とソースコードを眺めて発見した便利なメソッドや実装のヒントになりそうなスニペットをメモする企画。
commons-io に見るファイル操作処理のヒント(FileBasedTestCase編) に引き続く第2回目。
今回は IOUtils (Commons IO 2.4 API) です。

commons-io

目次

1. ファイルの中身を比較する

もしかしたら、使うことになるかもしれないので。

  • IOUtils#contentEquals
  • IOUtils#contentEqualsIgnoreEOL

前者は1文字ずつ比較、後者は行単位で比較。

改行文字を比較したくない場合は後者を使って、中身を正確に比較したい場合は前者を、という使い分けで。

2. コピーする

IOUtils#copyIOUtils#copyLarge が用意されています。

2GB 以上のものをコピーする場合は IOUtils#copyLarge を使うようなので注意してください。

パラメータ の組み合わせは結構あります。
冗長ですが、全部載せておきます。

  • copy(InputStream input, OutputStream output)
  • copy(InputStream input, Writer output)
  • copy(InputStream input, Writer output, Charset encoding)
  • copy(InputStream input, Writer output, String encoding)
  • copy(Reader input, OutputStream output)
  • copy(Reader input, OutputStream output, Charset encoding)
  • copy(Reader input, OutputStream output, String encoding)
  • copy(Reader input, Writer output)
  • copyLarge(InputStream input, OutputStream output)
  • copyLarge(InputStream input, OutputStream output, byte[] buffer)
  • copyLarge(InputStream input, OutputStream output, long inputOffset, long length)
  • copyLarge(InputStream input, OutputStream output, long inputOffset, long length, byte[] buffer)
  • copyLarge(Reader input, Writer output)
  • copyLarge(Reader input, Writer output, char[] buffer)
  • copyLarge(Reader input, Writer output, long inputOffset, long length)
  • copyLarge(Reader input, Writer output, long inputOffset, long length, char[] buffer)

3. 読み込んだファイルの中身を行単位で保持するイテレータを生成する

ファイルを読み込んで行単位に何か処理する場合、だいたい次のような感じのコードになるかと思います。

String line = "";
BufferedReader bufferedReader = new BufferedReader(reader);
try {
    while((line = bufferedReader.readLine()) != null) {
        // 何かしらの処理
    }
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if(bufferedReader != null) {
        bufferedReader.close();
    }
}

IOUtils#lineIterator を使えば、このようなコードをちょっとだけスッキリ書くことができます。

try {
    LineIterator it = IOUtils#lineIterator(reader);
    while(it.hasNext()) {
        // 何かしらの処理
    }
} finally {
    ...
}

LineIterator では引数の reader を内部で BufferedReader でラップしているため、最初の典型例のコードも LineIterator を使ったコードもやってること自体に変わりはありません。
「中身を保持してくれる人(= Iterator)」が必要な場合は LineIterator を使うといいと思います。

4. 読み込んだファイルの中身を List で返す

読み込んだファイルの中身を行単位で List に格納するメソッドが IOUtils#readLines になります。

「中身全体を List などに持ってしまうと巨大なファイルを扱うときにメモリが気になるから極力控えたほうがいい」と先輩から教わって以来、そういうコードは書かないようにしてきました。
とはいえ、もしかしたら必要になるときが来るかもしれないのでメモ。

5. byte / char 配列に変換する

あまり使わなそうな気がしましたが。
次のメソッドを使うと引数の InputStream や Reader を byte / char 配列に変換してくれます。

  • IOUtils#toByteArray
  • IOUtils#toCharArray

6. Collection の中身を書き出す

Collection に格納されている内容を OutputStream や Writer に書き出してくれます。
文字コードが指定できます。

  • IOUtils#writeLines

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

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

Googleアドセンス用(PC)

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

関連記事

commons-io

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

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

記事を読む

icatch-8969238685_14dd418b01_z-resized

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

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

記事を読む

commons-io

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

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

記事を読む

no image

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

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

記事を読む

commons-io

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

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

記事を読む

icatch-teacher_3509507274_mini-thumbnail

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

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

記事を読む

commons-io

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

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

記事を読む

icatch-8597609828_ab32aba876_z-resized

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

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

記事を読む

icatch-lineiterator_mini

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

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

記事を読む

Googleアドセンス用(PC)

Message

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


− 二 = 7

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