在JVM内部,所有的字符都是用Unicode编码的。而对于JVM所在操作系统的文件系统,可能有不同的编码类型。 
由于JVM和OS文件系统所使用的编码方式不同,JVM在与操作系统进行数据交互的时候,就会进行编码转换。因此可以说,所有的乱码问题一定是JVM和OS文件系统进行数据交互时候出了问题。

  1. import java.io.*;
  2. public class Demo{
  3. public static void main(String [] args) throws Exception {
  4. File file=new File("D:\\test.txt");//mark1
  5. FileInputStream fis=new FileInputStream(file);
  6. InputStreamReader isr=new InputStreamReader(fis,"GB2312");//mark2
  7. File toFile=new File("D:\\toTest.txt");
  8. FileOutputStream fos=new FileOutputStream(toFile);
  9. OutputStreamWriter osr=new OutputStreamWriter(fos);
  10. int content=-1;
  11. while((content=isr.read())!=-1){
  12. osr.write(content);
  13. }
  14. isr.close();osr.close();
  15. fis.close();fos.close();
  16. System.out.println(System.getProperty("file.encoding"));//笔者的系统默认编码是UTF-8
  17. }
  18. }

对于上面的代码,功能是将test.txt文件的内容读取出来,复制一份到toTest.txt中。 
首先JVM需要将数据从OS文件系统读取到JVM内部,这个时候,JVM需要进行编码转换,目标编码当然是Unicode,原编码是啥?当不在mark2行的代码中指定的话,JVM会默认源编码是系统默认类型(在例子中就是UTF-8),上面的代码中我们指定了原编码方式是GB2312(因为GB2312是test.txt文件的编码类型)。因此,如果我们不指定编码格式为GB2312的话,这个过程读入的数据就已经乱码了。

接着我们来看输出,当数据从JVM输出到OS文件系统的时候,也会进行编码转换,此时源编码是Unicode,目的编码是?如果不指定的话,JVM会指定为系统默认编码,这里是UTF-8。

从上面的过程,我们就可以理解Java程序中的乱码了。解决乱码也很简单,就是在JVM和OS文件系统进行数据交互的时候,一定要指定好编码方式。

最新文章

  1. ZeroMQ接口函数之 :zmq_poll - I/O多路技术
  2. Js 命名空间注册方法
  3. Using ROWNUM in Oracle
  4. (转)document.cookie.indexof的解释
  5. Chapter 10 模版方法模式
  6. 14.5.2 Changing the Number or Size of InnoDB Redo Log Files 改变InnoDB Redo Log Files的数量
  7. 只有五行的Floyd最短路算法
  8. 命名空间“Microsoft.AspNet”中不存在类型或命名空间名“Mvc”
  9. 用Token令牌维护微服务之间的通信安全的实现
  10. JavaWeb学习笔记九 过滤器、注解
  11. SpringCloud分布式微服务搭建(二)
  12. 制作联动时,数据绑定combox控件会触发SelectedIndexChanged事件
  13. MVC 中的@Html.Raw 的用法
  14. laravel 运行错误
  15. Codeforces.765F.Souvenirs(主席树)
  16. HttpSessionListener的用法
  17. SqlHelper分享
  18. mysql 多列索引的生效规则,生成1000w数据的存储过程
  19. innerHTML用法及错误:无法设置未定义或null引用的属性“innerHTML”解决
  20. Python Web学习笔记之多线程编程

热门文章

  1. python 正则表达式与re模块
  2. 紫书 习题8-14 UVa 1616(二分+小数化分数+精度)
  3. 【codeforces 379D】New Year Letter
  4. MySQL锁定状态查看命令
  5. [MST] Loading Data from the Server using lifecycle hook
  6. OpenCASCADE License FAQs
  7. angularjs $location 服务
  8. Vue简单用法目录总结 以及 前端基础总结传送门:
  9. sql查询每个学生的最高成绩mysql语句
  10. 使用Chrome浏览器,让我们远离(所有)广告