Apache commonsが便利な件(commons-io編)

http://d.hatena.ne.jp/daisuke-m/20080702/1214982943

今回はcommons-io。

commons-io は、入出力まわりの便利クラスを提供してます。commons-langはjava.langの補強でしたが、こちらはjava.ioパッケージの補強、というスタンスです。

IOUtils

closeQuietly

こんなコード良く書きますよね。

InputStream is = null;
try {
 is = ...;
 // ...
} catch (IOException e) {
 // ...
} finally {
 if(is != null) {
   try {
     is.close();
   } catch (IOException e) {
     // ignore
   }
 }
}

だーーー、サンプルコード書いててウザかったw そのくらいウザいじゃないすか、このclose処理。そんなんワンステートメントでなんとかしとけ。ということで。

InputStream is = null;
try {
 is = ...;
 // ...
} catch (IOException e) {
 // ...
} finally {
 IOUtils.closeQuietly(is);
}

おっし、完璧。

contentEquals

2つのInputStreamがあります。それぞれ、普通に読み出すとギガオーダーの入力があるかもしれません。そんなものを byte array なんかに引っ張り出したら即OutOfMemoryしますね。

で、「この2つのInputStreamの内容が、等しいかどうか調べたい」とか、テストメソッド書いて思ったらどーしますか。1文字1文字コツコツ読み込みながら、不一致だった時にfalseを返すメソッド書きますか。もうあるから書かないほうがいいすよ。(Reader版のメソッドもあります)

if(IOUtils.contentEquals(is1, is2)) { ... }

その他、InputStream, OutputStream, Reader, Writer, String間で相互にデータをコピーしたり、色々なメソッドが提供されています。短いことが分かっているInputStreamならば、以下で簡単に読み出せます。

String foo = IOUtils.toString(is);

FilenameUtils

normalize

ユーザに入力させたパス名。ブレますよねぇ。"C:\bar" と "C:\bar\" とか。等価なのに文字列としては違う。"C:\foo\..\bar" と "C:\bar\.\" は同じでしょうか。ほら頭痛い。

こんな変なパス名も、コイツを通せば全部 "C:\bar" になります。

separatorsToUnix, separatorsToWindows, separatorsToSystem

\を/に置き換えたり、色々。当然commonsお得意のnullチェックも搭載。

その他、ディレクトリ・ファイル名・拡張子などを扱うメソッド

がいっぱい。wildcardMatchとかも便利すよー。

FileSystemUtils

ディスク空き容量取得。そんだけ。

FileUtils

例えば、Fileクラスが与えられて、そのファイルをInputStreamまでもっていきたい。JavaのIOまわりのコードって意外と大変。そもそもFileオブジェクトがあっても、そのファイルが存在する保証はないし。もしかしたらディレクトリかも?

さらにInputStreamといわず、内容テキストをStringに落としたい、なんて時。

InputStream is = FileUtils.openInputStream(new File(...));
String content = Fileutils.readFileToString(new File(...));

その他、ディレクトリ内の要素リストアップとか、コピー、タイムスタンプ比較など。Fileクラスにまつわるユーティリティ群。

NullOutputStream, NullWriter, NullInputStream, NullWriter

なーーんもしない。書いても書いても、無視。読んでも読んでも、0。まぁ、Nullオブジェクトパターン用ですかね。

その他、見てみると面白いかもしれないクラス

  • DirectoryWalker
  • 各種FileFilter

このライブラリも、ほとんどのクラスが独立している(依存していない)ので、非常に読みやすいライブラリだと思います。