解決Linux下編譯Java產生 illegal character: \65279 錯誤的問題

一、問題背景

因爲項目開發須要,從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

三、解決問題(開發cleanbom程序)

因爲文件衆多隻好簡單寫程序批量去掉前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

相關文章
相關標籤/搜索