因爲項目開發須要,從svn中checkout代碼下來,用ide打開設置爲UTF-8編碼進行編譯。結果卻產生了 illegal character: \65279 錯誤,搞得一頭霧水。 java
開始覺得是編碼沒有選對,調整了並詢問原開發人員確認是UTF-8沒有問題。上網翻閱資料後才發現,是因爲Windows系統開發的編碼爲UTF-8(BOM)致使,BOM是Byte-Order Mark的意思。一種爲了讓編輯器自動識別編碼。在文件前3個字節加上了EE,BB,BF,但標準的UTF-8(Linux不支持BOM)編碼並不會這樣作。 apache
因此在Linux下編譯Java,問題就這樣產生了。 maven
因爲文件衆多隻好簡單寫程序批量去掉前3個字節了。 編輯器
CleanBom.java ide
package org.noahx.cleanbom; import org.apache.commons.io.IOUtils; import java.io.*; import java.util.ArrayList; import java.util.List; import java.util.Stack; /** * Created with IntelliJ IDEA. * User: noah * Date: 2/26/13 * Time: 6:07 PM * To change this template use File | Settings | File Templates. */ public class CleanBom { public static void main(String[] args) { //指定查找文件的父目錄javafolder File parent = new File("/nautilus/javafolder"); List<File> javaFiles = findJavaFile(parent); int count = 0; for (File javaFile : javaFiles) { if (isBomFile(javaFile)) { count++; cleanBom(javaFile); } } System.out.println("bom=" + count); } /** * 清除bom編碼 * * @param file */ public static void cleanBom(File file) { File tempFile = new File(file.getAbsolutePath() + ".tmp"); FileOutputStream fos = null; FileInputStream fis = null; try { fos = new FileOutputStream(tempFile); fis = new FileInputStream(file); fis.read(new byte[3]);//讀取前3個byte IOUtils.copy(fis, fos); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { IOUtils.closeQuietly(fos); IOUtils.closeQuietly(fis); } if (!file.delete()) { System.out.println("Could not delete file"); } if (!tempFile.renameTo(file)) { System.out.println("Could not rename file"); } System.out.println(file.getAbsolutePath() + ">>clean bom"); } /** * 查找子目錄下全部java文件 * * @param parent * @return */ public static List<File> findJavaFile(File parent) { List<File> result = new ArrayList<File>(); Stack<File> stack = new Stack<File>(); stack.push(parent); while (!stack.isEmpty()) { File popFile = stack.pop(); if (popFile.isDirectory()) { for (File file : popFile.listFiles()) { stack.add(file); } } else { if (popFile.getName().endsWith(".java")) { result.add(popFile); } } } return result; } /** * 判斷是否爲bom編碼文件 * * @param file * @return */ public static boolean isBomFile(File file) { boolean isBom = false; FileInputStream fileIS = null; try { fileIS = new FileInputStream(file); byte[] bomBytes = new byte[3]; fileIS.read(bomBytes); //EF BB BF if (bomBytes[0] == -17 && bomBytes[1] == -69 && bomBytes[2] == -65) { isBom = true; } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { IOUtils.closeQuietly(fileIS); } return isBom; } }pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cleanbom</groupId> <artifactId>cleanbom</artifactId> <version>1.0</version> <dependencies> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-io</artifactId> <version>1.3.2</version> </dependency> </dependencies> </project>
源碼下載:http://sdrv.ms/Wp4igi svn