296
技術社區[雲棲]
移除UTF-8文件頭的BOM
inkfish原創,請勿商業性質轉載,轉載請注明來源(https://blog.csdn.net/inkfish )。(來源:https://blog.csdn.net/inkfish)
UTF-8 BOM又叫UTF-8 簽名,在UTF-8文件的頭部,長度為3個字節。其實UTF-8 的BOM對UFT-8沒有作用,BOM簽名的意思就是告訴編輯器當前文件采用何種編碼,方便編輯器識別。但是在Eclipse中,帶有BOM的java源碼生成javadoc時卻會出現如下錯誤:(來源:https://blog.csdn.net/inkfish)
E:/workspace/Test/src/express/ExpType.java:1: 非法字符: /65279 ?package express; ^
一個個修改是個辦法,但是麵對幾百上幾千個的源文件,一個個去修改決不是程序員的作風。於是我寫了一段代碼,能夠批量移除UTF-8的BOM,其實質就是刪除帶有BOM信息的UTF-8文件的前三字節,代碼共享如下:(來源:https://blog.csdn.net/inkfish)
import java.io.File; import java.io.IOException; import java.util.Collection; import org.apache.commons.io.DirectoryWalker; import org.apache.commons.io.FileUtils; import org.apache.commons.io.FilenameUtils; @SuppressWarnings("rawtypes") public class Utf8BomRemover extends DirectoryWalker { public static void main(String[] args) throws IOException { //刪除指定文件夾下(含子文件夾)所有java文件的BOM,若構造器中參數為null則刪除所有文件頭部BOM new Utf8BomRemover("java").start(new File("E:/workspace/Test/src")); } private String extension = null; public Utf8BomRemover(String extension) { super(); this.extension = extension; } /** 啟動對某個文件夾的篩選 */ @SuppressWarnings("unchecked") public void start(File rootDir) throws IOException { walk(rootDir, null); } protected void handleFile(File file, int depth, Collection results) throws IOException { if (extension == null || extension.equalsIgnoreCase(FilenameUtils.getExtension(file.toString()))) { //調用具體業務邏輯,其實這裏不僅可以實現刪除BOM,還可以做很多想幹的事情。 remove(file); } } /** 移除UTF-8的BOM */ private void remove(File file) throws IOException { byte[] bs = FileUtils.readFileToByteArray(file); if (bs[0] == -17 && bs[1] == -69 && bs[2] == -65) { byte[] nbs = new byte[bs.length - 3]; System.arraycopy(bs, 3, nbs, 0, nbs.length); FileUtils.writeByteArrayToFile(file, nbs); System.out.println("Remove BOM: " + file); } } }
在這個類中能把指定文件夾中指定後綴名的文件統一去除BOM,而整個程序源碼中沒有看到用遞歸算法,而是使用了apache commons-io
,其實遞歸算法就在DirectoryWalker
類中,實現者無需關心算法,而是關注於業務。同時,這裏給一個提醒,commons-io最新版是2.0,修改了1.4中的一些bug,其中有一處就是DirectoryWalker
類,因此建議使用最新版的commons-io。(來源:https://blog.csdn.net/inkfish)
最後更新:2017-04-02 06:51:32
上一篇:
深入理解typedef
下一篇:
magento -- 後台產品列表頁默認隻顯示可見性為“Catalog, Search”的產品
微觀、宏觀、精準 多視角估算數據庫性能(選型、做預算不求人)
tomcat下的SSH項目移植weblogic常見錯誤解決方案
spring boot
oracle table-lock的5種模式
經典白話算法之桶排序
Asp.net中使用母版頁
error while loading shared libraries: libpcre.so.1: cannot open shared object file
Check Point 強勢攜手 LG,助力保護智能家用設備
《數據結構與抽象:Java語言描述(原書第4版)》一序 言-設 計 類
Openstack neutron 報錯503故障排查