在Java应用开发中,经常会遇到不同的开发人员的IDE设置的文件编码格式不一样,在后续集成环境中往往会因为file encoding不同引发一些小问题,故编写了一个小程序做文件转换动作。
import java.io.*; public class FileEncodingConverter { //Java file extention public static final String FILE_EXTENTION_JAVA = ".java"; public static final int BUFFER_SIZE = 1024 * 4; //File encoding public static final String FILE_ENCODING_UTF8 = "UTF_8"; public static final String FILE_ENCODING_GBK = "GBK"; public static final String FILE_ENCODING_GB2312 = "gb2312"; /** * File filter, only directory and java file */ private static FileFilter fileFilter = new FileFilter() { public boolean accept(File file) { //directory and java file return file.isDirectory() || (file.isFile() && file.getName().endsWith(FILE_EXTENTION_JAVA)); } }; /** * @param sourceDirectoryPath sourceDirectory * @param destDirectoryPath destDirectory * @param sourceFileEncoding sourceEncoding * @param destFileEncoding destEncoding */ public static void scanDirectory(String sourceDirectoryPath, String destDirectoryPath, String sourceFileEncoding, String destFileEncoding) { File destDirectory = new File(destDirectoryPath); if (!destDirectory.exists()) { destDirectory.mkdir(); } File sourceDirectory = new File(sourceDirectoryPath); scanDirectory(sourceDirectory, sourceDirectoryPath, destDirectoryPath, sourceFileEncoding, destFileEncoding); } /** * @param directory directory * @param sourceDirectoryPath sourceDirectory * @param destDirectoryPath destDirectory * @param sourceFileEncoding sourceEncoding * @param destFileEncoding destEncoding */ private static void scanDirectory(File directory, String sourceDirectoryPath, String destDirectoryPath, String sourceFileEncoding, String destFileEncoding) { File[] files = directory.listFiles(fileFilter); File destFile; for (File file : files) { if (file.isDirectory()) { destFile = new File(destDirectoryPath + file.getAbsolutePath().substring(sourceDirectoryPath.length())); if (!destFile.exists()) { destFile.mkdir(); } scanDirectory(file, sourceDirectoryPath, destDirectoryPath, sourceFileEncoding, destFileEncoding); } else { System.out.println("Source file:\t" + file.getAbsolutePath() + "\nDest file:\t" + (destDirectoryPath + file.getAbsolutePath().substring(sourceDirectoryPath.length())) + "\n-----------------------------------------------------------------"); convertFile(file.getAbsolutePath(), destDirectoryPath + file.getAbsolutePath().substring(sourceDirectoryPath.length()), sourceFileEncoding, destFileEncoding); } } } /** * @param sourceFilePath sourceFilePath * @param destFilePath destFilePath * @param sourceFileEncoding sourceFileEncoding * @param destFileEncoding destFileEncoding */ private static void convertFile(String sourceFilePath, String destFilePath, String sourceFileEncoding, String destFileEncoding) { InputStream in = System.in; OutputStream out = System.out; Reader reader = null; Writer writer = null; try { //set up byte streams if (sourceFilePath != null) { in = new FileInputStream(sourceFilePath); } if (destFilePath != null) { out = new FileOutputStream(destFilePath); } // Use default encoding if no encoding is specified. if (sourceFileEncoding == null) sourceFileEncoding = System.getProperty("file.encoding"); if (destFileEncoding == null) destFileEncoding = System.getProperty("file.encoding"); // Set up character stream reader = new BufferedReader(new InputStreamReader(in, sourceFileEncoding)); writer = new BufferedWriter(new OutputStreamWriter(out, destFileEncoding)); char[] buffer = new char[BUFFER_SIZE]; int len; while ((len = reader.read(buffer)) != -1) { writer.write(buffer, 0, len); } } catch (Exception e) { e.printStackTrace(); } finally { if (writer != null) { try { writer.flush(); writer.close(); } catch (IOException e) { e.printStackTrace(); } } if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } try { in.close(); } catch (IOException e) { e.printStackTrace(); } try { out.close(); } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) { String sourceDirectoryPath = "D:\\Lee\\Products\\insquery\\src"; String destDirectoryPath = "D:\\Lee\\Products\\insquery\\dest"; scanDirectory(sourceDirectoryPath, destDirectoryPath, FILE_ENCODING_GBK, FILE_ENCODING_UTF8); } }