移除UTF-8文件头的BOM

简介:

  inkfish原创,请勿商业性质转载,转载请注明来源(http://blog.csdn.net/inkfish )。(来源:http://blog.csdn.net/inkfish)

  UTF-8 BOM又叫UTF-8 签名,在UTF-8文件的头部,长度为3个字节。其实UTF-8 的BOM对UFT-8没有作用,BOM签名的意思就是告诉编辑器当前文件采用何种编码,方便编辑器识别。但是在Eclipse中,带有BOM的java源码生成javadoc时却会出现如下错误:(来源:http://blog.csdn.net/inkfish)

E:/workspace/Test/src/express/ExpType.java:1: 非法字符: /65279 ?package express; ^

  一个个修改是个办法,但是面对几百上几千个的源文件,一个个去修改决不是程序员的作风。于是我写了一段代码,能够批量移除UTF-8的BOM,其实质就是删除带有BOM信息的UTF-8文件的前三字节,代码共享如下:(来源:http://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。(来源:http://blog.csdn.net/inkfish)

目录
相关文章
|
2月前
|
JSON JavaScript Linux
有关于【该文件的字符编码需要在传输协议层声明,或者在文件中加入一个 BOM(字节顺序标记)】的另一种解决办法
有关于【该文件的字符编码需要在传输协议层声明,或者在文件中加入一个 BOM(字节顺序标记)】的另一种解决办法
|
1月前
|
移动开发 HTML5
HTML5文档头部相关标记
【2月更文挑战第9天】HTML5文档头部相关标记。
13 1
|
2月前
|
JavaScript C#
C# bom头清理
C# bom头清理
18 0
|
JSON JavaScript IDE
JSON无法解析,json前有小红点,如何解析json串你可能遇到了UTF-8 BOM头
JSON无法解析,json前有小红点,如何解析json串你可能遇到了UTF-8 BOM头
185 0
JSON无法解析,json前有小红点,如何解析json串你可能遇到了UTF-8 BOM头
|
JavaScript PHP
文件bom头,文件bom头保存的什么东西,php读取bom头数据
文件bom头,文件bom头保存的什么东西,php读取bom头数据
65 0
|
JavaScript Java
[java]处理utf-8 bom字符串的bom头
char[] bomChar = "带bom的字符串".toCharArray();//转为char数组 char[] noneBomchar = new char[bomChar.
2481 0
|
JavaScript C# Windows
C#保存文件为无BOM的utf8格式
如图所示,发现用C#的 File.WriteAllLines 方法,无论怎么设置,最终生成的文件都是 PC utf8,也就是CRLF,用SVN进行提交的时候,显示左侧为utf8,右侧为utf8 BOM文件,甚是蛋疼。
2152 0
|
JavaScript PHP 编解码
|
Web App开发 存储 JavaScript