使用Java删除BOM表字符
我正在尝试使用FileReader读取文件并将其写入单独的文件。使用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, "
这些文件是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));