package ch02.lucenedemo.preprocess; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.nio.Buffer; import java.util.*; import javax.sound.sampled.Line; import sun.text.normalizer.Replaceable; public class FilePreprocess { //两个参数 一个是要被处理的源文件 //另一个是处理后的文件输出路径 public static void preprocess(File file,String outputDir) { try { splitToSmallFiles(charactorProcess(file,outputDir+"output.all"),outputDir); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } //对文件字符进行全角半角处理 public static File charactorProcess(File file,String destFile)/*传递的是book.txt和testforder/output.all*/ throws Exception { BufferedWriter writer = new BufferedWriter(new FileWriter(destFile));//声明字符输出缓冲流,文件是是testforder/output.all BufferedReader reader = new BufferedReader(new FileReader(file));//从book.txt中读入字符输入缓冲流 String line = reader.readLine();//读入一行数据通过下列字符之一即可认为某行已终止:换行 ('/n')、回车 ('/r') 或回车后直接跟着换行 while(line !=null)//包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null { if(!line.equals("/r/n")) { String newline = replace(line); writer.write(newline); writer.newLine();//换行 } line = reader.readLine(); } reader.close(); writer.close(); return new File(destFile); } /* * 拆分成小文件 */ public static void splitToSmallFiles(File file, String outputpath)/*传递的是output.all和D:/testforder/*/ throws Exception { int filePointer = 0; int MAX_SIZE = 10240; BufferedWriter writer = null; BufferedReader reader = new BufferedReader(new FileReader(file)); StringBuffer buffer = new StringBuffer(); String line = reader.readLine(); //System.out.println(a+"sss"); //int bI= buffer.; //System.out.println(bI); while(line!=null) { buffer.append(line).append("/r/n"); //buffer.capacity(); if(buffer.toString().getBytes().length >=MAX_SIZE) { writer = new BufferedWriter(new FileWriter(outputpath+"output"+filePointer+".txt")); writer.write(buffer.toString()); writer.close(); filePointer++; buffer = new StringBuffer(); } line=reader.readLine(); } writer = new BufferedWriter(new FileWriter(outputpath+"output"+filePointer+".txt")); writer.write(buffer.toString()); writer.close(); } /* * 全角半角转换 */ public static String replace (String line) throws Exception { HashMap map = new HashMap(); map.put(",", ","); map.put("。", "."); map.put("〈", "<"); map.put("》", ">"); map.put("《", "<"); int length = line.length(); for(int i =0;i<length;i++) { String charat = line.substring(i,i+1); if(map.get(charat)!=null) { line=line.replace(charat, (String)map.get(charat)); } } return line; } public static void main(String[] args) { String inputFile = "d://book.txt"; //设置处理后文件存放位置 String outputDir = "d://testfolder//"; //判断处理后文件存放的文件夹是否存在,如果不存在,则创建文件夹 if(!new File(outputDir).exists()) { new File(outputDir).mkdirs(); }//一般连着用 //创建一个FilePreprocess类,并调用preprocess方法进行预处理 FilePreprocess filePreprocess = new FilePreprocess(); filePreprocess.preprocess(new File(inputFile), outputDir); } }
(来自书中的代码)
主要思想:建立preprocess方法是为了建立splitToSmallFiles方法方便抛出异常
1.先建立字符缓冲输出流,在D/testforder/建立output.all,声明字符缓冲输入流读入D:/book.txt的
字符
2.读入一行数据直到遇到换行或回车,执行while循环判断是否读到文章末尾(即没有新的自然段),while
循环里是进行判断全角替换成半角。
3.如果字节数过多,则拆分成多个output文件
核心思想:
splitToSmallFiles的算法是
把改好的全角转半角文件作为函数参数File型传递进来进行读取,依次把每自然段加入到StringBuffer
的对象中,直到StringBuffer的字节数>10240则存储到testForder/output[filePointer]里。
charactorProcess是对文件的全角转换成半角
在replace函数中做一个map映射,针对全角符号设相应的半角符号value值。依次读取book.txt中的自然
段进行转换,所有自然段转换完毕后存储到output.all。
replace代码注释:
HashMap map = new HashMap();
map.put(",", ",");//作映射
map.put("。", ".");
map.put("〈", "<");
map.put("》", ">");
map.put("《", "<");
int length = line.length();//获取自然段的长度
for(int i =0;i<length;i++)
{
String charat = line.substring(i,i+1);//依次截取每个字符进行判断
if(map.get(charat)!=null)//如果找到的是字符
{
line=line.replace(charat, (String)map.get(charat));//调用String类自带的replace方法,把
所有的需要映射的对象进行替换
}
}