java 文件流 乱码_Java IO流之中文乱码

相信有过学过JavaEE的人们都有遇到过中文乱码问题吧,最简单的就是表单数据提交时中文出现乱码,乱码难解决吗?其实不难,只要掌握好编码的设置,乱码神马的一边去。

今天主要就讲讲一些常用的可以设置编码的函数的用法。讲一下常见的编码,例如ISO-8859-1,gbk,utf-8等,这三个就是最常见的了。首先,为了防止乱码,我们得先统一编码,然后出现乱码再通过一些函数来解决。

下面讲讲常见的中文乱码解决方法和例子吧..既然说了表单数据出现中文乱码,那就顺便说说解决方法吧.

函数:new String(byte[] data, String encoding);

这个方法主要就是用于解决上面说的表单数据提交时出现中文乱码,这个方法通常与String.getBytes(String encoding)一起使用.

用法:String str = new String(formMsg.getBytes("ISO-8859-1"),"utf-8");

因为今天主要要讲一下IO流操作中易出现的中文乱码解决方法,所以就言归正传,说说我在学习中遇到的乱码问题和解决方法吧.

首先,我们都知道Java的IO流中按字节分就有字节流和字符流之分,看字面意思就知道,字节流是按字节为单位来操作的,而字符流当然是按字符为单位来操作的咯,字节流一般是用来操作一些二进制文件,例如MP3文件,JPG等等。字符流呢?一般是用来操作一些文本文件。

android中也有很多地方涉及到IO流操作,当然也有不少中文乱码问题。有一些细节没注意到就有可能导致乱码。

首先讲讲字节流,先贴一方法吧。

/*

* 读取文件

*/

public String readerFile(File f) {

String str = "";

FileInputStream fis = null;

try {

fis = new FileInputStream(f);

byte[] b = new byte[512];

int n;

while ((n = fis.read(b)) != -1) {

str = str + new String(b, 0, n);

b = new byte[512];

}

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

fis.close();

} catch (Exception e) {

e.printStackTrace();

}

}

return str;

}

这个方法就是通过传进的File对象,读取里面的内容,返回一个字符串,如果你把这方法copy去读取含有中文的文件,无意外的话就会出现中文乱码,如果出现中文乱码,该如何解决呢?其实String类有提供方法解决,只要把str = str + new String(b, 0, n);改成str = str + new String(b, 0, n, "gbk");就可以解决了。

上面的方法在一般情况下是可以读取中文了,但是,仔细想想,毕竟上面的方法是以字节为单位的,而一个中文占了两个字节,细心的同学应该已经想到了,上面的方法是一次读取512个字节,如果,一个中文刚好就占了第512个字节和第513个字节,你一次读512个字节,狠狠得把他们拆散了,重新new了一个新的字符串,你说乱码不乱码?

所以说,操作含有中文的文件还是通过字符流来好了,字符流操作起来又快,虽然从字节流一步一步升级到字符流有点烦..

还是先贴一方法吧。

/*

* 升级版读取文件

*/

public String readerFile(File f) {

String str = "";

String line = "";

FileInputStream fis = null;

InputStreamReader isr = null;

BufferedReader br = null;

try {

fis = new FileInputStream(f);

isr = new InputStreamReader(fis);

br = new BufferedReader(isr);

while ((line = br.readLine()) != null) {

str = str + line;

}

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

fis.close();

} catch (Exception e) {

e.printStackTrace();

}

}

return str;

}

如果按上面方法写最后还是出现乱码,你会如何解决?在哪个地方设置正确的编码?

你会学第一种方法?str = str + new String(line.getBytes("ISO-8859-1"),"gbk");?你自己去试试吧- -。

那你会学第二种方法?str = str + new String(line,"gbk");?根本就没有这个方法...

那到底要怎么解决?

其实,Java里有很多地方可以设置编码,上面的解决方法只要把isr = new InputStreamReader(fis);改成isr = new InputStreamReader(fis,"gbk");就可以搞定了.

Java中中文乱码的问题还很多,这只是皮毛,还有更多解决方法等着你去发现,记得分享...

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值