第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 コマンド実行」がちゃんと動くかどうかは未確認です。
悪しからず。