Java ApacheTika:解析文本文件会忽略最后一部分吗?
我试图用Tika解析一个纯文本文件,但不一致 行为 更具体地说,我定义了一个简单的处理程序,如下所示:Java ApacheTika:解析文本文件会忽略最后一部分吗?,java,apache,apache-tika,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));
public class MyHandler extends DefaultHandler
{
@Override
public void characters(char ch[], int start, int length) throws SAXException
{
System.out.println(new String(ch));
}
}
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);
然后,我将文件(“myfile.txt”)解析如下:
public class MyHandler extends DefaultHandler
{
@Override
public void characters(char ch[], int start, int length) throws SAXException
{
System.out.println(new String(ch));
}
}
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()回调函数
每次回调都会读取4096个字符,但最后显然
省略此特定文件的最后5083个字符(仅几个字符)
MB长),因此它甚至超出了错过最后一次回调的范围
另外,在另一个大约5000个字符长的小文件上进行测试,
似乎没有发生回调
在这两种情况下,MIME类型都被正确检测为text/plain
有什么想法吗
谢谢 您使用的是什么版本的Tika?查看源代码,它读取的是
4096
字节块,可以在的129
行中看到。在第132行
调用字符(…)
例程
简而言之,目标代码是:
char[] buffer = new char[4096];
int n = reader.read(buffer);
while (n != -1) {
xhtml.characters(buffer, 0, n);
n = reader.read(buffer);
}
其中
读取器
是缓冲读取器
。我看不到此代码中存在任何缺陷,因此我认为您可能正在使用较旧的版本?您是否能够编写一个小的JUnit单元测试来显示问题?Tika中有几个用于文本解析的单元测试,它们都是解析的,所以很明显,您的案例需要另一个单元测试!我也看不出上述代码有任何缺陷,但问题仍然存在。很奇怪!