1

現在、データ処理のために System.in をループするスクリプトがあります。を使用して複数のファイルからデータを渡していますcat

cat myfiles*.txt | java MyDataProcessor 

ファイルを直接開く Java と比べて非効率性を追加するという考えに基づいて、catJava がファイルを直接開く場所にこれを最適化したいと思います。

java MyDataProcessor myfiles*.txt

これをかなり簡単にする (つまり、posix ワイルドカードをファイル ハンドラーに変換する) Java ライブラリはありますか?

4

5 に答える 5

2

Java 7 は、グロブに基づいてパス名を検証するために使用できる PathMatcher クラスを追加しました (これは、シェルによって行われるマッチングに似ています)。

PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:myfiles*.txt");
matcher.matches(filename);

ファイル ツリーをたどってグロブに基づいてファイルを検索する例は、こちらの Oracle Java チュートリアルにあります。

于 2012-11-01T21:12:53.113 に答える
1

java.io.File を使用してディレクトリ全体を反復処理し、正規表現を使用してファイル名をフィルタリングします。次のコードを使用して、ワイルドカード式を正規表現に変換できます。

    /**
 * Converts wildcard expression to regular expression. In wildcard-format,
 * '*' = 0-N characters and ? = any one character.
 * @param wildcardExp wildcard expression string
 * @param buf buffer which receives the regular expression
 */
static public void wildcardToRegexp(FastStringBuffer wildcardExp, FastStringBuffer buf) {
    final int len = wildcardExp.size();
    buf.clear();
    for (int i = 0; i < len; i++) {
        char c = wildcardExp.charAt(i);
        switch (c) {
        case '*':
            buf.append('.');
            buf.append('*');
            break;
        case '?':
            buf.append('.');
            break;
        // escape special regexp-characters

        case '(':
        case ')':
        case '[':
        case ']':
        case '$':
        case '^':
        case '.':
        case '{':
        case '}':
        case '|':
        case '\\':
        case '+':
            buf.append('\\');
            buf.append(c);
            break;
        default:
            buf.append(c);
            break;
        }
    }
}
于 2012-11-01T20:31:29.717 に答える
1

Java Grep Libraryを見てください。タスクに近いですが、ワイルドカードはありません。

Apache はクラスにワイルドカードを提供します: http://cleanjava.wordpress.com/2012/03/21/wildcard-file-filter-in-java/

于 2012-11-01T20:31:46.073 に答える
1

シェル固有の「ワイルドカード」に頼る代わりに、ディレクトリ名を渡し、Java にディレクトリ ツリーを解析させるのが最善です。

于 2012-11-01T20:26:28.533 に答える
0

最初は私にはわからなかったので、これが誰かに明らかでない場合、ファイルがローカルにある場合は、Posix に解析を任せることができ、ファイルはmain(String[] args)引数として渡されます。私の場合、他にもいくつかのパラメーターがあったため、ワイルドカード引数を最後の引数として移動しました。

// USAGE: java MyProcessor arg1 arg2 myfiles*.txt

public static void main(String[] args) throws Exception {
  String arg1 = args[0];
  String arg2 = args[1];

  // looping over all input files
  for (int i = 2; i < args.length; i++) {
    File inputFile = new File(args[i]).getCanonicalFile();
    BufferedReader in = new BufferedReader(new FileReader(inputFile)); 
    // ...
  }
}
于 2012-11-01T21:37:44.700 に答える