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 个字符,但最终它显然遗漏了这个特定文件的最后 5,083 个字符(长几 MB),因此它甚至超出了错过最后一个回调的范围。

此外,在另一个大约 5,000 个字符长的小文件上进行测试,似乎没有发生回调!

在这两种情况下,MIME 类型都被正确检测为text/plain

有任何想法吗?

谢谢!

4

1 回答 1

4

您使用的是哪个版本的 Tika?查看源代码,它读取4096可以在TXTParser129行上看到的字节块。在线调用例程。132characters(...)

简而言之,目标代码是:

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

哪里readerBufferedReader。我看不出这段代码有任何缺陷,因此我认为您可能正在使用旧版本?

于 2011-07-07T20:49:45.077 回答