1. 程式人生 > >Tika 解析 大於10萬解決方法

Tika 解析 大於10萬解決方法

Tika是一個內容抽取的工具集合(a toolkit for text extracting)。它集成了POIPdfbox 並且為文字抽取工作提供了一個統一的介面。其次,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 void parse(InputStream stream, ContentHandler handler, Metadata metadata)


用stream引數傳遞需要解析的檔案流, 文字內容會被傳入handler,而元資料會更新至metadata。

可以使用Tika的ParserUtils工具來根據檔案的mime-type來得到一個適當的Parser來進行解析工作。或者Tika還提供了一個AutoDetectParser根據不同的二進位制檔案的特殊格式 (比如說Magic Code),來尋找適合的Parser。

提示:主要tika-xx.jar,解析相應的檔案必須有相應的jar.例如:excel檔案必須用到poi-xx.jar

[java] view plain copy print?
  1. package com.miracle.tools;  
  2. import org.apache.tika.metadata.Metadata;  
  3. import org.apache.tika.parser.AutoDetectParser;  
  4. import org.apache.tika.parser.ParseContext;  
  5. import org.apache.tika.parser.Parser;  
  6. import org.apache.tika.sax.BodyContentHandler;  
  7. import org.xml.sax.ContentHandler;  
  8. import java.io.*;  
  9. /** 
  10.  * Created with IntelliJ IDEA.
     
  11.  * User: lianan 
  12.  * Date: 14-3-3 
  13.  * Time: 上午10:05 
  14.  * To change this template use File | Settings | File Templates. 
  15.  */
  16. publicclass TiKaUtil {  
  17.     publicstatic String parseFile(File file){  
  18.         Parser parser = new AutoDetectParser();  
  19.         InputStream input = null;  
  20.         try{  
  21.             Metadata metadata = new Metadata();  
  22.             metadata.set(Metadata.CONTENT_ENCODING, "utf-8");  
  23.             metadata.set(Metadata.RESOURCE_NAME_KEY, file.getName());  
  24.             input = new FileInputStream(file);  
  25.             ContentHandler handler = new BodyContentHandler();//當檔案大於100000時,new BodyContentHandler(1024*1024*10); 
  26.             ParseContext context = new ParseContext();  
  27.             context.set(Parser.class,parser);  
  28.             parser.parse(input,handler, metadata,context);  
  29.             for(String name:metadata.names()) {  
  30.                 System.out.println(name+":"+metadata.get(name));  
  31.             }  
  32.             System.out.println(handler.toString());  
  33.             return handler.toString();  
  34.         }catch (Exception e){  
  35.             e.printStackTrace();  
  36.         }finally {  
  37.             try {  
  38.                 if(input!=null)input.close();  
  39.             } catch (IOException e) {  
  40.                 e.printStackTrace();  
  41.             }  
  42.         }  
  43.         returnnull;  
  44.     }  
  45.     publicstaticvoid main(String argt0[])throws Exception{  
  46.         parseFile(new File("E:\\學習手冊pdf\\HOST.txt"));  
  47.     }  
  48. }  
  49. 最後記得修改資料庫對應欄位的型別!