您的位置:首页 > 编程语言 > Java开发

Java-IO的编码解码问题

2015-01-09 13:48 197 查看
/article/4150929.html

Java字符转码问题:/article/1737204.html

总结:1.要清楚文件的编码格式。2.采用相同的编码进行读取/写入

Java程序使用的的编码:取决于操作系统的编码,中文的操作系统是采用用GBK编码

记事本程序默认的编码:

系统的记事本程序默认采用ANSI(美国国家标准学会)编码,如果你新建一个demo.txt文件,

在里面写入“联通”保存,再打开文件,发现“联通”变成了其他字符。因为,系统采用GBK编码

写入,而记事本采用ANSI编码保存,所以出现乱码。(由这个问题,可以发散出很多问题。

比较常见的一个问题就是:我已经把文件保存成了 XX 编码,为什么每次打开,还是原来的 YY

编码?!原因就在于此,你虽然保存成了 XX 编码,但是系统识别的时候,却误识别为了 YY

编码,所以还是显示为 YY 编码。为了避免这个问题,微软公司弄出了一个叫 BOM 头的东西。)

unicode和utf-8:

UNICODE 来到时,一起到来的还有计算机网络的兴起,UNICODE 如何在网络上传输也是一个必须考虑

的问题,于是面向传输的众多 UTF(UCS Transfer Format)标准出现了,顾名思义,UTF8 就是每次8

个位传输数据,而 UTF16 就是每次16个位,只不过为了传输时的可靠性,从UNICODE到 UTF时并不是

直接的对应,而是要过一些算法和规则来转换。

对于新创建一个文件,并写入内容时,它的文件保存编码是什么?

这取决你写入内容的方法采用的编码格式(默认是GBK),我们知道如果采用字节输出流把字节输出到某个文件,

我们是无法指定生成文件的编码的(假设文件以前不存在),那么生成的文件是什么编码的呢?经过测试发现,

其实这取决于写入的字节编码格式。比如以下代码:OutputStream out = new FileOutputStream

("d:\\demo.txt"); out.write("我们".getBytes());getBytes()会采用操作系统默认的字符集来编码字节,

这里就是GBK,所以我们写入demo.txt文件的是GBK编码的字节。那么这个文件的编码就是GBK。如果稍微修改

一下程序:out.write("我们".getBytes(“UTF-8”));此时我们写入的字节就是UTF-8的,那么demo.txt文件编码

就是UTF-8。这里还有一点,如果把”我们”换成123或abc之类的ascii码字符,那么无论是采用getBytes()或者

getBytes(“UTF-8”)那么生成的文件都将是GBK编码的。这里可以总结一下:

InputStream中的字节编码取决文件本身的编码,而OutputStream生成文件的编码取决于字节的编码。

在java中读取写入文件时应该采用什么编码:

读取文件时要知道文件是采用什么编码,只要我们读取时采用的编码和文件保存时编码

一样,就不会出现乱码的问题,我们Java程序默认采用系统的编码(GBK),所以在字节

字节流读取时,InputStream.read()方法来读取字节,然后保存到一个byte[]数组中,

最后经常用new String(byte[]);这里byte数组变成String的过程,是用GBK来变的,如果

你想使用其他编码变成String可以用它的构造方法new String(byte[],”UTF-8”);

字节流写入时,OutputStream out = new FileOutputStream("d:\\demo.txt");

out.write("我们".getBytes()); 这里的“我们”变成byte数组是采用GBK编码,

如果你想用其他的编码,可以使用String的方法,"我们".getBytes(“UTF-8”)。

字符流读取/写入文件:字符流可以看作是一个包装流,其低层的操作还是字节流实现的

InputStreamReader in = new InputStreamReader(new FileInputStream(“demo.txt”));默认是GBK

InputStreamReader in = new InputStreamReader(new FileInputStream(“demo.txt”),”UTF-8”);

指定为UTF-8编码。同理:OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream

(“dd.txt”),”UTF-8”);写入的字符将被编码为UTF-8的字节,所以生成的文件也将是UTF-8格式的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: