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