修改txt文档小说的标题格式


由于手机小说阅读器只识别“第xxx章”之类的这种标题,
故需将txt文档中标题中的“\d{2,3}\.?”修改为“第\d{2,3}章”。
例:“01.萨卡斯基中将需要怀疑人生”修改为“第01章 萨卡斯基中将需要怀疑人生”
整体思路为:读取文档内容、regex替换文档相关内容、写入文档内容。
优化前代码如下:
 1 import java.io.*;  2 import java.util.regex.Matcher;  3 import java.util.regex.Pattern;  4  5 public class Test {  6 private static String read(File src){  7 String text = "";  8 if(!src.exists())  9 return text; 10 StringBuilder sb = new StringBuilder(text); 11 BufferedReader br = null; 12 try { 13 br=new BufferedReader(new InputStreamReader(new FileInputStream(src),"gbk")); 14  String line; 15 while((line=br.readLine())!=null) 16 sb.append(line).append("\r\n"); 17 text = new String(sb); 18 } catch (IOException e) { 19  e.printStackTrace(); 20 } finally { 21 try { 22  br.close(); 23 } catch (IOException e) { 24  e.printStackTrace(); 25  } 26  } 27 return text; 28  } 29 30 private static void write(File dest,String text){ 31 BufferedWriter bw = null; 32 try { 33 if(!dest.exists()) 34  dest.createNewFile(); 35 bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(dest),"utf8")); 36  bw.write(text); 37 } catch (IOException e) { 38  e.printStackTrace(); 39 } finally { 40 try { 41  bw.close(); 42 } catch (IOException e) { 43  e.printStackTrace(); 44  } 45  } 46  } 47 48 /** 49  * 将标题中的“\d{2,3}\.{0,1}”修改为“第\d{2,3}章” 50  * @param src 51  * @param dest 52 */ 53 public static void improveAndCopy(File src,File dest){ 54 String text=read(src); 55 Pattern pattern = Pattern.compile("(\\r\\n)(\\d{2,3})\\.?"); 56 Matcher m = pattern.matcher(text); 57 StringBuffer sb = new StringBuffer(); 58 while(m.find()) 59 /** 60  * 从上一次修改位置的下个字符开始,到这次修改位置,都append到sb中。 61  * 若为第一次修改,默认上一次修改位置为第0个字符。即从第一个字符到这次修改位置append到sb中。 62 */ 63 m.appendReplacement(sb,m.group(1)+"第"+m.group(2)+"章 "); 64 //将文档中剩下的内容append到sb中 65  m.appendTail(sb); 66 text=sb.toString(); 67  write(dest,text); 68  } 69 70 public static void main(String[] args) { 71 File src =new File("C:\\Users\\Administrator\\Downloads\\我萨卡斯基才不会轻易狗带.txt"); 72 File dest=new File("C:\\Users\\Administrator\\Desktop\\我萨卡斯基才不会轻易狗带.txt"); 73  improveAndCopy(src,dest); 74  } 75 }

以上代码流程为:读取整片整篇文档、regex替换整篇文档、写入整篇文档。其中每次regex替换都需要扫描整篇文档。

文本量越大,regex替换所需时间越长。所以可以每读取一行,regex替换后直接写入,这样每次regex替换只需扫描一行内容(每行结尾为\r\n),从而减少regex替换所需时间。

优化后代码如下:

 1 import java.io.*;  2 import java.util.regex.Matcher;  3 import java.util.regex.Pattern;  4  5 public class Test {  6  7 /**  8  * 将标题中的“\d{2,3}\.{0,1}”修改为“第\d{2,3}章”  9  * @param src 10  * @param dest 11 */ 12 public static void improveAndCopy(File src,File dest){ 13 BufferedReader br = null; 14 BufferedWriter wr = null; 15 try { 16 if(!src.exists()) 17 return; 18 if(!dest.exists()) 19  dest.createNewFile(); 20 br=new BufferedReader(new InputStreamReader(new FileInputStream(src),"gbk")); 21 wr=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(dest),"utf8")); 22  String line; 23 while((line=br.readLine())!=null){ 24 line = replace(line); 25  wr.write(line); 26 wr.newLine(); //换行号 27  } 28 wr.flush(); //将缓冲区内容写入文件 29 } catch (IOException e) { 30  e.printStackTrace(); 31 } finally { 32 try { 33  br.close(); 34  wr.close(); 35 } catch (IOException e) { 36  e.printStackTrace(); 37  } 38  } 39  } 40 41 private static String replace(String content){ 42 Pattern pattern = Pattern.compile("^(\\d{2,3})\\.?"); 43 Matcher m = pattern.matcher(content); 44 if(m.find()) 45 content = m.replaceFirst("第"+m.group(1)+"章 "); 46 return content; 47  } 48 49 public static void main(String[] args) { 50 File src =new File("C:\\Users\\Administrator\\Downloads\\我萨卡斯基才不会轻易狗带.txt"); 51 File dest=new File("C:\\Users\\Administrator\\Desktop\\我萨卡斯基才不会轻易狗带.txt"); 52  improveAndCopy(src,dest); 53  } 54 }


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM