Apache Commonsの導入 - Scala覚書
-
概要
かゆいところに手が届くJavaのライブラリ、Apache Commonsの導入と簡易なサンプル。
@Author mwSoft
@Date 2010/11/30
@Env Scala2.8 -
Apache Commonsとは
Apache Commonsは、あると一手間省けるような便利機能を大量に盛り込んだライブラリです。C++で言えばBoost・・・・とは少し違うな。RubyのActiveSupportみたいなもの、と言った方が近いだろうか。
Apache系のJavaのプロジェクトではたいてい利用されているのでJavaを使っていれば見かけることも多い。StrutsとかHadoopとかLuceneの中でも使われてます。
個人的に良く使っているのは、以下の6つあたり。
名称 概要 API Lang java.lang配下の機能をもう少し便利にしたような機能群。 ● IO ファイルの入出力やファイル名を取り扱う機能など。 ● Collections Collectionの操作機能や、プリミティブなCollectionなど。 ● DBUtils DB操作。StatementやResultSetを省略して結果を取れたり。 ● CLI コマンドライン引数をいい感じに受け取れる ● Logging ログ機能。Apache系のライブラリの内部で良く使われてる。 ● 他にも以下のような割と面白い機能もある。
名称 概要 API Compress Zip、Tar、Gzip、Bzip2などの圧縮解凍ができる。速度は期待しない。 ● Daemon プログラムをデーモンで動かす。 ● Math 行列計算とか、回帰分析とか、そっち系。 ● Codec Base64とかBinaryとかのコーデック。 ● 名称をクリックするとそのライブラリの公式ページに、APIをクリックするとJavaDocページに飛びます。
-
EclipseでのCommonsの導入
公式ページから1個ずつ地道にファイルを落としてきて展開し、中に入っているJARファイルを以下の画像のような感じでlibフォルダに放り込みます。
1個ずつダウンロードするのが面倒な場合は、Strutsとかダウンロードすれば必要なものはだいたい入ってたりする。
これをクラスパスに追加する。手順は、プロジェクトを右クリックして、Properties → Java Build Path → Add JARsボタン → さっき入れたJARファイルを全部選択 → OK。
コマンドライン上からコンパイルしている場合は、CLASSPATHに全部のJARを放り込むか、Scala本体のlibディレクトリに放り込めば使えるはず。
これで入れたCommonsは全部使えるようになった。
-
Commons Langの機能を使ってみる
Langは文字列とか数値の操作をする時の、nullチェックとかを勝手にやってくれたり、普段良く使うような機能を提供してくれたりする。よく使うクラスは文字列を操作するStringUtils、数値を扱うNumberUtilsあたり。
import org.apache.commons.lang.StringUtils import org.apache.commons.lang.math.NumberUtils def main(args : Array[String]) { // isBlankは、null、空文字、trimしたら空白文字になる場合にtrueを返す // if( str == null || str.trim.equals("") )みたいなことをしなくて良くなる println(StringUtils.isBlank(" ")) //=> true // leftPadは指定文字で右詰にする。rightPadやcenterなどもある。 println(StringUtils.leftPad("123", 6, '0')) //=> 000123 // trimToEmptyはtrimをする。nullの場合は空文字を返す。trimやtrimToNullもある。 println(StringUtils.trimToEmpty(null)); //=> 空文字 // 引数1が、引数2で指定した文字列で始まっていたらtrue。逆のendsWithもある。 println(StringUtils.startsWith("abcdefg", "abc")) //=> true // toIntは数値に変換する。変換できなかった場合はデフォルト値(引数2)になる。 println(NumberUtils.toInt("a", -1)) // => -1 // 指定された文字列が数値かどうか判定する println(NumberUtils.isNumber("0.3")) // => 0.3 }
こんな感じで、Javaの基本機能だと2~3行かけて書かないといけなかったものが、Langを使うと1行で書けるようになる。
その他の機能はAPIを参照。
http://commons.apache.org/lang/api-release/ -
Commons IOの機能を使ってみる
IOはファイル操作を手伝ってくれる。1行でファイルのreadやwriteができるFileUtilsや、ReaderとかWriterとかStreamの操作を補助するIOUtils、ファイル名の操作をするFilenameUtilsあたりをよく使う。
// Stringをファイルに書き出す FileUtils.writeStringToFile(new File("temp.txt"), "てすと", "utf-8") // ファイルを読んでStringに入れる println(FileUtils.readFileToString(new File("temp.txt"), "utf-8")) //=> てすと // 再帰的にディレクトリを掘る FileUtils.forceMkdir(new File("dir1/dir2/dir3")) // 指定したファイルをコピーする FileUtils.copyFile(new File("temp.txt"), new File("temp2.txt")) // 指定したディレクトリを中身ごとコピーする FileUtils.copyDirectory(new File("dir1"), new File("dir2")) // 指定したディレクトリの中身をごっそり削除する FileUtils.cleanDirectory(new File("dir1")) // 拡張子を取得する println(FilenameUtils.getExtension("test.txt")) //=>txt // 指定した拡張子かどうか判定する println(FilenameUtils.isExtension("test.txt", "txt")) //=>true // 拡張子を取り除く println(FilenameUtils.removeExtension("test.txt")) //=>text // ファイル名を取得する println(FilenameUtils.getName("dir1/test.txt")) //=>test.txt // ファイルパスを取得する println(FilenameUtils.getPath("dir1/dir2/test.txt")) //=>dir1/dir2 // スラッシュが被ったりドットが付いてるファイルパスをきれいにする println(FilenameUtils.normalize("dir1/../dir2////dir3/")) //=>dir2/dir3
Javaのファイル操作は何かと面倒だし、Scalaのファイル操作も微妙なところがあるので、軽い処理であればFileUtilsに任せてしまうと楽。
一気にメモリに入れるのは辛い大きなファイルを読み書きする時はLineIteratorというイテレータでファイル読み込む機能もあるので、そっちを使っても良いかも。