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(); } } } }

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日

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日
暂无贡献等级