多语言展示
当前在线:139今日阅读:19今日分享:20

关于javaIO的编码问题出现以及解决方法

先做一个相关说明,文件是采用byte存储的,文本是采用某种编码的char数组,文本文件是采用某种编码的字符数组采用字节的形式存储的。好了,了解以上这些就好办了,下面进入正题吧。
工具/原料

java

方法/步骤
2

2,如果进行的是fileoutputstream的或者是bufferedfileoutputstream的write()方法,它写出的是单字节,当然也可以跟上面的read()方法类似,采用write(数组对象或是指向实例化数组对象的引用,数组开头,数组长度)的方式进行字节数组的写入操作,如果采用的是write()单字节的写入,里面的参数如果是int将自动转化为字节,该字节采用int的低八位。注意全程的过程,就四种类型①不带缓冲单字节操作②带缓冲单字节操作(buffered)③不带缓冲字节数组操作④带缓冲的字节数组操作(buffered)。全程都是字节与字符无关也就不涉及编码,buffered是缓冲区就是为了实现文件复制的加速,大家略带了解。好了,上面文件复制全程不涉及编码,那么经过本人无数次的测试和查阅api文档发现,假如你准备将A文本文件复制给B文本文件,那么A采用utf-8编码,而你的java工程采用默认gbk编码,那么没关系,它复制到B文本文件的还是utf-8编码,因为它的输入输出采用的是字节为单位,不涉及编码。如果A是Unicode编码的生成的B也是采用Unicdoe编码,这就是字节单位编码的java无关。

3

3,那么,如何解决呢?很简单,inputstreamreader创建对象的时候添加编码格式参数,选择与A文件编码相同即可。那么你的java工程就采用指定编码对你这个inputstreamreade对象进行相关操作了,你在打印台输出的时候会发现,当当当,控制台不乱码了,然后可以通过outputstreamwriter输出到指定文件B啦。

4

4,类似inputstreamreader,你的inputstreamreader也可以选择编码,如果不选择的话让你writer(单字符)或wtier(字符数组)写出操作完毕之后,B文件会采用计算机默认提供的编码,当然B文件也不会乱码,它的输出是java工程通过正确接受字符之后系统默认给你做了相应的转化。就是你的控制台是UTF-8编码,没有乱码,你输出成了ANSI依旧没有乱码,字符复制的关键就在于系统是否(通过相同编码方式)正确接受了A文件读入的字符组。同样的,你也可以在inputstreamwriter的构造函数了添加指定编码类型,如上所讲,系统会将它正确接受的字符组,转化为你设定的编码方式,也就是指定B文件编码方式。好了,一口气讲了这么多,大家回想一下。下面再讲filereader和filewrtier这俩货,它们的读入和写出采用的也是字符单位,那么问题来了,如果A文件采用UTF-8,java工程采用的是GBK那么恭喜你,当啷啷,控制台输出乱码伺候,更别想B文件了,细心的你该说了,我在他们的构造函数添加编码方式参数啊,恭喜你,这俩对象没有带编码参数的构造函数, 所以一般情况下不推荐这种用法。

注意事项

全程的过程,就四种类型。1,不带缓冲单字节操作。2,带缓冲单字节操作buffered。3,不带缓冲字节数组操作。4,带缓冲的字节数组操作buffered

推荐信息