Tika通用的内容分析工具

来源:互联网 发布:spark源码讲解 许鹏 编辑:程序博客网 时间:2024/06/11 02:27

      上一篇博客说讲到使用SVNKit来操作svn上的数据,其中在实例DisplayFile中,从svn上获得了文本文件,并打印了文件的内容,我们解析文本文件的方式是直接是有流的方式读取,但是不是所有的文件都能使用流的方式读取的,比如office系列的文件通常使用POI来读取,PDF格式的文件可以使用Pdfbox来读取,但是要知道文件的格式还有好多种,比如,xml,图片,音频,zipjava类等等,而且这些都一个项目中最常用的文件类型,那我们如何读取这些文件呢?我们学会了使用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
  • TikaAPI十分便捷,核心是Parser interface,其中定义了一个parse方法:

public voidparse(InputStream stream, ContentHandlerhandler, Metadata metadata)

 

stream参数传递需要解析的文件流,文本内容会被传入handler,而元数据会更新至metadata

 

可以使用TikaParserUtils工具来根据文件的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。其实这是一个很有意思的事。


0 0