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を作らなくてもよい感じです。