Java按照章节分割大型小说文档_琳1st的博客-CSDN博客_java 小说分章

package com.company;import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** https://blog.csdn.net/zdl177/article/details/116383081* Java按照章节分割大型小说文档*/
public class SplitBigTXT {/*** 需要传入的参数*/// 源文件路径private String srcPath;// 目标文件夹private String destDirPath;// 每几章分割一部分private int chaps;/*** 需要计算的值*/// 文件名称private String fileName;// 文件的大小private long fileSize;// 存储每一部分起始位置和终点位置的private List<Long> rowsList;// 目标路径的集合private List<String> destFiles;private List<String> chapterTitles;// 分多少个子文件private int size;private IReadTxt mReadTxt;/*** 有参构造器* @param srcPath 源文件的路径字符串* @param destDirPath 目标目录的路径字符串* @param chaps 每几章分一个子包*/public SplitBigTXT(String srcPath, int chaps) {// 方法重载this(srcPath, getDestDir(srcPath), chaps);}public SplitBigTXT(String srcPath, int chaps, IReadTxt readTxt) {this(srcPath, getDestDir(srcPath), chaps);mReadTxt = readTxt;}/*** 根据源文件路径生成目标文件夹* @param srcPath* @return*/private static String getDestDir(String srcPath) {String[] srcNames = srcPath.split("\\.");return srcNames[0];}/*** 重载构造器* 有参构造器* @param srcPath 源文件的路径字符串* @param destDirPath 目标目录的路径字符串* @param chaps 每几章分一个子包*/public SplitBigTXT(String srcPath, String destDirPath, int chaps) {// 赋值this.srcPath = srcPath;this.destDirPath = destDirPath;this.chaps = chaps;// 其余另外需要计算的值另外用方法init(chaps, srcPath, destDirPath);}/*** 初始化的辅助方法。*         用来初始化需要根据传入的参数计算出初始值的属性*/private void init(int chaps, String srcPath, String destDirPath) {// 文件名称this.fileName = new File(this.srcPath).getName();// fileSize 初始化File srcFile = new File(this.srcPath);this.fileSize = srcFile.length();// rowsList 位置行数集合getChapsRows();// 一共分割成多少个子文件size = (int) Math.ceil(rowsList.size() * 1.0 / chaps);// destFiles 初始化this.destFiles = new ArrayList<>();// 分割源文件存放的路径和子文件的命名String[] fileNames = this.fileName.split("\\.");for (int i = 0; i < size; i++) {// 将分割的子文件名,存入到 destFiles 集合中。this.destFiles.add(destDirPath + File.separator + fileNames[0] + "-part_" + (chaps == 1 ? chapterTitles.get(i) : (i + 1)) + "." + fileNames[1]);}}/*** 辅助方法:初始化 rowsList* 章节名的正则为: 第.{1,7}[章节回][\s\n]*/private void getChapsRows() {// 初始化 rowsListthis.rowsList = new ArrayList<>();this.chapterTitles = new ArrayList<>();/*** 思路:使用 BufferedReader 的 readLine() 方法读取,匹配章节正则。*/// 创建计数器:记录行数long row = 0L;// 创建BufferedReader 流try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(this.srcPath), "UTF-8"))) {// 创建正则表达式Pattern p = Pattern.compile("第.{1,8}[章节回][\\s\\n]");// 匹配对象Matcher m = null;// 读取数据String line = null;// 读取并匹配while ((line = br.readLine()) != null) {// 行数 + 1row += 1;// 如能匹配上,则为章节行m = p.matcher(line);if (m.find()) {// 满足条件,记录行数chapterTitles.add(line);this.rowsList.add(row);}}} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}/*** 分割子文件*/private void split() {// 创建目标文件夹File destDir = new File(this.destDirPath);if (!destDir.exists()) {destDir.mkdirs();}// 每个分割成的子文件包括的行数for (int i = 1; i <= size; i++) {if (i == 1) { // 第一个文件的大小splitDetail(i, 1L, rowsList.get(i * chaps) - 1);} else if (i == size) { // 最后一个子文件splitDetail(i, rowsList.get((i - 1) * chaps));} else { // 普通子文件的行数splitDetail(i, rowsList.get((i - 1) * chaps), rowsList.get(i * chaps) - 1);}}}/*** 分割细节* @param longs 起始和终止行*/private void splitDetail(int num, Long... longs) {try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(this.srcPath), "UTF-8"));BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(this.destFiles.get(num - 1)), "UTF-8"))) {// 行数计数器long row = 0L;// 读取数据String line = null;String chapterContent = "";// 判断一下是否是最后一个子文件if (num == size) { // 但是最后一个时,从给定的起始位置一致写到文档最后while ((line = br.readLine()) != null) {// 行数 + 1row += 1;if (row >= longs[0]) { // 从给定的起始位置一致写到最后即可bw.write(line + "\n"); // 手动添加换行符chapterContent += line + "\n";}}// 刷滞留数据bw.flush();} else {while ((line = br.readLine()) != null) {// 行数 + 1row += 1;if (row >= longs[0] && row <= longs[1]) { // 只写入给定的起始位置之间的内容bw.write(line + "\n"); // 手动添加换行符chapterContent += line + "\n";}}// 刷滞留数据bw.flush();}mReadTxt.read(chapterTitles.get(num-1),chapterContent);} catch (Exception e) {e.printStackTrace();}}public interface IReadTxt {void read(String title, String content);}/*** 程序入口 : main 方法* @param args*/public static void main(String[] args) {// 源文件的路径字符串String srcPathStr = "D:\\04tmp\\test.txt";// 每多少章分割成一个int chaps = 1;// 初始化实例SplitBigTXT sbt = new SplitBigTXT(srcPathStr, chaps, new IReadTxt() {@Overridepublic void read(String title, String content) {System.out.println("title = " + title);System.out.println("content = " + content);}});// 开始时间long start = System.currentTimeMillis();// 分割sbt.split();// 结束时间long end = System.currentTimeMillis();System.out.println("完成!\n共耗时:" + (end - start) + " 毫秒!");}}

Java按照章节分割大型小说文档相关推荐

