java 自己實現專案一鍵全轉碼 解決檔案亂碼問題
經常在使用外部匯入的專案,開啟之後想學習一番,結果發現所有註釋都亂碼,看起來很頭疼,這個問題困擾我很久,相信大家在學習過程中也會遇到。所以昨晚寫了一個小程式,只要輸入專案檔案的根目錄,可以實現專案內所有java檔案自動轉碼的功能。預設是從GBK轉碼為UTF-8。
首先聊聊正常在專案匯入eclipse中如果出現亂碼有哪幾處地方可以用來修改檔案顯示的編碼
(1)window->Preferences->Workspace->Text file encoding裡修改
(2)專案上右擊->Properties->Resource裡修改
(3)如果仍然發現亂碼,在單個java檔案上右擊->Properties->Resource裡修改單個檔案的編碼
以上方式只能使得Eclipse能夠正常的顯示檔案,不能夠實現轉碼。最初我使用EditPlus裡的功能實現檔案的轉碼
如果要轉碼多個檔案,開啟多個,然後選擇批量轉碼即可,然而還是挺累的。下面進入正題,實現一個輸入專案根路徑名,就能完成所有java檔案自動轉碼的功能(預設由GBK轉成UTF-8),輸出的專案與原專案在同一個目錄下,新的專案名為原專案名+copy,其餘裡面所有內容不變。在使用時只需要修改srcName屬性為你需要轉碼的專案的全路徑即可,然後執行main方法,安靜的等待最後所有檔案成功轉碼。
package com.zc.util; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; /** * 完成字元轉碼 * @author zc */ public class EncodChangeUtil { private static String srcName="C:\\Users\\Administrator\\Workspaces\\MyEclipse 10\\MyChat"; private static String descName; private static File file=new File(srcName); private static File desc; private static String projectName;//原專案名,如MyChat //下面兩個屬性是原專案名在全路徑中的下標,用來產生新的目錄 private static int proStart; private static int proEnd; public static void main(String[] args) { proStart=srcName.lastIndexOf("\\")+1; proEnd=srcName.length(); projectName=srcName.substring(proStart,proEnd); trace(file); } public EncodChangeUtil(String srcName){ proStart=srcName.lastIndexOf("\\")+1; proEnd=srcName.length(); projectName=srcName.substring(proStart,proEnd); trace(file); } /** * 遍歷所有資料夾 */ public static void trace(File file){ if(file.isDirectory()){ //複製後的專案根目錄名 descName=new StringBuilder(srcName).append("Copy").toString(); desc=new File(descName); desc.mkdir(); File[] fs=file.listFiles(); for(File f:fs){ if(f.isDirectory()){ String srcDirName=f.getAbsolutePath(); String descDirName=new StringBuilder(srcDirName).replace(proStart, proEnd, projectName+"Copy").toString(); desc=new File(descDirName); if(!desc.exists()){ desc.mkdirs(); } trace(f); } if(f.isFile()){ String srcDirName=f.getAbsolutePath(); String descDirName=new StringBuilder(srcDirName).replace(proStart, proEnd, projectName+"Copy").toString(); desc=new File(descDirName); //以.java結尾的,呼叫轉碼方法 if(f.getName().endsWith(".java")){ codeChange(f,desc); }else{ //其他檔案直接複製 copyFile(f,desc); } } } } System.out.println("專案轉碼成功"); } /** * 複製普通檔案(無需轉碼的檔案) * @param src * @param desc */ private static void copyFile(File src,File desc) { FileInputStream fis=null; FileOutputStream fos=null; try { fis=new FileInputStream(src); fos=new FileOutputStream(desc); byte[] b=new byte[1024]; int len=-1; while((len=fis.read(b))!=-1){ fos.write(b,0,len); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ if(fis!=null){ try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } if(fos!=null){ try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } } /** * 轉碼 * @param file */ public static void codeChange(File src,File desc){ BufferedReader br=null; PrintWriter pw =null; try { FileInputStream fis = new FileInputStream(src); InputStreamReader isr = new InputStreamReader(fis,"GBK"); br = new BufferedReader(isr); FileOutputStream fos=new FileOutputStream(desc); OutputStreamWriter osw = new OutputStreamWriter(fos,"utf-8"); pw = new PrintWriter(osw,true); String str=null; while((str=br.readLine())!=null){ pw.println(str); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ if(br!=null){ try { br.close(); } catch (IOException e) { e.printStackTrace(); } } if(pw!=null){ pw.close(); } } } }
一下是轉碼成功後的專案(MyChatCopy)和原專案MyChat
最後簡單說一下實現思路。
trace方法遞迴遍歷原專案的所有目錄和檔案,如果發現一個目錄,就在複製後的專案中建立一個相同的目錄,如果發現是一個檔案,且以.java結尾,則轉碼。如果需要更多格式檔案需要轉碼,在後面新增即可(比如jsp格式等)。需要轉碼的檔案呼叫codeChange方法轉碼,無需轉碼的檔案呼叫copyFile方法直接複製即可。
希望對你們有所幫助。