来源:http://blog.csdn.net/inkfish/article/details/6059254

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

[java] view plaincopy
  1. E:/workspace/Test/src/express/ExpType.java:1: 非法字符: /65279
  2. ?package express;
  3. ^

  一个个修改是个办法,但是面对几百上几千个的源文件,一个个去修改决不是程序员的作风。于是我写了一段代码,能够批量移除UTF-8的BOM,其实质就是删除带有BOM信息的UTF-8文件的前三字节,代码共享如下:

[java] view plaincopy
  1. import java.io.File;
  2. import java.io.IOException;
  3. import java.util.Collection;
  4. import org.apache.commons.io.DirectoryWalker;
  5. import org.apache.commons.io.FileUtils;
  6. import org.apache.commons.io.FilenameUtils;
  7. @SuppressWarnings("rawtypes")
  8. public class Utf8BomRemover extends DirectoryWalker {
  9. public static void main(String[] args) throws IOException {
  10. //删除指定文件夹下(含子文件夹)所有java文件的BOM,若构造器中参数为null则删除所有文件头部BOM
  11. new Utf8BomRemover("java").start(new File("E:/workspace/Test/src"));
  12. }
  13. private String extension = null;
  14. public Utf8BomRemover(String extension) {
  15. super();
  16. this.extension = extension;
  17. }
  18. /** 启动对某个文件夹的筛选 */
  19. @SuppressWarnings("unchecked")
  20. public void start(File rootDir) throws IOException {
  21. walk(rootDir, null);
  22. }
  23. protected void handleFile(File file, int depth, Collection results) throws IOException {
  24. if (extension == null
  25. || extension.equalsIgnoreCase(FilenameUtils.getExtension(file.toString()))) {
  26. //调用具体业务逻辑,其实这里不仅可以实现删除BOM,还可以做很多想干的事情。
  27. remove(file);
  28. }
  29. }
  30. /** 移除UTF-8的BOM */
  31. private void remove(File file) throws IOException {
  32. byte[] bs = FileUtils.readFileToByteArray(file);
  33. if (bs[0] == -17 && bs[1] == -69 && bs[2] == -65) {
  34. byte[] nbs = new byte[bs.length - 3];
  35. System.arraycopy(bs, 3, nbs, 0, nbs.length);
  36. FileUtils.writeByteArrayToFile(file, nbs);
  37. System.out.println("Remove BOM: " + file);
  38. }
  39. }
  40. }

  在这个类中能把指定文件夹中指定后缀名的文件统一去除BOM,而整个程序源码中没有看到用递归算法,而是使用了apache commons-io ,其实递归算法就在DirectoryWalker 类中,实现者无需关心算法,而是关注于业务。同时,这里给一个提醒,commons-io最新版是2.0,修改了1.4中的一些bug,其中有一处就是DirectoryWalker 类,因此建议使用最新版的commons-io。

移除UTF-8文件头的BOM相关推荐

  1. 检查PHP文件头BOM

    前些日子本地文件上传到服务器上,某些文件头部总是出现一条空白,无论怎么修改文件都无法去除空白,用firebug查看header部分同样有一片空白,删除后空白消失,但是在文件里却无法找到那个空白的部分, ...

  2. PE文件和COFF文件格式分析——签名、COFF文件头和可选文件头1

    本文将讨论PE文件中非常重要的一部分信息.(转载请指明来源于breakSoftware的CSDN博客) 首先说一下VC中对应的数据结构."签名.COFF文件头和可选文件头"这三部分 ...

  3. c语言二fseek从文件头移动_编程C语言文件的随机读写

    实现随机读写的关键是要按要求移动位置指针,这称为文件的定位. 文件定位 移动文件内部位置指针的函数主要有两个,即rewind()和fseek().rewind函数前面已多次使用过,其调用形式为:    ...

  4. java读取文件内容,文件头有\ufeff

    "\ufeff"是UTF-8 BOM编码的文件头,代表该文件按照什么字节顺序排序 调用java的工具类[ UnicodeInputStream ]即可解决这个问题 //第二个参数t ...

  5. 用ffmpeg修改MP4文件头信息,使其支持流式加载及播放

    经常有用户反映,有些网页中加载的mp4文件,有的可以加载一点就开始播放,有的就必须全部加载完才能播. 经核实,主要是头信息的数据顺序有关,用工具:mp4info.exe可以查看mp4文件的结构信息: ...

  6. python ,ffprobe获取音频文件头信息,文件格式等

    代码示例: import struct import os from loguru import logger# 支持文件类型 # 用16进制字符串的目的是可以知道文件头是多少字节 # 各种文件头的长 ...

  7. UPack的PE文件头分析与OEP查找

    UPack(Ultimate PE压缩器),是一种PE文件的运行时压缩器,特点是使用独特的方法对PE头进行变形.UPack会使许多的PE分析程序无法正常运行,因此很多恶意代码都是通过UPack进行压缩 ...

  8. bmp文件头_「正点原子FPGA连载」第十九章SD卡读BMP图片LCD显示

    1)摘自[正点原子]领航者 ZYNQ 之嵌入式开发指南 2)实验平台:正点原子领航者ZYNQ开发板 3)平台购买地址:https://item.taobao.com/item.htm?&id= ...

  9. PE文件和COFF文件格式分析——签名、COFF文件头和可选文件头3

    <PE2>中介绍了一些可选文件头中重要的属性,为了全面起见,本文将会讲解那些不是那么重要的属性.虽然不重要,但是还是可以发现很多好玩的情况.首先看一下32位的可选文件头详细定义.(转载请指 ...

最新文章

  1. STM32串口+DMA使用1
  2. 五、开始Github和码云之旅,新手如何上路
  3. Android 显示 WebView ,加载URL 时,向webview的 header 里面传递参数
  4. OpenCV安全屏障摄像机Security Barrier Camera的实例(附完整代码)
  5. iOS NSMutableAttributedString常用方法总结
  6. 空白世界地图打印版_洪恩识字卡1300字十字帖+绘本,可打印成册
  7. IBM PHP教程链接
  8. NOIP之旅:NOIP2014篇
  9. Maven学习总结(25)——Eclipse Maven Update 时JDK版本变更问题
  10. 基于SSM的勤工助学管理系统
  11. 开了立体声混音仍然不能内录_蓝牙音箱有个功能很鸡肋,用好了秒变HIFI立体声...
  12. 高强度加密vep文件提取MP4方法
  13. 推荐系统的主要算法(1)
  14. 含泪推荐四款超级好用的电脑软件,值得收藏
  15. 互联网金融监管意见将出台
  16. 前端cookie详解
  17. c语言五子棋人工智能算法,五子棋人工智能算法实现研究,优化五子棋智能算法的思路...
  18. c语言专业自我评价,设计类专业简历自我评价
  19. RDMA send/recv 和 read/write操作
  20. Linux 查看内核 系统 等软件版本命令

热门文章

  1. C++动态(显式)调用 C++ dll示例
  2. Qt中的模态对话框和非模态对话框
  3. C#操作Access数据库 增删改查
  4. 微信小程序实现分类菜单 swiper分类菜单
  5. 计算机专业大学生每天睡多久,大学生睡眠时间最少的10个专业!是你的专业吗?...
  6. vue中使用js-cookie
  7. 如何解决移动端键盘弹起将底部导航栏顶起
  8. createmutex创建的锁需要手动关闭句柄吗_你知道吗?汽车的儿童锁居然还能发挥这么大的作用!...
  9. blockly和Java交互_blockly 基础学习(一)
  10. 计算机集成制造 pdf,计算机集成制造系统方法论9412536127640μ.pdf