上一篇博客说讲到使用SVNKit来操作svn上的数据,其中在实例DisplayFile中,从svn上获得了文本文件,并打印了文件的内容,我们解析文本文件的方式是直接是有流的方式读取,但是不是所有的文件都能使用流的方式读取的,比如office系列的文件通常使用POI来读取,PDF格式的文件可以使用Pdfbox来读取,但是要知道文件的格式还有好多种,比如,xml,图片,音频,zip,java类等等,而且这些都一个项目中最常用的文件类型,那我们如何读取这些文件呢?我们学会了使用POI还要学会使用Pdfbox等一些列的文件解析工具吗?答案一定是否定的,因为我们有了Tika。
什么是Tika?
Tika是一个内容抽取的工具集合(atoolkitfor text extracting)。它集成了POI, Pdfbox 并且为文本抽取工作提供了一个统一的界面。其次,Tika也提供了便利的扩展API,用来丰富其对第三方文件格式的支持。
在当前的0.2-SNAPSHOT版本中, 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 voidparse(InputStream stream, ContentHandlerhandler, Metadata metadata)
用stream参数传递需要解析的文件流,文本内容会被传入handler,而元数据会更新至metadata。
可以使用Tika的ParserUtils工具来根据文件的mime-type来得到一个适当的Parser来进行解析工作。或者Tika还提供了一个AutoDetectParser根据不同的二进制文件的特殊格式 (比如说Magic Code),来寻找适合的Parser。
提示:主要tika-xx.jar,解析相应的文件必须有相应的jar.例如:excel文件必须用到poi-xx.jar
importorg.apache.tika.metadata.Metadata;
importorg.apache.tika.parser.AutoDetectParser;
importorg.apache.tika.parser.ParseContext;
importorg.apache.tika.parser.Parser;
importorg.apache.tika.sax.BodyContentHandler;
importorg.xml.sax.ContentHandler;
import java.io.*;
public class TiKaUtil{
public static String parseFile(Filefile){
Parser parser = newAutoDetectParser();
InputStream input = null;
try{
Metadata metadata = newMetadata();
metadata.set(Metadata.CONTENT_ENCODING, "utf-8");
metadata.set(Metadata.RESOURCE_NAME_KEY, file.getName());
input = newFileInputStream(file);
ContentHandler handler = newBodyContentHandler();//当文件大于100000时,newBodyContentHandler(1024*1024*10);
ParseContext context = newParseContext();
context.set(Parser.class,parser);
parser.parse(input,handler,metadata,context);
for(String name:metadata.names()){
System.out.println(name+":"+metadata.get(name));
}
System.out.println(handler.toString());
return handler.toString();
}catch (Exception e){
e.printStackTrace();
}finally {
try {
if(input!=null)input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
public static void main(Stringargt0[])throws Exception{
parseFile(new File("D:\\svntest\\svnkittest\\branches\\doImport.txt"));
}
总结:
通过SVNKit+Tika+lucene你是否可以想象其实这就是一个confluence。其实这是一个很有意思的事。