栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何从Java中的XML文件中删除BOM

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何从Java中的XML文件中删除BOM

有因为在UTF-8文件中的BOM的工具断裂是一个 非常
以我的经验平常的事。我不知道为什么会有这么多的否决票(但是这给了我机会去尝试赢得足够的选票来赢得特殊的SO徽章;)

更严重的是:UTF-8 BOM通常没有太大意义,
在规格上完全有效(尽管不建议使用)。现在的问题是,很多人不知道BOM在UTF-8中是有效的,因此编写了损坏的工具/ API,无法正确处理这些文件。

现在,您可能遇到两个不同的问题:您可能想从Java处理文件,或者需要使用Java以编程方式创建/修复其他(损坏的)工具所需的文件。

我曾在一个咨询工作中遇到过这样的情况:服务台将继续从用户那里收到消息,这些消息在某些文本编辑器上出现问题,这些文本编辑器会弄乱Java生成的完全有效的UTF-8文件。因此,我必须通过确保从我们正在处理的每个UTF-8文件中删除BOM来解决该问题。

我要从文件中删除BOM表,可以创建一个新文件并跳过前三个字节。例如:

... $  file  /tmp/src.txt /tmp/src.txt: UTF-8 Unipre (with BOM) English text... $  ls -l  /tmp/src.txt -rw-rw-r-- 1 tact tact 1733 2012-03-16 14:29 /tmp/src.txt... $  hexdump  -C  /tmp/src.txt | head -n 100000000  ef bb bf 50 6f 6b 65 ...

如您所见,文件以“ ef bb bf”开头,这是(完全有效的)UTF-8 BOM。

这是一种方法,它通过跳过前三个字节来获取文件并进行复制:

 public static void workAroundbrokenToolsAndAPIs(File sourceFile, File destFile) throws IOException {    if(!destFile.exists()) {        destFile.createNewFile();    }    FileChannel source = null;    FileChannel destination = null;    try {        source = new FileInputStream(sourceFile).getChannel();        source.position(3);        destination = new FileOutputStream(destFile).getChannel();        destination.transferFrom( source, 0, source.size() - 3 );    }    finally {        if(source != null) { source.close();        }        if(destination != null) { destination.close();        }    }}

请注意,它是“原始的”:通常,在调用此代码或“可能会发生错误的思维” [TM]之前,通常需要先确保您具有BOM。

您可以随后查看您的文件:

... $  file  /tmp/dst.txt /tmp/dst.txt: UTF-8 Unipre English text... $  ls -l  /tmp/dst.txt -rw-rw-r-- 1 tact tact 1730 2012-03-16 14:41 /tmp/dst.txt... $  hexdump -C /tmp/dst.txt00000000  50 6f 6b 65 ...

BOM消失了…

现在,如果您只想透明地删除损坏的Java API的BOM,则可以使用此处描述的 pushbackInputStream

private static InputStream checkForUtf8BOMAndDiscardIfAny(InputStream inputStream) throws IOException {    PushbackInputStream pushbackInputStream = new PushbackInputStream(new BufferedInputStream(inputStream), 3);    byte[] bom = new byte[3];    if (pushbackInputStream.read(bom) != -1) {        if (!(bom[0] == (byte) 0xEF && bom[1] == (byte) 0xBB && bom[2] == (byte) 0xBF)) { pushbackInputStream.unread(bom);        }    }    return pushbackInputStream; }

请注意,此工程,但必须绝对 不是 解决更严重的问题,你可以有其他工具在工作链不与具有BOM UTF-8的文件正常工作。

这是指向更完整答案的问题的链接,还涵盖其他编码:

字节顺序标记会破坏Java中的文件读取



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/437988.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号