Tika支持多种功能:
文档类型检测 内容提取 元数据提取 语言检测
重要特点:
统一解析器接口:Tika封装在一个单一的解析器接口的第三方解析器库。由于这个特征,用户逸出从选择合适的解析器库的负担,并使用它,根据所遇到的文件类型。
低内存占用:Tika因此消耗更少的内存资源也很容易嵌入Java应用程序。也可以用Tika平台像移动那样PDA资源少,运行该应用程序。
快速处理:从应用连结内容检测和提取可以预期的。
灵活元数据:Tika理解所有这些都用来描述文件的元数据模型。
解析器集成:Tika可以使用可在单一应用程序中每个文件类型的各种解析器库。
MIME类型检测: Tika可以检测并从所有包括在MIME标准的媒体类型中提取内容。
语言检测: Tika包括语言识别功能,因此可以在一个多语种网站基于语言类型的文档中使用。
使用Parser接口内容提取
CompositeParser
给出的图表显示Tika通用解析器类CompositeParser 主AutoDetectParser。由于CompositeParser类遵循复合设计模式,可以用一组解析器实例作为一个单独的解析器。CompositeParser类也可以访问所有实现解析器接口的类。
AutoDetectParser
这是CompositeParser的子类,它提供了自动类型检测。使用此功能,AutoDetectParser自动发送收到的文件到使用该复合方法适当分析器类。
parse()方法
除了parseToString(),还可以使用分析器接口的parse()方法。该方法的原型如下所示。
voidparse(
InputStream stream,
ContentHandler handler,
Metadata metadata,
ParseContext context)throws IOException, SAXException, TikaException
我们简要解释方法参数:
stream,从需要被解析文档创建的InputStream实例
handler,接收从输入文档解析XHTML SAX事件序列的ContentHandler对象,负责处理事件并以特定的形式导出结果。
metadata,元数据对象,它在解析器中传递元数据属性
context,带有上下文相关信息的ParseContext实例,用于自定义解析过程。
如果从输入流读取失败,则parse方法抛出IOException异常,从流中获取的文档不能被解析抛TikaException异常,处理器不能处理事件则抛SAXException异常。
当解析文档时,Tika尽量重用已经存在的解析库,如Apache POI或PDFBox。因此,大多数解析器实现类仅适配这些外部类库。下面,我们将了解如何使用处理程序和元数据参数来提取文档的内容和元数据。为了方便,我们能使用Tika的门面类调用解析器Api。
0.Tika的maven地址:
org.apache.tika
tika-parsers
1.17
1.简单的用法
1.1获取文件类型
Tika支持MIME所提供的所有互联网媒体文件类型。
/*** 检测文件类型的用法*/
public static voidtest1(){
File file= new File("G:/tikatest/test.mp4");
Tika tika= newTika();
String filetype= null;try{
filetype=tika.detect(file);
}catch(IOException e) {
e.printStackTrace();
}
System.out.println(filetype);
}
结果:
video/mp4
我们将后缀去掉改为test也可以检测出同样的结果,其根据文件拓展名与文件内容检测。
1.2提取Txt文本内容
解析文件,一般用于Tika外观facade类的parseToString()方法。
/*** 读取txt内容*/
public static voidtest2(){
File file= new File("G:/tikatest/test.txt");
Tika tika= newTika();
String filecontent= null;try{
filecontent=tika.parseToString(file);
}catch(IOException e) {
e.printStackTrace();
}catch(TikaException e) {
e.printStackTrace();
}
System.out.println("Extracted Content: " +filecontent);
}
结果:
Extracted Content: 111
222
333
444
555
666
补充:与之等价的FileUtils功能实现(commons-io包功能)
public static voidtest3(){
File file= new File("G:/tikatest/test.txt");
String s= null;try{
s=FileUtils.readFileToString(file);
}catch(IOException e) {
e.printStackTrace();
}
System.out.println(s);
}
1.3提取元数据
元数据是什么,是文件所提供的附加信息。如果我们考虑一个音频文件,艺术家名,专辑名,标题下自带的元数据。
public static voidtest4(){
File file=new File("G:/tikatest/test.mp4");
Parser parser= newAutoDetectParser();
BodyContentHandler handler= newBodyContentHandler();
Metadata metadata= newMetadata();
FileInputStream inputstream= null;try{
inputstream= newFileInputStream(file);
}catch(FileNotFoundException e) {
e.printStackTrace();
}
ParseContext context= newParseContext();try{
parser.parse(inputstream, handler, metadata, context);
}catch(IOException e) {
e.printStackTrace();
}catch(SAXException e) {
e.printStackTrace();
}catch(TikaException e) {
e.printStackTrace();
}
System.out.println(handler.toString());//getting the list of all meta data elements
String[] metadataNames =metadata.names();for(String name : metadataNames) {
System.out.println(name+ ": " +metadata.get(name));
}
}
结果:
Software: OnePlus3-user 7.1.1 NMF26F 76 dev-keys
GPS Altitude Ref: Unknown (2)
Metering Mode: Center weighted average
Model: ONEPLUS A3010
meta:save-date: 2017-09-02T16:32:15
File Name: apache-tika-4154811460990247864.tmp
Exposure Mode: Auto exposure
Exif Version: 2.20
Sensing Method: One-chip color area sensor
tiff:ImageLength: 540
exif:Flash: false
Creation-Date: 2017-09-02T16:32:15
Interoperability Version: 1.00
ISO Speed Ratings: 640
X Resolution: 72 dots per inch
Shutter Speed Value: 1/20 sec
tiff:ImageWidth: 720
Thumbnail Width Pixels: 0
tiff:XResolution: 72.0
Image Width: 720 pixels
Last-Save-Date: 2017-09-02T16:32:15
exif:FNumber: 2.0
Number of Tables: 4 Huffman tables
F-Number: f/2.0
Color Space: sRGB
meta:creation-date: 2017-09-02T16:32:15
Resolution Units: inch
Data Precision: 8 bits
File Modified Date: 星期二 十月 16 22:15:54 +08