  1. Java集成第三方oss对象存储——文档篇

    Java集成第三方oss对象存储--文档篇 相关文章 简介 官方文档 应用场景 Web 配置操作 添加依赖 创建存储空间 相关文章 简介 阿里云对象存储OSS(Object Storage Servi ...

  2. JAVA中利用DOM解析XML文档

    JAVA中利用DOM解析XML文档 package org.sws.utils; import java.io.File;import java.io.IOException; import java ...

  3. 利用java实现android项目结构API文档

    利用java实现android项目结构API文档 2012-11-16 快速生成API文档列表 在android项目中的.CLASSPATH文件里添加android.jar路径 例如: <cla ...

  4. Java注释--单行注释、多行注释、文档注释

    Java注释–单行注释.多行注释.文档注释 单行注释和多行注释 语法格式 //单行注释 //单行注释 //注释内容/* 这里可以放置多行注释 多行注释的内容 Java真的学起来有意思!! */ 举例: ...

  5. java pdf打印_Java 打印PDF文档

    本文将介绍如何在Java应用程序中打印PDF文档.一般有以下三种常见打印方式:静默打印 显示打印对话框打印 打印PDF时自定义纸张大小 使用工具:Free Spire.PDF for Java 创建运 ...

  6. Java DOC 转换给 PDF 格式文档的代码

    工作过程,把写代码过程经常用的代码片段备份一次,下面的代码段是关于Java DOC 转换给 PDF 格式文档的代码,应该对码农们有所用. import java.io.File; import jav ...

  7. 使用语义分割架构的文档扫描仪 DeepLabV3

    0 介绍 地址:https://learnopencv.com/deep-learning-based-document-segmentation-using-semantic-segmentatio ...

  8. Java 使用word模板创建word文档报告教程

    上面是java 利用word模板生成的一个word报告文档,利用的是第三方类库Poi-tl 是实现的. poi-tl是一个基于Apache POI的Word模板引擎,也是一个免费开源的Java类库,你 ...

  9. JAVA实现模板word文档导入,Java依据word模板生成word文档之后台解析和实现及部分代码(一)...

    Java根据word模板生成word文档之后台解析和实现及部分代码(一) 后台主要工作是解析XML定义的标签文件,并获取到数据集,放入到Map中,然后调用Jacob.jar中提供的相关方法来实现替换. ...

最新文章

  1. JW Player使用简介
  2. Git基础 1 ---- 版本控制系统的介绍
  3. JAVA js的escape函数、解析用js encodeURI编码的字符串、utf8转gb2312的函数
  4. Python机器学习:多项式回归与模型泛化007偏差方差平衡
  5. 1.3_bubble_sort_冒泡排序
  6. tableau无法建立连接_欧普照明利用 Tableau 解放数字化人才,助力企业数字化转型...
  7. 个推如何管理亿级代码的质量?持续集成SonarQube 代码质量管理系统
  8. [Git] Squash all of my commits into a single one and merge into master
  9. 一维 cnn matlab,1D-CNN 一维信号的深度学习算法和例子包括CNN - 下载 - 搜珍网
  10. 花了3个小时解决了和异地女朋友一起看电影的需求(内附源码)
  11. [我参加NVIDIA Sky Hackathon](模型训练ssd系列)
  12. Windows xp .iso下载大全——超全面超难找的收藏版(一)
  13. Python3实现斐波那契数列.md
  14. python之dict
  15. 蓝奏云批量下载修复版 v0.3
  16. C语言实现求n的阶乘(n!),阶乘的和。
  17. 马克思主义哲学历史唯物主义
  18. rtmp支持h265推流
  19. Docker 镜像(image)
  20. 文件/文件夹管理与操作命令

热门文章

  1. C语言之检验三边能否构成三角形
  2. yolov5训练过程可视化
  3. 在linux系统中查看组管理信息命令,Linux常用命令(五)账号和组管理
  4. 计算机组装与维护论文 致谢,计算机组装论文范文2篇
  5. 376.2集中器本地通信模块接口协议学习总结
  6. 特种浓缩分离:管式离心机的结构与原理
  7. python 学习笔记(02)
  8. Oracle 在存储过程或函数中执行字符串sql
  9. Springboot毕设项目办公用品管理系统c1139(java+VUE+Mybatis+Maven+Mysql)
  10. c语言 音乐循环,在C语言控制台程序中播放MP3音乐