Guavaライブラリのio関係を使ってみる
個人的なイメージですが、Javaはオブジェクト指向で部品(ライブラリ)がいっぱいあって、 それを使い倒す。例外処理も検査例外と非検査例外があってかっちりした言語・・・。
などという思い込みがあり、いざ何かを作る時ライブラリって何使ったらいいの?どれを 使うべき?と、悩んだりします。まぁ、先駆者は偉大だなぁ・・・と思うのです。
この辺りは、何も解決していないのですが、ディレクトリにある特定のファイルを列挙するために FilenameFilterを使ってみたのですが、もう少し楽ができないかと調べてみました。
ググってみるとapache commonやguavaなどがひかかってきましたので、検索でもお世話になっている google先生のguavaを使ってみたいと思います。
guava io系ライブラリ
ここでは、guava-20.0を対象に確認をしていきます。パッケージ名は、「com.google.common.io.*;」です。
パターンに一致するファイルの列挙
ディレクトリ内にある特定のファイル名を取得したい場合、guavaでは次のコードとなります。
guavaの場合
File dir = new File("c:\\hoge");
File[] listFiles = dir.listFiles(new PatternFilenameFilter(".*\\.(dat|DAT)$"));
guavaを使わない場合
File dir = new File("c:\\hoge");
File[] listFiles = dir.listFiles(new FilenameFilter() {
public boolean accept(File pathname) {
if(name.matches(".*\\.(dat|DAT)$")){
return true;
}
return false;
}
});
先頭の1行を読む
ファイルから先頭の1行を読み込みたい場合、次のようなコードとなります。
guavaの場合
File file = new File("c:\\temp\\hoge.txt");
String firstLine = Files.readFirstLine(file, Charsets.UTF_8);
guavaを使わない場合
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("c:\\temp\\hoge.txt"), "UTF-8"));
String firstLine;
while ((firstLine = br.readLine()) != null) {
break;
}
ファイルを読むときに使用するBufferedReaderの生成
ファイルから先頭の1行を読み込みたい場合、次のようなコードとなります。例外処理も少しスッキリします。
guavaの場合
BufferedReader br = Files.newReader(new File("hoge.txt"), Charsets.UTF_8);
guavaを使わない場合
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("hoge.txt"), "UTF-8"));
ファイルの書込みに使用するBufferedWriterの生成
ファイルに1行ずつ書き込みたい場合、次のようなコードとなります。
guavaの場合
BufferedWriter bw = Files.newWriter(new File("hoge.txt"), Charsets.UTF_8);
guavaを使わない場合
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("hoge.txt"), "UTF-8"));
ファイルの書込み(write,append)
単純にファイルに書き込みたい場合、次のようなコードとなります。
guavaの場合
Files.write("hogehoge", new File("hoge.txt"), Charsets.UTF_8);
Files.append("hogehoge", new File("hoge.txt"), Charsets.UTF_8);
guavaを使わない場合
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("hoge.txt"), "UTF-8"));
bw.write("hogehoge");
BufferedWriterを作らなくてもよい感じです。