由于手机小说阅读器只识别“第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 }