java utf8无bom格式_java读取/生成utf-8格式文件和utf-8无BOM文件的方法

首先说下UTF-8格式和UTF-8无BOM格式的区别。

两者的区别就是UTF-8格式的文件,在第一行的开始位置,会有个标志位,一般工具是无法看到的,占3个字节。而UTF-8无BOM格式的文件,顾名思义,就是没有这个标志位。

先说下从UTF-8文件转换成UTF-8无BOM格式文件

相信很多朋友都有过这样的经历,读取UTF-8格式的文件的时候,中文会变成乱码,明明在java代码里指定了读取文件使用的流编码格式为UTF-8,但是读出来的内容,中文还是会变乱码。也有的时候会发现,最终输出的文件中首行开始的位置会莫名其妙多个“?”问号。原因就是这个BOM标志位,没有处理好的原因。在网上也看了很多帖子,很多的解决方法。但是每个人都有自己喜欢的解决方法。至于哪种好,哪种坏,取决于个人。

我的方法是使用

public static void main(String[] args) throws IOException {

File file=new File("D:\\test.txt");

File targetFile=new File("D:\\result.txt");

if(!targetFile.exists())

{

targetFile.createNewFile();

}

BufferedReader br=null;

BufferedWriter bw=null;

br=new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF-8"));

bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(targetFile),"UTF-8"));

int i=0;

String str="";

while((str=br.readLine())!=null)

{

if(i==0)//读取第一行,将前三个字节去掉,重新new个String对象

{

byte[] bytes=str.getBytes("UTF-8");

str=new String(bytes,3,bytes.length-3);

bw.write(str);

i++;

}else

bw.write(str);

}

br.close();

bw.close();

}

UTF8无BOM格式的文件转换成UTF-8格式的文件。只需在输出首行内容的时候,增加个\uFEFF 标志位就可以

public static void main(String[] args) throws IOException {

File file=new File("D:\\result.txt");

File targetFile=new File("D:\\utf8.txt");

if(!targetFile.exists())

{

targetFile.createNewFile();

}

BufferedReader br=null;

BufferedWriter bw=null;

br=new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF-8"));

bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(targetFile),"UTF-8"));

int i=0;

String str="";

while((str=br.readLine())!=null)

{

if(i==0)// 在首行增加个BOM标志位

{

str="\uFEFF"+str;

bw.write(str);

i++;

}else

bw.write(str);

}

br.close();

bw.close();

}

总结:其实问题的关键就是。读取UTF-8文件时,要先舍掉前三个字节。想要输出UTF-8文件,就先向文件中写入\uFEFF

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值