tika怎样加载Parser实现类的,怎样根据文档的mime类型调用相应的Parser实现类,本文接着分析
先熟悉一下tika的解析类的相关接口和类的UML模型:
public class AutoDetectParserTest { public static void main(String[] args) { InputStream is = null; try { //创建解析器,使用AutoDetectParser可以自动检测一个最合适的解析器 Parser parser = new AutoDetectParser(); File file = new File("c:/我的生词本.doc"); //指定解析文件中的文档内容 ////当文件大于100000时,new BodyContentHandler(1024*1024*1024); // BodyContentHandler handler = new BodyContentHandler(); // BodyContentHandler handler = new BodyContentHandler(1024*1024*1024); //WriteOutContentHandler就是用来处理文件大小的 BodyContentHandler handler = new BodyContentHandler(new WriteOutContentHandler(1024*1024*1024)); Metadata metadata = new Metadata(); //指定最基本的变量信息(即存放一个所使用的解析器对象) ParseContext parsecontext = new ParseContext(); is = new FileInputStream(file); //InputStream-----指定文件输入流 //ContentHandler--指定要解析文件的哪一个内容,它有一个实现类叫做BodyContentHandler,即专门用来解析文档内容的 //Metadata--------指定解析文件时,存放解析出来的元数据的Metadata对象 //ParseContext----该对象用于存放一些变量信息,该对象最少也要存放所使用的解析器对象,这也是其存放的最基本的变量信息 parser.parse(is, handler, metadata, parsecontext); //打印元数据 for(String name:metadata.names()) { System.out.println(name+":"+metadata.get(name)); } //打印解析到的文档内容 System.out.println(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(); } } } } }
整个解析的流程是
一、AutoDetectParser的parse方法:首先检测文件的mime类型,然后将解析任务交给基类CompositeParser的parse方法
二、AutoDetectParser的基类CompositeParser的parse方法:根据参数里面的mime类型获取解析类DefaultParser(支持所有已经注册的mime类型,由List<Parser> parsers成员提供)
扫描二维码关注公众号,回复:
597796 查看本文章
三、调用DefaultParser的parse方法(DefaultParser默认执行父类的parse方法),即基类CompositeParser的parse方法,根据参数里面的mime类型获取具体解析类
四、最后执行具体解析类的parse方法