我正在尝试使用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 。
有什么想法吗?
谢谢!
答案 0 :(得分:4)
您使用的是哪种版本的Tika?查看源代码,它会读取4096
个字节的块,可以在TXTParser的129
行上看到。在第132
行,调用characters(...)
例程。
简而言之,目标代码是:
char[] buffer = new char[4096];
int n = reader.read(buffer);
while (n != -1) {
xhtml.characters(buffer, 0, n);
n = reader.read(buffer);
}
其中reader
是BufferedReader
。我在这段代码中看不到任何缺陷,因此我认为你可能正在使用旧版本?