移除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)

目录
相关文章
|
机器学习/深度学习 分布式计算 并行计算
MaxCompute-udf用于torch离线模型批量推理
odps-udf用于torch离线模型的批量推理实现以及踩坑
|
6月前
|
人工智能 运维 搜索推荐
CodeBuddy助力数学教学:数学老师直呼内行!
本文探讨AI在数学教学中的应用,解决传统教学中公式编辑耗时、互动题型开发难、学情分析不精准等问题。通过智能生成教学资源、设计互动题型、精准学情分析和个性化资源定制四大功能,大幅提升教学效率与质量。实际案例展示AI生成交互式函数图像课件和立体几何动态模型工具的效果。对比显示,AI辅助教学显著优于传统模式,助力教育数字化转型,推动精准化教学与教研资源共享。
318 0
|
关系型数据库 MySQL Docker
6. 修改docker端口 (映射宿主机和docker容器中的端口)
6. 修改docker端口 (映射宿主机和docker容器中的端口)
3467 0
6. 修改docker端口 (映射宿主机和docker容器中的端口)
|
9月前
|
存储 人工智能 文字识别
MME-CoT:多模态模型推理能力终极评测!六大领域细粒度评估,港中大等机构联合推出
MME-CoT 是由港中文等机构推出的用于评估大型多模态模型链式思维推理能力的基准测试框架,涵盖数学、科学、OCR、逻辑、时空和一般场景等六个领域,提供细粒度的推理质量、鲁棒性和效率评估。
526 0
|
存储 前端开发 测试技术
MVC、MVP、MVVM 模式
MVC、MVP 和 MVVM 是三种常见的软件架构模式,用于分离用户界面和业务逻辑。MVC(Model-View-Controller)通过模型、视图和控制器分离数据、界面和控制逻辑;MVP(Model-View-Presenter)将控制逻辑移到 Presenter 中,减少视图的负担;MVVM(Model-View-ViewModel)通过数据绑定机制进一步解耦视图和模型,提高代码的可维护性和测试性。
|
机器学习/深度学习 存储 人工智能
Mamba深度解析:AI模型的新突破
Mamba深度解析:AI模型的新突破
1118 2
|
Ubuntu 编译器 C语言
【Python】已解决:(paddleocr库安装报错) error: subprocess-exited-with-error × Running setup.py install for pyth
【Python】已解决:(paddleocr库安装报错) error: subprocess-exited-with-error × Running setup.py install for pyth
1204 0
|
iOS开发 开发者 MacOS
iOS 应用上架指南:资料填写及提交审核
本文提供了iOS新站上架资料填写及提交审核的详细指南,包括创建应用、资料填写-综合、资料填写-IOS App和提交审核等步骤。通过本指南,您将了解到如何填写正确的资料,并顺利通过苹果公司的审核。
 iOS 应用上架指南:资料填写及提交审核
|
Web App开发 网络协议 Windows
记一次csdn图片访问失败问题
记一次csdn图片访问失败问题
649 0
|
开发工具 iOS开发 Ruby
Mac上CocoaPods安装流程
Mac上CocoaPods安装流程
572 0
Mac上CocoaPods安装流程