Java JIOパッケージでファイルgrep機能を実装してみる
2009/04/23 18:52Update
java.nioは、Java入出力(IO)処理を効率よく行うためのAPI パッケージです。
サンプルコード:
GrepByJavaNIO.java
New IO-TECHSCORE-
java.nio API仕様
GrepByJavaNIO.java
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.CharBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Java NIOパッケージでファイルをgrepする例
*
*/
public class GrepByJavaNIO {
// Charset
private static final Charset CHARSET = Charset.forName("ISO-8859-15");
private static final CharsetDecoder DECODER = CHARSET.newDecoder();
private static final Pattern LINE_PATTERN = Pattern.compile(".*\r?\n"); //ファイルの一行を表現する正規表現パターン
/**
* grep
* @param f File
* @param cb CharBuffer。ファイル内容
* @param pattern Pattern grepパターン
*/
private static void grep(File f, CharBuffer cb, Pattern pattern) {
Matcher lineMatcher = LINE_PATTERN.matcher(cb); // 一行ずつ
Matcher patternMatcher = null; // Pattern matcher
int lines = 0;
while (lineMatcher.find()) {
lines++; //行番号
CharSequence cs = lineMatcher.group(); // 現在の行 文字列
if (patternMatcher == null) {
patternMatcher = pattern.matcher(cs);
}
else {
patternMatcher.reset(cs);
}
if (patternMatcher.find()) { //grepパターンに合致する場合
System.out.print(f + ":" + lines + ":" + cs);
}
if (lineMatcher.end() == cb.limit()) {
break;
}
}
}
/**
* grep
* @param f File
* @param pattern Pattern
* @throws IOException IO異常が発生したとき
*/
private static void grep(File f, Pattern pattern) throws IOException {
// FileInputStreamオブジェクト
FileInputStream fis = new FileInputStream(f);
// FileInputStreamオブジェクトからjava.nio.channels.FileChannelオブジェクト取得
FileChannel fc = fis.getChannel();
// ファイルサイズ
int sz = (int) fc.size();
//ファイル内容をメモリ(MappedByteBuffer)にマップ
MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, sz);
// 指定するCHARSETでCharBufferにdecodeする
CharBuffer cb = DECODER.decode(bb);
// grep
grep(f, cb, pattern);
// クローズ
fc.close();
}
public static void main(String[] args) {
if (args.length < 2) {
System.err.println("Usage: java Grep pattern file...");
return;
}
Pattern pattern = Pattern.compile(args[0]);
for (int i = 1; i < args.length; i++) {
File f = new File(args[i]);
try {
grep(f, pattern);
} catch (IOException x) {
System.err.println(f + ": " + x);
}
}
}
}
参考資料
New IO-TECHSCORE-
java.nio API仕様
Sponsored Link
Comments
- Relative Articles
- Java開発及び実行環境の構築 | Linux篇 - (2008/08/31 20:34)
- Java開発及び実行環境の構築 | Windows篇 - (2008/08/31 21:18)
- 5分でJava Hello World! - (2008/08/31 22:13)
- Java言語の制御構文 - 条件分岐if/else/else if - (2008/10/01 21:30)
- Java言語の繰り返し制御構文 - for文 - (2008/10/03 18:22)
- Java言語の繰り返し制御構文 - do ... while文 - (2008/10/03 21:23)
- Java言語の繰り返し制御構文 - while文 - (2008/10/03 21:32)
- Java言語の基礎 - javacコマンドによるコンパイル - (2008/10/10 17:58)
- Java アクセス修飾子概要 - (2008/10/29 18:31)
- Javaアノテーション機能 概要 - (2009/02/12 13:06)