CUBは子供の白熊

Java SE 8 実践プログラミングの練習問題を解く

第9章 Java 7 の機能を復習する : 問題 11 : ProcessBuilder

問題

ProcessBuilderクラスを使って、ユーザーのホームディレクトリの全てのサブディレクトリ内の全てのファイルからクレジット番号を探すために "grep -r" を呼び出すプログラムを作成せよ。
そして、ファイル内で見つけた番号を収集せよ。

解答

クレジット番号は結構複雑な規則があるみたいだけど、単純に14~16桁の数字列とします。
正規表現で表すと

[0-9]{14,16}

となる。

// grep コマンド実行
ProcessBuilder builder = new ProcessBuilder("grep", "-r", "[0-9]{14,16}", "./");
File home = new File(System.getProperty("user.home"));
builder.directory(home);
File outputFile = File.createTempFile("card", ".txt");
builder.redirectOutput(Redirect.to(outputFile));
Process process = builder.start();
try {
    process.waitFor();
} catch (InterruptedException ex) {
    // 無視
}
// ファイルからクレジット番号を収集
Pattern pattern = Pattern.compile("[0-9]{14,16}");
Set<String> cards = new HashSet<String>();
for (String line : Files.readAllLines(outputFile.toPath())) {
    Matcher matcher = pattern.matcher(line);
    while (matcher.find()) {
        cards.add(matcher.group());
    }
}

私のマシンは Windows なので、「ファイルからクレジット番号を収集する」方のコードは動作確認しましたが、「grep コマンド実行」がちゃんと動くかどうかは未確認です。
悪しからず。