4

Tika を使用してプレーン テキスト ファイルを解析しようとしていますが、動作に一貫性がありません。

より具体的には、単純なハンドラーを次のように定義しました。

public class MyHandler extends DefaultHandler
{
     @Override
     public void characters(char ch[], int start, int length) throws SAXException
     {
        System.out.println(new String(ch));
     }
}

次に、ファイル (" myfile.txt ") を次のように解析します。

Tika tika = new Tika();
InputStream is = new FileInputStream("myfile.txt");

Metadata metadata = new Metadata();
ContentHandler handler = new MyHandler();

Parser parser = new TXTParser();
ParseContext context = new ParseContext();

String mimeType = tika.detect(is);
metadata.set(HttpHeaders.CONTENT_TYPE, mimeType);

tikaParser.parse(is, handler, metadata, context);

ファイル内のすべてのテキストが画面に出力されることを期待していますが、最後の一部はそうではありません。より具体的には、characters()コールバックは、コールバックごとに 4,096 文字を読み取り続けますが、最終的には、この特定のファイル (数 MB の長さ) の最後の 5,083 文字を明らかに除外するため、最後のコールバックを見逃すことさえありません。

また、長さが約 5,000 文字の別の小さなファイルでテストしたところ、コールバックが発生していないようです。

どちらの場合も、MIME タイプはtext/plainとして正しく検出されます。

何か案は?

ありがとう!

4

1 に答える 1

4

Tikaのどのバージョンを使用していますか? ソース コードを見ると、 TXTParserの行で確認4096できるバイトのチャンクが読み取られます。行でルーチンが呼び出されます。129132characters(...)

要するに、ターゲットコードは次のとおりです。

   char[] buffer = new char[4096];
   int n = reader.read(buffer);
   while (n != -1) {
       xhtml.characters(buffer, 0, n);
       n = reader.read(buffer);
   }

はどこreaderですかBufferedReader。このコードには欠陥が見当たりません。したがって、古いバージョンを使用している可能性がありますか?

于 2011-07-07T20:49:45.077 に答える