`
lilisalo
  • 浏览: 1111379 次
文章分类
社区版块
存档分类
最新评论

java 文件读取写入的编码问题

 
阅读更多

关于编码解码的知识背景:


内 编码 --->> 目

<<----解码


编码解码跟翻译语言一样。内容是本质的东西,无论怎么编码,它所表达的内容不能变。

而无论怎么编码解码,表现形式都是字节数组,它的值会随着编码解码方式的不同而不同。

编码解码要做的,就是对这些byte数组进行操作,将它还原成我们需要的内容。

对于一段汉字的编码解码,汉字本身就是内容文件,我们需要将他们用数字的形式表示,即编码为对应的二进制串(目标)


常见的字符集:

ANSI :ASCII字符集,以及由此派生并兼容的字符集,如:GB2312(汉字支持,GB是“国标”的缩写),对GB2312向下兼容的GBK(其中能表达的汉字数量比GB2312多),正式的名称为MBCS(Multi-ByteChactacterSystem,多字节字符系统),通常也称为ANSI字符集。

UNICODE:由于每种语言都制定了自己的字符集,导致最后存在的各种字符集实在太多,在国际交流中要经常转换字符集非常不便。因此,产生了Unicode字符集,它固定使用16bits(两个字节)来表示一个字符,共可以表示65536个字符。标准的Unicode称为UTF-16(UTF:UCSTransformationFormat ,每两个字节作为一个编码单元,编码效率高。这让能够用一个字节存放的ASCII字符浪费了一个字节,不适于网络传输,多用于本地的编码)。后来为了双字节的Unicode能够在现存的处理单字节的系统上正确传输,出现了UTF-8(变长编码,有更好的鲁棒性:UTF16顺序编码,如果中间丢失一个bit位,将全盘皆输,但UTF8的编码方式中,每个单元都有一个特定几个bit位的头,这让它能抵抗这种情况),使用类似MBCS的方式对Unicode进行编码。(Unicode字符集有多种编码形式)


--------------------------------------------------------------************正文************---------------------------------------------------


java中读取文件的解码

文件以字节的形式存储在磁盘,这些数据实际上是文件的内容通过某种字符集编码后的结果,而我们读取文件后对文件的处理就是对这些数据的解码。

按照java IO 的框架,Java读取文件的方式总体可以分为两类:按字节读取和按字符读取。下面依次分析。

按字节读取

按字节读取的层次结构是各种stream 。可以使用InputStream.read()方法来读取字节。需要的话,可以将字节数组转换成String字符串。

而编码也就隐式发生在由字节数组转换到字符串数组的过程中。


参见String构造函数的doc, 如上的转换实际上使用的是系统的默认字符集。如果需要制定字符集解码,可以使用String(byte[]bytes,Charsetcharset)构造函数

只要能用文件的编码字符集进行解码,就不会出现乱码问题。

以下为实践代码。我存储了a.txt到我的用户目录下。内容为: biaobiaoqi编码问题


分别用GB2312 ,GBK ,UTF8, UTF16 并用system.out.println显示,结果如下:


可以推断,a.txt的文本文件编码为ANSI,GBK向下兼容GB2312,所以两者都能显示。而UTF则不是那么顺利了。

按字符读取

按字符读取的层次体系(各种Reader、 Writer类)的出现是为了适应国际化(thinking in java)。不同语言的不同字符集对字符的处理是不一样的。

实际上,之前介绍的将btye数字转换成String 的过程就是Reader们所要做的。他们以字节读取类为基础,将字节数组转换为相应字符集的字符串。

方法如下:


不指定第二个参数的话,也会使用系统的默认的字符集编码了。


输出文件编码

同样的道理,在输出文件的时候,会遇到编码问题。

对于字节输出流

由于已经是字节的形式,会被直接的保存为文件,而不涉及编码:编码已经在字符串到字节数组的过程中完成。

那么,字符串到字节数组的转换的编码如何控制呢?

一般情况,我们会使用String中的getByte()方法。与String的构造一样,如果不加参数,会使用系统的默认字符集编码。自定义的编码方式为byte[] getByte(Charset c)。


字符输出流

道理一样。他的底层也是利用了字节输出流实现。OutputStreamWriter操作如下:


更深入的探讨,可以发现,其实在Console端的显示,也是要利用到编码解码的问题的。

在system.out.println时,会使用系统的默认编码,而console显示如果使用了其他字符集解码,则会出现乱码问题。

在Eclipse下,可以尝试修改console显示的解码字符集。Run configuration --> common ,修改之后,相信就会在system.out.println后出现乱码了^_^



总之,只要编码跟解码对应统一,在统一的java平台下,就不会出现乱码了。



分享到:
评论

相关推荐

    彻底解决JAVA读取写入 TXT中文乱码问题 源码

    彻底解决JAVA读取写入 TXT中文乱码问题 源码

    彻底解决JAVA读取写入中文乱码的问题

    彻底解决JAVA读取写入 TXT中文乱码问题 源码

    java读写csv文件,中文乱码问题

    NULL 博文链接:https://thinktothings.iteye.com/blog/1536044

    Java读取、写入文件如何解决乱码问题

    主要介绍了Java读取、写入文件如何解决乱码问题,需要的朋友可以参考下

    Java读写xml,word,xml文件(防乱码)

    利用Java下的IO读取或写入xml及word,txt文件,且能有效去除乱码(很适用,且和POI组建比,少占了很多内存),这是我根据网上很多不同的版本,整合而出的一种最易最好的IO读写文件代码;

    JavaIO文件操作之写入分页操作

    java IO写入读取操作,防止乱码,JavaIO分页读取

    Java Properties 解决中文乱码和顺序读写.docx

    ava中有个比较重要的类Properties(Java.util.Properties),主要用于读取Java的配置文件,各种语言都有自己所支持的配置文件,配置文件中很多变量是经常改变的,这样做也是为了方便用户,让用户能够脱离程序本身去...

    JAVA 对CSV和Excel文件格式的读写

    利用Java swing 对csv和excel文件进行读写;并且可以同时读取5个文件的数量;通过关键字配置来读文件,还有就是通过POI CSVWriter等类的使用来对excel和csv等文件进行操作

    Java 解决读写本地文件中文乱码的问题

    主要介绍了Java 解决读写本地文件中文乱码的问题的相关资料,需要的朋友可以参考下

    java按指定编码写入和读取文件内容的类分享

    主要介绍了java按指定编码写入和读取文件内容的类,需要的朋友可以参考下

    解决GDAL读取SHP中文乱码

    完善说明,通过对网上的东西,东拼西凑的,终于解决了GDAL读取中文的乱码问题,或者是通过设置Gdal.SetConfigOption("SHAPE_ENCODING","CP936")后,能够读取中文,但是还是存在一个BUG,那比较中文是“张三”,读取...

    JAVA上百实例源码以及开源项目

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    bacnet-java-demo

    bacnet,开发语言使用java,使用BACnet4j,Yabbo模拟设备,读取到的设备模拟器上的数据,一个小小的demo,希望对大家有用

    java源码包---java 源码 大量 实例

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    Huffman编码的java实现

    自己实现的Huffman编码,压缩率接近50%,使用字节流写入文件。解码时读取字节流,将字节流转化为二进制串,匹配字符解压。使用I have a dream作为测试文件。

    Spire.Pdf.zip 读取PDF文件中的信息

    读取PDF文件中的信息 package com.zht; import java.io.File; import java.io.UnsupportedEncodingException; import java.sql.Connection; import java.sql.DriverManager; import java.sql....

    java源码包4

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    java源码包3

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    java源码包2

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    Java读写.properties文件解决中文乱码问题

    主要介绍了Java读写.properties文件解决中文乱码问题,非常具有实用价值,需要的朋友可以参考下

Global site tag (gtag.js) - Google Analytics