package org.charsetconvert; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; public class CharsetConvertor { private String sourCharset; private final String destCharset; public CharsetConvertor(String destCharset) { this.destCharset = destCharset; } public CharsetConvertor(String sourCharset, String destCharset) { this.sourCharset = sourCharset; this.destCharset = destCharset; } public void convertFiles(String folderPath) { File folder = new File(folderPath); if (sourCharset == null) readCharsetFile(folder); else readFile(folder); } /** * 读取目录 * @param folder */ private void readFile(File folder) { File[] files = folder.listFiles(); for (File file : files) { if (file.isDirectory()) readFile(file);//递归读取目录 else convertFile(file);//转换编码 } } /** * 如果没有指定文件编码则自动获取文件编码,然后进行转码 * @param folder */ private void readCharsetFile(File folder) { File[] files = folder.listFiles(); try { for (File file : files) { if (file.isDirectory()) { readCharsetFile(file); } else { //获取当前文件编码 this.sourCharset = new CharsetDetector() .detectChineseCharset(new FileInputStream(file))[0]; //如果文件已经是要转换的编码则不转码 if(sourCharset.equals(destCharset)) continue; else convertFile(file); } } } catch (IOException e) { e.printStackTrace(); } } /** * 按指定编码读取文件并转换编码 * @param file */ public void convertFile(File file) { InputStream input = null; // FileInputStream fileInput = null; InputStreamReader inputReader = null; BufferedReader buffReader = null; OutputStream output = null; // FileOutputStream fileOutput = null; OutputStreamWriter outputWriter = null; BufferedWriter buffWriter = null; File tempFile = null; try { // System.out.println(sourCharset); // tempFile = // File.createTempFile(file.getName()+"."+sourCharset+"to"+destCharset+".", // ".tmp", file.getParentFile()); tempFile = File.createTempFile(file.getName() + ".", ".tmp", file.getParentFile()); // System.out.println(file); // System.out.println(tempFile); // new File(file.getName() + ".tmp").createNewFile(); // 创建输入输出流 input = new FileInputStream(file); //以指定编码读取文件 inputReader = new InputStreamReader(input, sourCharset); buffReader = new BufferedReader(inputReader); output = new FileOutputStream(tempFile); //以指定编码输出文件 outputWriter = new OutputStreamWriter(output, destCharset); buffWriter = new BufferedWriter(outputWriter); String temp; // 读取文件 while ((temp = buffReader.readLine()) != null) { // System.out.println("//////////////////////////////////////////"); // System.out.println(temp); // temp = new String(temp.getBytes(sourCharset), destCharset); // System.out.println(temp); // 写入数据,如果读取带BOM的UTF-8编码文件,则忽略BOM头 buffWriter.write(temp); buffWriter.newLine(); // 刷新 buffWriter.flush(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { // 关闭流 try { if (output != null) output.close(); if (buffWriter != null) buffWriter.close(); if (outputWriter != null) outputWriter.close(); if (input != null) input.close(); if (buffReader != null) buffReader.close(); if (inputReader != null) inputReader.close(); //将源文件替换为修改后的文件 if (file.delete()) { // 执行完buffReader.close() 之后才能删除文件 tempFile.renameTo(file); } System.out.println("已将文件"+file+"由"+sourCharset+"编码转换为"+destCharset+"编码"); } catch (IOException e) { e.printStackTrace(); } } } }
![](https://static.zuidaima.com/resource/img/heart_ico.png)
WHY-small LV15
2022年11月3日
2469095052 LV8
2021年2月2日
xwj123789 LV1
2020年4月1日
fenglin218 LV11
2019年6月21日
二两小面加个蛋 LV10
2019年3月18日
love9971 LV1
2018年12月11日
seedgiid LV2
2018年3月21日
wangdongchun LV8
2018年3月12日
keen1066 LV17
2017年12月13日
复制三次胖狗 LV7
2017年12月6日
![](https://static.zuidaima.com/resource/img/cattle_ico.png)
whhano LV2
2023年12月20日
1358849392 LV21
2023年6月6日
WHY-small LV15
2022年11月3日
nothing
2021年11月22日
暂无贡献等级
a14628909 LV4
2021年5月14日
2469095052 LV8
2021年2月2日
rainylan_er
2020年4月4日
暂无贡献等级
writerdreamer LV1
2020年4月4日
xwj123789 LV1
2020年4月1日
suhuike
2020年2月19日
暂无贡献等级