前言
之前写过一篇关于智能断章的博客,那里的断章方式是得到其中的章节名并且把章节内容保存到数据库。现在看来这种方式确实有点低了,不能获取个目录就存几M或者十几M的内容到数据库吧,所以也有博友询问能不能得到章节名所在的位置然后直接从那里开始访问,一开始我是拒绝的,因为实现不了,后来发现还是可以做到的,只能是因为自己当时对别人写的代码理解的不够透彻,对实现思路不太明确,现在可以了。
具体实现
在实现之前,需要对txt文件做一些假设:
- 章节名独占一行
- 每一段的内容不会过于庞大
有了这两点假设就可以了,现在来说说应该怎么做。
额,还是补充一下,因为不同的txt文件可能使用的编码不同,有的是UTF-8,有的是GBK,如果解码方式选错了,那么得到的就只能是乱码了。所以这里我使用了网上开源的一个类,它可以帮助我们自动判断编码类型,准确率还是很高的。
好了,进入正文,因为要从任意位置读取文本文件,那么我们常用的FileInputStream或者BufferedReader都是不能用的,能使用的只有RandomAccessFile,它是随机读取文件类,用它才可以实现我们的目的。
我们要做的是得到每一段的内容,上面我们已经做了假设,每一段的内容并不会很大,直接保存在内存中是没有问题的,然后我们将每一段的内容进行判断,也就是进行正则匹配,写出章节名称的正则表达式。如果可以匹配成功,那么就可以此章节名对应的位置,如果需要访问那么就可以直接从此位置读取内容,从而就做到了智能断章。
小结
我也没有说的太详细,具体的大家可以看代码,里面写的很清楚,东西也确实不难,只能说当时自己没有好好的理清思路,所以实现起来就很复杂而且效率低下。
下载