移除UTF-8文件头的BOM
来源: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时却会出现如下错误:
- E:/workspace/Test/src/express/ExpType.java:1: 非法字符: /65279
- ?package express;
- ^
一个个修改是个办法,但是面对几百上几千个的源文件,一个个去修改决不是程序员的作风。于是我写了一段代码,能够批量移除UTF-8的BOM,其实质就是删除带有BOM信息的UTF-8文件的前三字节,代码共享如下:
- 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。
移除UTF-8文件头的BOM相关推荐
- 检查PHP文件头BOM
前些日子本地文件上传到服务器上,某些文件头部总是出现一条空白,无论怎么修改文件都无法去除空白,用firebug查看header部分同样有一片空白,删除后空白消失,但是在文件里却无法找到那个空白的部分, ...
- PE文件和COFF文件格式分析——签名、COFF文件头和可选文件头1
本文将讨论PE文件中非常重要的一部分信息.(转载请指明来源于breakSoftware的CSDN博客) 首先说一下VC中对应的数据结构."签名.COFF文件头和可选文件头"这三部分 ...
- c语言二fseek从文件头移动_编程C语言文件的随机读写
实现随机读写的关键是要按要求移动位置指针,这称为文件的定位. 文件定位 移动文件内部位置指针的函数主要有两个,即rewind()和fseek().rewind函数前面已多次使用过,其调用形式为: ...
- java读取文件内容,文件头有\ufeff
"\ufeff"是UTF-8 BOM编码的文件头,代表该文件按照什么字节顺序排序 调用java的工具类[ UnicodeInputStream ]即可解决这个问题 //第二个参数t ...
- 用ffmpeg修改MP4文件头信息,使其支持流式加载及播放
经常有用户反映,有些网页中加载的mp4文件,有的可以加载一点就开始播放,有的就必须全部加载完才能播. 经核实,主要是头信息的数据顺序有关,用工具:mp4info.exe可以查看mp4文件的结构信息: ...
- python ,ffprobe获取音频文件头信息,文件格式等
代码示例: import struct import os from loguru import logger# 支持文件类型 # 用16进制字符串的目的是可以知道文件头是多少字节 # 各种文件头的长 ...
- UPack的PE文件头分析与OEP查找
UPack(Ultimate PE压缩器),是一种PE文件的运行时压缩器,特点是使用独特的方法对PE头进行变形.UPack会使许多的PE分析程序无法正常运行,因此很多恶意代码都是通过UPack进行压缩 ...
- bmp文件头_「正点原子FPGA连载」第十九章SD卡读BMP图片LCD显示
1)摘自[正点原子]领航者 ZYNQ 之嵌入式开发指南 2)实验平台:正点原子领航者ZYNQ开发板 3)平台购买地址:https://item.taobao.com/item.htm?&id= ...
- PE文件和COFF文件格式分析——签名、COFF文件头和可选文件头3
<PE2>中介绍了一些可选文件头中重要的属性,为了全面起见,本文将会讲解那些不是那么重要的属性.虽然不重要,但是还是可以发现很多好玩的情况.首先看一下32位的可选文件头详细定义.(转载请指 ...
最新文章
- STM32串口+DMA使用1
- 五、开始Github和码云之旅,新手如何上路
- Android 显示 WebView ,加载URL 时,向webview的 header 里面传递参数
- OpenCV安全屏障摄像机Security Barrier Camera的实例(附完整代码)
- iOS NSMutableAttributedString常用方法总结
- 空白世界地图打印版_洪恩识字卡1300字十字帖+绘本,可打印成册
- IBM PHP教程链接
- NOIP之旅:NOIP2014篇
- Maven学习总结(25)——Eclipse Maven Update 时JDK版本变更问题
- 基于SSM的勤工助学管理系统
- 开了立体声混音仍然不能内录_蓝牙音箱有个功能很鸡肋,用好了秒变HIFI立体声...
- 高强度加密vep文件提取MP4方法
- 推荐系统的主要算法(1)
- 含泪推荐四款超级好用的电脑软件,值得收藏
- 互联网金融监管意见将出台
- 前端cookie详解
- c语言五子棋人工智能算法,五子棋人工智能算法实现研究,优化五子棋智能算法的思路...
- c语言专业自我评价,设计类专业简历自我评价
- RDMA send/recv 和 read/write操作
- Linux 查看内核 系统 等软件版本命令
热门文章
- C++动态(显式)调用 C++ dll示例
- Qt中的模态对话框和非模态对话框
- C#操作Access数据库 增删改查
- 微信小程序实现分类菜单 swiper分类菜单
- 计算机专业大学生每天睡多久,大学生睡眠时间最少的10个专业!是你的专业吗?...
- vue中使用js-cookie
- 如何解决移动端键盘弹起将底部导航栏顶起
- createmutex创建的锁需要手动关闭句柄吗_你知道吗?汽车的儿童锁居然还能发挥这么大的作用!...
- blockly和Java交互_blockly 基础学习(一)
- 计算机集成制造 pdf,计算机集成制造系统方法论9412536127640μ.pdf