热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

javaio乱码怎么办

javaio乱码的解决办法:首先在当前项目下新建“aa.txt,bb.txt”;然后在读取和写入的时候,都指定与其文件对应的编码,代码为“newFileInputStream("aa.txt"),"utf-8")”;最后保存即可。

java io乱码怎么办?java中IO及中文乱码问题

第一次发这种博客,所以一直在纠结怎么开头,干脆直奔主题吧,把自己的一些总结体会记录下来,先从简单的学习开始,希望可以慢慢坚持,以后的内容可以写的更好更有意义。

其实真正在工作中中文乱码的问题遇到的不多,那是因为公司为了开发方便所以文件都统一编码了。但是我觉得还有很有必要去稍微了解一下其原理的。

推荐:《java学习

IO就是输入输出流,用面向对象来理解的话,就是输入,输出流对象,主要用来操作文件对象。所以再稍微谈谈文件的概念,即File对象。在Java中,File不是我们平时生活中指的某个具体文件,而是某个路径对象,比如说 File file=new File("D:\\aaa"); 这就是一个File对象,也许它表示的是一个文件夹,也许这个路径都不存在,但是这句代码就的的确确创建了一个表示该路径的File对象。这种写法只是不常用罢了。因为我们平时可能更多的是操作一个文本,图片等等,如File f=new File("aaa.txt");

上面简单说了IO,File是什么,接下来再谈谈这些图片,文字,视频等信息是如何保存在我们存储设备上的。

个人理解是不管是什么类型的文件,都是二进制的形式保存,最小单位是1个byte,即8位01组成。所以说我们假如要拷贝一个文件,只要操作字节流就好了,即把一个文件中的所有字节拿到,写到另一个文件中就OK了,其实理论上是可以的,但是对于字符型的文件比较特殊。

这也就是为什么会有中文乱码的问题出现。ASCII码表大家都很熟悉,起码都听说过,它应该算是很早出现的一种码表了吧,起初只是用来表示26个英文字母和一些特殊符号(因为计算机只识别二进制,所以要把字符用相应的字节来代替,形成一张码表)。

但是随着计算机的发展,ASCII应该不够用了吧,而且很多国家应该也都有自己的一套编码方案,所以就出现了不同的编码表。常见的有GBK,UTF-8,而jvm中默认使用的是unicode编码,即以2个字节表示一个汉字,UTF-8则不一定,可能3个字节表示一个汉字,也可能更多。所以就出现了一个问题,同一个汉字在不同的码表中对应的字节码的个数和内容都不相同。

所以如何解决?

我们从A磁盘上拷贝一张图片到B磁盘上,只要把A的所有字节拿到B就可以了。但是同样的方式操作一个文本其实也是可以的,前提是A和B中的文本编码要相同。因为图片不存在字节编码的问题。但是我要从网络上或者服务器去传输中文怎么办呢,肯定不能单单通过字节来实现了(因为我们不可能遇到问题就手动去更改文件的编码方式吧)。所以java中提供了字符流对象,即在字节流的基础上加上对编码的设置,达到解决乱码的问题。

废话不多说,用几个小案例来说明一下:

1,首先在当前项目下新建aa.txt,bb.txt。随便在aa中写几个中文字符。会发现这两种方式都可以实现

a,采用字符流

FileReader fr=new FileReader("aa.txt");
FileWriter fw=new FileWriter("bb.txt");
  int c;
  while((c=fr.read())!=-1){
   fw.write(c);
  }
  fr.close();
  fw.close();

b,采用字节流

FileInputStream fis=new FileInputStream("aa.txt");
FileOutputStream fos=new FileOutputStream("bb.txt");
  int b;
  while((b=fis.read())!=-1){
   fos.write(b);
  }
  fis.close();
  fos.close();

2,此时假如aa的编码方式是UTF-8的话,那么我们把bb的编码改为GBK看看,同样运行上面两种方法,全部乱码。

