java实践-将大文本分割成多页

196 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情

将大文本分割成多页的实践.

例如将一篇小说的内容按照章节分割成多个txt文档

先分析文本结构:

  • 每篇文章开头都是Chapter 1: Crimson这样格式的一行

所以初步思路是读取每行, 如果正则匹配到这样的格式, 就新建一个文件, 文件名以chapter之后的章名命名. 所有的新文件我们都放在lord文件夹下.

很合理, 开干吧!

public class Processor {  
    public static void main(String[] args) throws IOException {  
        BufferedReader bufferedReader = new BufferedReader(new FileReader("Lord.txt"));  
        BufferedWriter bufferedWriter = null;  
        int count = 0;  
        String line = null;  
        while ((line = bufferedReader.readLine()) != null) {  
            if (line.startsWith("Chapter")) {  
                count++;  
                if (count != 1) {  
                    bufferedWriter.close();  
                }  
                String fileName = line.replace(":", "");  
                fileName = fileName + ".txt";  
                bufferedWriter = new BufferedWriter(new FileWriter("lord/" + fileName));  
            }  
            bufferedWriter.write(line + System.lineSeparator());  
        }  
        bufferedReader.close();  
        bufferedWriter.close();  
    }  
}

这里之所以使用缓冲流作为io流, 主要是可以用readline()这个方法, 一次获取一行数据, 方便我们验证是否以Chapter开头.

但是在写的时候发现出现了一点问题, 主要是filename起的有问题, 我们设置的是chapter之后作为文件名, 可以有时候会出现这样的情况:

Chapter 240: Trying Your Luck?

这里的?是特殊字符, 于是需要把所有的特殊字符都替换掉. 在上述代码中添加几句:

String fileName = line.replace(":", "");  
fileName = fileName.length() >= 41 ? fileName.substring(0, 41) : fileName;  
fileName = fileName.replace("?", "");  
fileName = fileName.replace("!", "");  
fileName = fileName.replace(">", "");  
fileName = fileName + ".txt";

这里还限制了filename不能太长, 原因是越长的句子, 后面越有可能出现特殊字符, 而且一个文件名也没必要太长, 这里的长度限制在40个字符以内.

再次运行, 成功得到了所有分割的文件, bingo!