TXT格式小说实现分章节

最近一直在手机上看小说,于是想能不能在电脑上看,在网上查了一下资料,主要参考这一篇https://blog.csdn.net/inowcome/article/details/6047661,写了一个小程序,实现把一个TXT格式的小说每一章做成一个html文件,还有一个章节列表。

这是原小说

TXT格式小说实现分章节_第1张图片

这是生成的html文件

TXT格式小说实现分章节_第2张图片

TXT格式小说实现分章节_第3张图片

章节列表

TXT格式小说实现分章节_第4张图片

实现方式很简单,以下是源代码

package com.sjm.chapterSeparater;


import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;


public class Separater {
/**
* 生成小说文件夹
* @param novel
* @return 成功生成返回文件夹名,已存在返回null
*/
private static String genarateFolder(File novel) {
if(!novel.isFile() || !novel.getAbsolutePath().endsWith(".txt")) {
return null;
}
String novelName = novel.getAbsolutePath();
String folderName = novelName.substring(0, novelName.indexOf(".txt"));
File folder = new File(folderName);
if (!folder.exists()) {
folder.mkdirs();
return folderName;
}
return null;
}
    /**
     * 输出html文件
     * @param bodyContent
     * @param currentFileName
     * @param currentPageIndex
     * @throws Exception
     */
    private static void generateChapterHtmlFile(int currentPageIndex,String content,List chapterList,String folderName)throws Exception {
         String pageContent=""
                             +""
                             +""+chapterList.get(currentPageIndex)+""
                             +""
                             +""
                             +"

"+chapterList.get(currentPageIndex)+"

"
                             +"
"+content+"
"
                             +"
"
                             +""
                             +""
                             +""
                             +""
                             +""
                             +""
                             +"
上一页目录下一页
"
                             +"";
         String filePath=folderName+"\\"+chapterList.get(currentPageIndex)+".html";
         PrintWriter out=new PrintWriter(new BufferedWriter(new FileWriter(filePath)));
         out.print(pageContent);
         out.flush();
         out.close();
    }
    /**
     * 获取章节列表
     * @param novel
     * @throws Exception
     */
    private static List getChapterList(File novel) throws Exception {
    List chapterList = new ArrayList();
    FileInputStream fileInputStream = new FileInputStream(novel);
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream,getCharsetOfNovel(novel));
BufferedReader novelbr = new BufferedReader(inputStreamReader);
int currentIndex = 1;
String line = novelbr.readLine();
while(line != null) {
if(line.indexOf("第") == 0 && line.indexOf("节") != -1) {
chapterList.add("第" + currentIndex + "章" + line.substring(line.indexOf("节")+1));
currentIndex ++;
} else if (line.indexOf("第") == 0 && line.indexOf("章") != -1) {
chapterList.add("第" + currentIndex + "章" + line.substring(line.indexOf("章")+1));
currentIndex ++;
}
line = novelbr.readLine();
}
novelbr.close();
fileInputStream.close();
return chapterList;
    }
    private static void generateChapterMenuHtmlFile(String folderName,List chapterList) throws Exception {
    String menuPath = folderName+"\\章节目录.html";
    StringBuilder pageContent = new StringBuilder();
    pageContent.append(""
                +""
                +""+folderName.substring(folderName.lastIndexOf("\\")+1)+"章节目录"
                +""
                +""
                + "

章节目录


"
                + "");
    for (int i = 0; i < chapterList.size(); i++) {
    if(i == 0) {
    pageContent.append("");
    } else if(i % 5 == 0) {
    pageContent.append("");
    pageContent.append("");
    }
pageContent.append("");
}
    pageContent.append("
"+chapterList.get(i)+"
"+chapterList.get(i)+"
");
    PrintWriter out=new PrintWriter(new BufferedWriter(new FileWriter(menuPath)));
        out.print(pageContent.toString());
        out.flush();
        out.close();
    }
    /**
     * 判断TXT文件编码方式
     * @param fileName
     * @return
     * @throws IOException
     */
    private static String getCharsetOfNovel(File novel) throws IOException {  
    BufferedInputStream bin = new BufferedInputStream(new FileInputStream(novel));  
         byte[] head = new byte[3];  
         bin.read(head, 0, head.length);
         String encoding = "gb2312";    
         if (head[0] == -1 && head[1] == -2 )    
        encoding = "UTF-16";    
         if (head[0] == -2 && head[1] == -1 )    
        encoding = "Unicode";    
         if(head[0]==-17 && head[1]==-69 && head[2] ==-65)    
        encoding = "UTF-8";       
         return encoding;   
    } 
    public static void generate(File novel) throws Exception {
    String folderName = genarateFolder(novel);
    if(folderName == null) {
    return ;
    }
    List chapterList = getChapterList(novel);
    generateChapterMenuHtmlFile(folderName, chapterList);
    FileInputStream fileInputStream = new FileInputStream(novel);
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream,getCharsetOfNovel(novel));
BufferedReader novelbr = new BufferedReader(inputStreamReader);
int currentPageIndex = -1;
StringBuilder content = new StringBuilder();
String line = novelbr.readLine();
while(line != null) {
if(line.indexOf("第") == 0 && (line.indexOf("节") != -1 || line.indexOf("章") != -1)) {
if(currentPageIndex > -1) {
generateChapterHtmlFile(currentPageIndex, content.toString(),chapterList,folderName);
content.delete(0, content.length());
}
currentPageIndex ++;
} else if(currentPageIndex > -1) {
content.append(line+"

");
}
line = novelbr.readLine();
}
novelbr.close();
fileInputStream.close();
    }
    public static void main(String[] args) throws Exception {
File folder = new File("F:\\小说");
File[] files = folder.listFiles();
for (int i = 0; i < files.length; i++) {
Separater.generate(files[i]);
}
}

}


      所有小说的TXT文件都下载在“F:\小说”文件夹里,我把这个程序打包成一个jar包也放在这个文件夹里,每次下载后只要执行一次就好,已经生成处理过的小说会直接跳过。

写程序的时候也遇到了一些问题

1.小说文件编码格式不统一,有些是utf-8,有些是gb2312,查了之后发现只要通过判断前几个字节可以知道文件编码,gb2312前几个字节没有规律,无bom的utf8也不能判断,还好windows下默认有bom。

2.打包之后发现执行后生成的html中文乱码,百度了一下是因为Java虚拟机执行后默认编码为gbk,命令行执行时加Dfile.encoding=UTF-8可以解决,我直接添加系统环境变量,变量名为: JAVA_TOOL_OPTIONS, 变量值为:-Dfile.encoding=UTF-8。

你可能感兴趣的:(闲得无聊)