3

ANTLR によって生成された Java パーサーは、任意に大きなファイルをストリーミングできますか?

UnbufferedCharStream を使用して Lexer を構築しようとし、それをパーサーに渡しました。UnbufferedCharStream で size を呼び出したために UnsupportedOperationException が発生しましたが、UnbufferedCharStream で size を呼び出すことはできないという説明が例外に含まれていました。

    new Lexer(new UnbufferedCharStream( new CharArrayReader("".toCharArray())));
    CommonTokenStream stream = new CommonTokenStream(lexer);
    Parser parser = new Parser(stream);

私は基本的に、豚を使用してhadoopからエクスポートしたファイルを持っています。「\n」で区切られた多数の行があります。各列は「\t」で分割されます。これは、バッファ付きリーダーを使用して各行を読み取るため、Java で簡単に解析できます。次に、「\t」で分割して各列を取得します。しかし、ある種のスキーマ検証も必要です。最初の列は適切にフォーマットされた日付で、その後にいくつかの価格列、いくつかの 16 進列が続く必要があります。

生成されたパーサーコードを見ると、次のように呼び出すことができます

    parser.lines().line()

これにより、概念的に繰り返し処理できるリストが得られます。しかし、リストを取得するまでに、リストのサイズは固定されているようです。これは、パーサーがおそらくファイル全体を既に解析していることを意味します。

非常に大きなファイルをストリーミングできる API の別の部分はありますか? ビジターまたはリスナーを使用して、ファイルを読み取っているときに呼び出される方法はありますか? ただし、ファイル全体をメモリに保持することはできません。合いません。

4

1 に答える 1