3.1.2 设计思想
基于该模块的特性,我们知道,在进行文本解析的时候,这里需要提供给模块一个文件,该模块通过对文件类型的分析,选择不同的文本解析器解析文件,最终返回给用户的便是文本的内容,即一个字符串便可以。
这里面可以向外公布一个接口,为了实现更加良好的封装,这样就需要采用工厂模式进行开发。所谓工厂模式就是设计模式当中应用最为广泛的模式之一。它相当于语法中的new,但是它相对与new在于它能够更好的封装,只对外提供工厂和接口,用户不需要知道内部类型的调用过程。
以本项目为例,可以对外只提供了一个接口和一个工厂,工厂内部实现对各个文本解析器的调度。首先实例化一个工厂,工厂对输入参数文件提取文件类型并且根据文件类型实例化不同的接口实现类,这些接口实现类都是一个超类的子类,继承超类的getTxt方法。这样,用户每次只需要根据工厂的createFileReader函数获取解析器,而不需要知道内部有关类名等各种信息。这也体现了软件开发的“不要跟陌生人说话”的原则。
对于更为底层的不同类型的文件解析器,可以主要依靠poi等第三方包对其进行解析,至于更为底层的实现,通过查找资料是可以知道实现方法的。其中:
1. 对于txt、cpp、h类型的文件,可以直接通过字符流读取,读取时指定“GBK”编码即可。
2. 对于pdf类型的文件,需要使用pdfbox对其进行解析,其重要使用到的第三方包为PDFBox-0.7.3.jar。其中由于需要处理加密问题,需要导入bouncycastle的各个包。
3. 对于其他的office类型的文件,主要采用POITextExtractor对其进行解析,其主要需要几个poi包:poi-3.7.jar。
4. 对于rtf文档,可以采用RTFEditorKit对其进行解析。
3.1.3 数据流程图
图3.1.3.1 文本解析过程流程图
3.1.4 对外接口
文件解析子模块主要通过对文件的后缀名进行分析,然后通过工厂模式获取相应接口实现类的实例。其向外公开两部分:
Com.dts.logic.filereader.DtsFileReader:该接口有一个方法,定义为public String getTxt(File file) throws Exception;其中输入为File文件,通过调用函数getTxt便可解析出文件的内容。
Com.dts.logic.filereader.FileReaderFactory:该类便是工厂模式的工厂,其中有一个获取DtsFileReader实现类实例的方法:public DtsFileReader createFileReader(String fileName);该函数通过输入一个文件名,然后对文件名进行解析,最终输出一个DtsFileReader接口的实现类实例。
外部其他模块在调用该模块的时候只要先创建一个FileReaderFactory,然后将文件名称传给函数createFileReader就能获取一个对应于该文件类型的文本解析器,然后通过该文本解析器所继承的getTxt方法,即可获得模块的输出,文件的内容。
通过上述分析,可以看到利用工厂模式可以很好的将内部信息封装起来,对外界模块都是透明的。
3.1.5 异常处理
该模块主要是对被索引文件的操作,因此异常处理也常常都是围绕文件流的IO或者第三方包中的异常。具体异常信息举例如下:
A. IOException:由于文件解析的时候需要用到第三方包中提供的句柄或者直接通过文件流进行读取,因此文件的IO便有可能出错。比如在RtfReader的读取需要使用FileInputStream,该类的创建是以文件作为输入,流在使用之后需要关闭,调用.close()方法可能会导致IOException。 Lucene桌面搜索引擎的设计与实现(5):http://www.751com.cn/jisuanji/lunwen_7560.html