设为首页 收藏本站
查看: 803|回复: 0

[经验分享] Apache Tika源码研究(八)

[复制链接]
发表于 2015-8-5 11:24:22 | 显示全部楼层 |阅读模式
  本文主要分析tika的语言检测以及tika解决随机访问读取的问题,由于语言检测功能的实现设计一些算法,我这里就不贴出tika的源码了
  tika的语言检测的相关接口和类的uml模型图如下
DSC0000.jpg
  如果要获取文档内容和语言,我们可以新增DelegatingParser解析类,继承自DelegatingParser,代码如下:



public class LanguageDetectingParser extends DelegatingParser {
/**
*
*/
private static final long serialVersionUID = 1L;
public void parse(
InputStream stream, ContentHandler handler,
final Metadata metadata, ParseContext context)
throws SAXException, IOException, TikaException {
ProfilingHandler profiler =new ProfilingHandler();
ContentHandler tee =new TeeContentHandler(handler, profiler);
super.parse(stream, tee, metadata, context);
LanguageIdentifier identifier =    profiler.getLanguage();
if (identifier.isReasonablyCertain()) {
metadata.set(Metadata.LANGUAGE,
identifier.getLanguage());
}
}
protected Parser getDelegateParser(ParseContext context) {
return context.get(Parser.class, new AutoDetectParser());
}
}
  关于tika里面InputStream输入流随机访问的封装,我们可以看到AutoDetectParser类的parser方法里面的TikaInputStream类



public void parse(
InputStream stream, ContentHandler handler,
Metadata metadata, ParseContext context)
throws IOException, SAXException, TikaException {
TemporaryResources tmp = new TemporaryResources();
try {
TikaInputStream tis = TikaInputStream.get(stream, tmp);
// Automatically detect the MIME type of the document
MediaType type = detector.detect(tis, metadata);
metadata.set(Metadata.CONTENT_TYPE, type.toString());
// TIKA-216: Zip bomb prevention
SecureContentHandler sch = new SecureContentHandler(handler, tis);
try {
// Parse the document
super.parse(tis, sch, metadata, context);
} catch (SAXException e) {
// Convert zip bomb exceptions to TikaExceptions
                sch.throwIfCauseOf(e);
throw e;
}
} finally {
tmp.dispose();
}
}
  它的具体机制是将InputStream处理到临时文件,这里我不再贴出其源码
  因为有时我们需要InputStream重复使用,这里tika封装对其进行了封装TikaInputStream类,典型的应用场景如我们先要根据InputStream检测文档的编码类型,然后还要进一步对该InputStream进行解析



public static void main(String[] args) throws IOException, TikaException {
// TODO Auto-generated method stub
File file=new File("E:\\watiao.htm");
InputStream stream=TikaInputStream.get(file);
try
{
EncodingDetector  detector=new UniversalEncodingDetector();
Charset charset = detector.detect(stream, new Metadata());            
System.out.println("编码2:"+charset.name());            
//进一步解析            
        }
finally
{
if (stream != null)    stream.close();
}
}
  本系列tika源码解析的文章系本人原创,本人参考了《Tika in Action》英文版,以后如有心得再继续补充。
  转载请注明出处 博客园 刺猬的温驯
  本文链接 http://www.iyunv.com/chenying99/archive/2013/03/11/2953365.html

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-94400-1-1.html 上篇帖子: Ubuntu下安装Apache 2无法解析html中的php 下篇帖子: win2003系统下apache、php、mysql安装以及虚拟主机和目录权限设置(转载)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表