中文亂碼真的是讓人很頭疼問題,有了這個方法應該能緩解這種頭疼,用的是遞歸方式查找文件,直接在原文件中修改,小心使用(在本地測試效果有點詭異呀,沒有達到預期效果)。
1 package com.hy.util; 2 3 import info.monitorenter.cpdetector.io.*; 4 5 import java.io.BufferedReader; 6 import java.io.File; 7 import java.io.FileInputStream; 8 import java.io.FileNotFoundException; 9 import java.io.FileOutputStream; 10 import java.io.IOException; 11 import java.io.InputStreamReader; 12 import java.io.OutputStreamWriter; 13 14 public class CharacterChange{ 15 16 public static void main(String[] args) throws FileNotFoundException, IOException { 17 18 // 封裝目錄,需要修改文件格式的路徑 19 File srcFolder = new File("F:\\test"); 20 21 String newCharater = "GBK"; 22 23 getAllJavaFilePaths(srcFolder, newCharater); 24 } 25 26 private static void getAllJavaFilePaths(File srcFolder, String newCharater) throws IOException { 27 28 // 獲取該目錄下所有的文件或者文件夾的File數組 29 File[] fileArray = srcFolder.listFiles(); 30 31 // 遍歷該File數組,得到每一個File對象 32 for (File file : fileArray) { 33 34 // 繼續判斷是否以特定文件結尾,不是的話繼續調用getAllJavaFilePaths()方法 35 if (file.isDirectory()) { 36 getAllJavaFilePaths(file, newCharater); 37 } else { 38 if (file.getName().endsWith(".sql")) { 39 try { 40 FileInputStream fis = new FileInputStream(file); 41 //oldcCharacter 獲取特定的字符集 42 String oldcCharacter = getChartsetName(file); 43 InputStreamReader isr = new InputStreamReader(fis, oldcCharacter); 44 BufferedReader br = new BufferedReader(isr); 45 String str = null; 46 // 創建StringBuffer字符串緩存區 47 StringBuffer sb = new StringBuffer(); 48 // 通過readLine()方法遍歷讀取文件 49 while ((str = br.readLine()) != null) { 50 // 使用readLine()方法無法進行換行,需要手動在原本輸出的字符串后面加"\n"或"\r" 51 str += "\n"; 52 sb.append(str); 53 } 54 String fileSource = sb.toString(); 55 // 以GBK格式寫入文件,file.getAbsolutePath()即該文件的絕對路徑,false代表不追加直接覆蓋,true代表追加文件 56 FileOutputStream fos = new FileOutputStream(file.getAbsolutePath(), false); 57 OutputStreamWriter osw = new OutputStreamWriter(fos, newCharater); 58 try { 59 osw.write(fileSource); 60 System.out.println( 61 "將:" + oldcCharacter + " 的文件:" + file.getAbsolutePath() + "修改字符集為:" + newCharater); 62 } finally { 63 osw.flush(); 64 osw.close(); 65 fos.close(); 66 br.close(); 67 isr.close(); 68 fis.close(); 69 } 70 } catch (Exception e) { 71 } 72 } else { 73 System.err.println("該文件以忽略:" + file.getAbsolutePath()); 74 } 75 } 76 } 77 } 78 79 public static String getChartsetName(File file) { 80 String chartsetName = null; 81 // 獲取文件編碼格式 82 CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance(); 83 detector.add(new ParsingDetector(true)); 84 detector.add(JChardetFacade.getInstance()); 85 detector.add(ASCIIDetector.getInstance()); 86 detector.add(UnicodeDetector.getInstance()); 87 java.nio.charset.Charset charset = null; 88 try { 89 if (file != null) { 90 charset = detector.detectCodepage(file.toURL()); 91 } 92 } catch (Exception ex) { 93 ex.printStackTrace(); 94 } 95 if (charset != null) { 96 chartsetName = charset.name(); 97 } else { 98 chartsetName = "未知的編碼"; 99 } 100 return chartsetName; 101 } 102 /* 103 * <dependency> 104 <groupId>net.sourceforge.jchardet</groupId> 105 <artifactId>jchardet</artifactId> 106 <version>1.0</version> 107 </dependency> 108 <dependency> 109 <groupId>antlr</groupId> 110 <artifactId>antlr</artifactId> 111 <version>2.7.7</version> 112 </dependency> 113 */ 114 }