1. 程式人生 > >java 自己實現專案一鍵全轉碼 解決檔案亂碼問題

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方法直接複製即可。

希望對你們有所幫助。