Tika是一个内容抽取的工具集合(a toolkit for text extracting)。它集成了POI, Pdfbox 并且为文本抽取工作提供了一个统一的界面。其次,Tika也提供了便利的扩展API,用来丰富其对第三方文件格式的支持。

Tika提供了对如下文件格式的支持:

PDF - 通过Pdfbox

MS-* - 通过POI

HTML - 使用nekohtml将不规范的html整理成为xhtml

OpenOffice 格式 - Tika提供

Archive - zip, tar, gzip, bzip等

RTF - Tika提供

Java class - Class解析由ASM完成

Image - 只支持图像的元数据抽取

XML

Tika的API十分便捷,核心是Parser interface,其中定义了一个parse方法:

public void parse(InputStream stream, ContentHandler handler,Metadata metadata, ParseContext context)

用stream参数传递需要解析的文件流, 文本内容会被传入handler,而元数据会更新至metadata。可以使用Tika的ParserUtils工具来根据文件的mime-type来得到一个适当的Parser来进行解析工作。或者Tika还提供了一个AutoDetectParser根据不同的二进制文件的特殊格式 (比如说Magic Code),来寻找适合的Parser。

1、Parser接口

void parse(InputStream stream, ContentHandler handler,Metadata metadata, ParseContext context)throws IOException, SAXException, TikaException;

InputStream:文档输入原始 字节流。它不会在此方法中关闭InputStream。

ParserContext: 解析处理的上下文。此参数用于用户需要定制解析过程时使用。如何控制?它内部一个Map,用Map保存接口(class)与其实例的所组 成的键值对。这些接口(class)只能是在Parser中用于解析文档的所需接口才会起作用。

ContentHandler:XHTML SAX事件处理器。将输入文档的结构化信息以XHTML格式写入到此Handler。

Metadata:文档元数据。既是输入参数,也是输出参数。作输入参数时,能够有助于解析器更好地理解文档的格式。

2、选择解析器Parser

(1)确定只用一种文档格式(以Html格式为例)

Parser parser = new HtmlParser();

parser.parse(stream, handler, metadata, context);

(2)确定使用多种文档格式中的某一格式

Map parsersByType = new HashMap();

parsersByType.put(MediaType.parse("text/html"), new HtmlParser());

parsersByType.put(MediaType.parse("application/xml"), new XMLParser());

CompositeParser parser = new CompositeParser();    //Parser的集合

parser.setParsers(parsersByType);

parser.setFallback(new TXTParser());

Metadata metadata = new Metadata();

metadata.set(Metadata.CONTENT_TYPE, "text/html");

parser.parse(stream, handler, metadata, context);

(3)不确定文档格式

Parser parser = new AutoDetectParser();

parser.parse(stream, handler, metadata, context);

3、tika的两种使用方式

1)方式一

