// ステップカウンタ import java.io.File; import java.io.FileReader; import java.io.BufferedReader; import java.io.FileFilter; import java.io.BufferedReader; public class StepCounter { // 指定可能な拡張子の数 private static final int SUFFIX_MAX = 4; // 指定された拡張子の数 private static int _suffixs; // 検索対象ファイルの拡張子 private static String[] _suffix = new String[SUFFIX_MAX]; // 総行数 private static int totalStep; // ファイル数 private static int totalFiles; public static void main(String[] args) throws Exception { if (args.length == 0) { System.out.println("Usage : java StepCounter [検索対象ディレクトリ] [拡張子(省略可)]"); System.out.println("拡張子は0から4つまで指定可能"); System.exit(0); } File dir = new File(args[0]); // 検索対象ディレクトリ _suffixs = Math.min(args.length - 1, SUFFIX_MAX); // SUFFIX_MAXより多く指定されたらSUFFIX_MAXまで取得 for (int i = 0; i < _suffixs; i++) { _suffix[i] = args[1 + i].toLowerCase(); // 拡張子 } System.out.println("*******************************************************************"); System.out.println(" Directory = " + dir.getAbsolutePath()); if (_suffixs == 0) System.out.println(" 拡張子 = 全指定"); else for (int i = 0; i < _suffixs; i++) System.out.println(" 拡張子" + (i + 1) + " = " + _suffix[i]); System.out.println(" で検索します。"); System.out.println("*******************************************************************"); // 検索処理 printFilesRecursive(dir); // 総行数・ファイル数表示 System.out.println("*******************************************************************"); System.out.println(" 総行数 = " + totalStep); System.out.println(" ファイル数 = " + totalFiles); System.out.println("*******************************************************************"); } // 指定されたディレクトリ以下のファイルを検索 private static void printFilesRecursive(File dir) throws Exception { // dir以下のファイルをリストアップし、files配列に格納 File[] files = dir.listFiles(new FileFilter() { public boolean accept(File file) { if (! file.isFile()) return false; String name = file.getName().toLowerCase(); switch (_suffixs) { case 0 : return true; // 拡張子指定無しなら、すべてのファイルが対象 case 1 : return name.endsWith("." + _suffix[0]); case 2 : return name.endsWith("." + _suffix[0]) || name.endsWith("." + _suffix[1]); case 3 : return name.endsWith("." + _suffix[0]) || name.endsWith("." + _suffix[1]) || name.endsWith("." + _suffix[2]); case 4 : return name.endsWith("." + _suffix[0]) || name.endsWith("." + _suffix[1]) || name.endsWith("." + _suffix[2]) || name.endsWith("." + _suffix[3]); default : return false; } } }); System.out.println(dir.getAbsolutePath() + " ... " + files.length + " files."); // files配列のファイルの行数を調べる for (int i = 0; i < files.length; i++) { printFileStep(files[i]); } // dir以下のサブディレクトリをリストアップし、dirs配列に格納 File[] dirs = dir.listFiles(new FileFilter() { public boolean accept(File file) { return file.isDirectory(); } }); // dirs配列のすべてのサブディレクトリを再帰的に処理 for (int i = 0; i < dirs.length; i++) { printFilesRecursive(dirs[i]); } } // 指定されたファイルの行数を調べ、totalStepに加算 private static void printFileStep(File file) throws Exception { FileReader fr = new FileReader(file); BufferedReader br = new BufferedReader(fr); int count = 0; try { while (br.readLine() != null) { count++; } } catch (sun.io.MalformedInputException exp) { // バイナリ判定...これでは不十分 System.out.println("\t (bin) , " + file.getName()); return; } totalStep += count; totalFiles++; System.out.println("\t" + count + " , " + file.getName()); } }