原因就是由于两个文件的编码方式不同,导致中文查的码表不同,所以乱码。

3,所以当两边文件的编码方式不同,我们可以在读取和写入的时候都指定与其文件对应的编码即可。

实现方式如下:

InputStreamReader isr=new InputStreamReader(new FileInputStream("aa.txt"),"utf-8");
OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("bb.txt"),"gbk");
  char[] arr=new char[1024];
  int len;
  while((len=isr.read(arr))!=-1){
   String s=new String(arr,0,len);
   System.out.println(s);
   osw.write(s);
  }
  isr.close();
  osw.close();

代码虽然很简单,还是简单的解释一下,从API中可以发现InputStreamReader和OutputStreamWriter都是操作字符的对象,继续Reader和Writer。

主要用来把字节转成字符,字符转成字节。所以从构造中也可以发现,传入的是字节流对象。以utf-8去读取字节流转成字符,再将字符以gbk编码转成字节写入。

下面几行就不做解释了,都是基础里面的方法。构造中传入的是匿名内部类对象,还有装饰设计模式,这种写法简单了解下即可。

关于字节流和字符流其实还有很多很好用的类,比如BufferedInputStream,BufferedReader等等,再次不做赘述。

关于jvm和系统平台的编码问题,在次不做解释。

可以用String来尝试一下,观察字符串在编译和运行时的字节码及编码问题。

以上就是java io乱码怎么办的详细内容,更多请关注其它相关文章!


推荐阅读
  • Docker的安全基准
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 本文介绍如何解决在 IIS 环境下 PHP 页面无法找到的问题。主要步骤包括配置 Internet 信息服务管理器中的 ISAPI 扩展和 Active Server Pages 设置,确保 PHP 脚本能够正常运行。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文介绍了如何在具备多个IP地址的FTP服务器环境中,通过动态地址端口复用和地址转换技术优化网络配置。重点讨论了2Mb/s DDN专线连接、Cisco 2611路由器及内部网络地址规划。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 创建第一个 MUI 移动应用项目
    本文将详细介绍如何使用 HBuilder 创建并运行一个基于 MUI 框架的移动应用项目。我们将逐步引导您完成项目的搭建、代码编写以及真机调试,帮助您快速入门移动应用开发。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 梦幻西游挖图奇遇:70级项链意外触发晶清诀,3000W轻松到手
    在梦幻西游中,挖图是一项备受欢迎的活动,无论是小宝图还是高级藏宝图,都吸引了大量玩家参与。通常情况下,小宝图的数量保证了稳定的收益,但特技装备的出现往往能带来意想不到的惊喜。本文讲述了一位玩家通过挖图获得70级晶清项链的故事,最终实现了3000W的游戏币逆袭。 ... [详细]
  • 本文探讨了 RESTful API 和传统接口之间的关键差异,解释了为什么 RESTful API 在设计和实现上具有独特的优势。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 如何配置Unturned服务器及其消息设置
    本文详细介绍了Unturned服务器的配置方法和消息设置技巧,帮助用户了解并优化服务器管理。同时,提供了关于云服务资源操作记录、远程登录设置以及文件传输的相关补充信息。 ... [详细]
  • 网络攻防实战:从HTTP到HTTPS的演变
    本文通过一系列日记记录了从发现漏洞到逐步加强安全措施的过程,探讨了如何应对网络攻击并最终实现全面的安全防护。 ... [详细]
  • MQTT技术周报:硬件连接与协议解析
    本周开发笔记重点介绍了在新项目中使用MQTT协议进行硬件连接的技术细节,涵盖其特性、原理及实现步骤。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 邮件(带附件,模拟文件上传,跨服务器)发送核心代码1.测试邮件发送附件接口***测试邮件发送附件*@parammultipartFile*@return*@RequestMappi ... [详细]
author-avatar
爱心常在V_991
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有