public String fileToTxt(File f) {

Parser parser = new AutoDetectParser();

InputStream is = null;

try {

Metadata metadata = new Metadata();

metadata.set(Metadata.AUTHOR, "波帅"); //没有作用,因为被覆盖掉了

metadata.set(Metadata.RESOURCE_NAME_KEY, f.getName());

is = new FileInputStream(f);

ContentHandler handler = new BodyContentHandler();

ParseContext context = new ParseContext();

context.set(Parser.class, parser);

parser.parse(is, handler, metadata, context);

for(String name : metadata.names()) {

System.out.println(name+":"+metadata.get(name));

}

return handler.toString();

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} catch (SAXException e) {

e.printStackTrace();

} catch (TikaException e) {

e.printStackTrace();

} finally {

if(is != null) {

try {

is.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

return null;

}

2)方式二(效率没有方式一高)

public String tikaTool(File f) throws IOException, TikaException {

Tika tika = new Tika();

Metadata metadata = new Metadata();

metadata.set(Metadata.AUTHOR, "波帅"); //没有作用,因为被覆盖掉了

metadata.set(Metadata.RESOURCE_NAME_KEY, f.getName());

String str = tika.parseToString(new FileInputStream(f), metadata);

for(String name : metadata.names()) {

System.out.println(name+":"+metadata.get(name));

}

//return tika.parseToString(f);

return str;

}

4、使用tika创建索引

Document doc = new Document();

Metadata metadata = new Metadata();

doc.add(new Field("content", new Tika().parse(

new FileInputStream(file), metadata))); 参考资料:http://blog.csdn.net/gezhonglei2007/article/details/8078104

java中使用tika_Tika基本使用相关推荐

  1. java中实现具有传递性吗_Java中volatile关键字详解,jvm内存模型,原子性、可见性、有序性...

    一.Java内存模型 想要理解volatile为什么能确保可见性,就要先理解Java中的内存模型是什么样的. Java内存模型规定了所有的变量都存储在主内存中.每条线程中还有自己的工作内存,线程的工作 ...

  2. java中调用python

    在Java中调用Python </h1><div class="clear"></div><div class="postBod ...

  3. java中hashcode_浅谈Java中的Hash值

    1.Hash值有什么用? HashMap.HashTable.HashSet,所以涉及到使用Hash值进行优化存储的地方,都会用到HashCode.HashCode是Key,这种计算为提高计算的性能. ...

  4. JAVA中获取当前系统时间

    JAVA中获取当前系统时间 转自:http://www.cnblogs.com/Matrix54/archive/2012/05/01/2478158.html 一. 获取当前系统时间和日期并格式化输 ...

  5. Java中的对象和包

    什么是对象 对象就是实际生活中的事物,可以说一切事物都是对象. 对象的三个特点 1  对象的行为:这个对象能做什么, 例如包子是用来吃的 2  对象的状态:对象保持的一种状态,例如这个包子是热的还是凉 ...

  6. java中标识符,关键字,数据类型

    什么是标识符? 在java语言中用来给一个类,变量或方法命名的符号 标识符的命名规则 标识符可以由字母.数字.下划线(_).美元符($)组成,但不能包含 @.%.空格等其它特殊字符,不能以数字开头. ...

  7. Java中byte与16进制字符串的互相转换

    https://www.cnblogs.com/qinwangchen/p/5418028.html * Convert byte[] to hex string.这里我们可以将byte转换成int, ...

  8. JAVA中priorityqueue详解

    Java中PriorityQueue通过二叉小顶堆实现,可以用一棵完全二叉树表示.本文从Queue接口函数出发,结合生动的图解,深入浅出地分析PriorityQueue每个操作的具体过程和时间复杂度, ...

  9. 使用java中replaceAll方法替换字符串中的反斜杠

    今天在项目中使用java中replaceAll方法将字符串中的反斜杠("\")替换成空字符串(""),结果出现如下的异常: 1 java.util.regex. ...

最新文章

  1. 商汤等提出:统一多目标跟踪框架
  2. laravel 处理excel插件maatwebsite/excel
  3. 解决 fastjson 泛型报错 : java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to X
  4. 【Android 安装包优化】WebP 图片格式兼容与性能 ( Android 中的 WebP 图片格式兼容问题 | Android 中的 WebP 图片格式性能 )
  5. 【NLP】NLP提效,除了选择合适的模型,就是数据增强了
  6. 常见分布式理论(CAP、BASE)和一致性协议(Gosssip协议、Raft一致性算法)
  7. C#调用WSC(Windows Script Component)
  8. Hadoop视频教程资源链接
  9. ASP.NET中GridView数据导出EXCEL小结
  10. 计算机基础--操作系统基础
  11. Linux安装MYSQL5.7教程(一次成功)
  12. 从Spring中的@Transactional注解说起
  13. Vs2017添加引用时报错未能正确加载“ReferenceManagerPackage”包。
  14. android camera textureview,Android SDK – camera2 – 在TextureView上绘制矩...
  15. C#编写上位机驱动运动控制板卡
  16. 每次打开office2016相应应用都要配置进度的解决方法
  17. python爬取实习僧招聘信息字体反爬
  18. 长期盯屏幕 容易导致眼部疾病致失明
  19. 调用二级页面的html代码,从一级页面直接调用二级页面中的iframe框架
  20. 计算机毕业设计选题怎么办?毕设开题不会怎么办?毕业设计选题指南

热门文章

  1. 目标检测——val集的作用
  2. 自动驾驶——多传感器融合的学习笔记
  3. 基于PHPCMS的SQL注入(Havij)
  4. leetcode41. First Missing Positive
  5. Java中的资源文件加载方式
  6. [转]MyBatis传入多个参数的问题 - mingyue1818
  7. 查看自己电脑上某个端口有没有被占用
  8. SQL_drop删除表、数据库
  9. C++之实现优先队列
  10. 剑指offer——4.二维数组中的查找