Apache Tika:解析文本文件省略了最后一部分?

时间:2011-07-07 20:25:16

标签: java apache apache-tika

我正在尝试使用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);

我希望文件中的所有文字都能在屏幕上打印出来,但是 小部分到底是不是。更具体地说,字符()回调 每回调一次读取4,096个字符,但最终显然是这样 遗漏了这个特定文件的最后5,083个字符(这是少数几个 MB长),所以它甚至超越了最后一次回调。

另外,测试另一个小文件,大约5,000个字符长, 似乎没有回调!

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

有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:4)

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

简而言之,目标代码是:

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

其中readerBufferedReader。我在这段代码中看不到任何缺陷,因此我认为你可能正在使用旧版本?