使用Java删除BOM表字符

使用Java删除BOM表字符,java,filereader,byte-order-mark,Java,Filereader,Byte Order Mark,我正在尝试使用FileReader读取文件并将其写入单独的文件。 这些文件是UTF-8编码的,但不幸的是,其中一些文件仍然包含BOM。 我尝试的相关代码如下: private final String UTF8_BOM = "\uFEFF"; private String removeUTF8BOM(String s) { if (s.startsWith(UTF8_BOM)) { s=s.replace(UTF8_BOM, "

我正在尝试使用FileReader读取文件并将其写入单独的文件。
这些文件是UTF-8编码的,但不幸的是,其中一些文件仍然包含BOM。
我尝试的相关代码如下:

private final String UTF8_BOM = "\uFEFF";

 private String removeUTF8BOM(String s)
    {
        if (s.startsWith(UTF8_BOM))
        {
            s=s.replace(UTF8_BOM, "");
        }
        return s;
    }

    line=removeUTF8BOM(line);
但由于某些原因,BOM表未被删除。有没有其他方法可以通过FileReader实现这一点?我知道BOMInputStream应该可以工作,但我更愿意使用FileReader找到一个解决方案。

对所问问题的简单解决方案: 产出: 正确的解决方法: 您不应该对基于
文件的API进行编程,而应该针对
InputStream/OutputStream
进行编程,以便代码可以移植到不同的源位置

这只是一个未经测试的示例,说明了如何将此行为封装到
InputStream
中以使其透明

public class BomProofInputStream extends InputStream
{
    private final InputStream is;

    public BomProofInputStream(@Nonnull final InputStream is)
    {
        this.is = is;
    }

    private boolean isFirstByte = true;

    @Override
    public int read() throws IOException
    {
        if (this.isFirstByte)
        {
            this.isFirstByte = false;
            final int b = is.read();
            if ("\uFEFF".charAt(0) != b) { return b; } 
        }
        return is.read();
    }
}

通过搜索找到:类FileReader是一个使用平台编码的旧实用程序类。在可能不是UTF-8的Windows上

最好与其他班级一起阅读

作为娱乐,为了澄清错误,这里有一个肮脏的黑客,适用于单字节编码的平台:

private final String UTF8_BOM = new String("\uFEFF".getBytes(StandardCharsets.UTF_8));
这将获取UTF-8字节,并在当前平台编码中生成一个字符串

无需提及FileReader是不可移植的,只处理本地文件。

您尝试过这个吗?
public class BomProofInputStream extends InputStream
{
    private final InputStream is;

    public BomProofInputStream(@Nonnull final InputStream is)
    {
        this.is = is;
    }

    private boolean isFirstByte = true;

    @Override
    public int read() throws IOException
    {
        if (this.isFirstByte)
        {
            this.isFirstByte = false;
            final int b = is.read();
            if ("\uFEFF".charAt(0) != b) { return b; } 
        }
        return is.read();
    }
}
private final String UTF8_BOM = new String("\uFEFF".getBytes(StandardCharsets.UTF_8));