Java 输入输出流 解决中文乱码问题【不一定详细但一定实用篇】【全文4800字】 您所在的位置:网站首页 今晚报报纸 Java 输入输出流 解决中文乱码问题【不一定详细但一定实用篇】【全文4800字】

Java 输入输出流 解决中文乱码问题【不一定详细但一定实用篇】【全文4800字】

2024-01-15 12:00| 来源: 网络整理| 查看: 265

  在Java IO流的学习过程中,对 txt 形式的文本文件进行写入/写出操作时,出现了 中文乱码 的现象,经过不懈地努力下,查阅相关资料后得以解决。现记录一下自己的解决过程,希望能帮到大家。

实验环境:

Netbeans IDE 11.2、JDK1.8等

问题阐述:

刚开始我向文本文件输入中文时,出现了以下问题: 在这里插入图片描述

以下是代码部分【已加上详细注释,若想深入了解 IO机制 ,请查看附录连接[3]】 package AllJavaExperiments; import java.io.*; /** * * @author NJUPT_wly */ public class JavaExperiment_3 { public static void main(String[] args) throws IOException{ InputStreamReader isr = new InputStreamReader(System.in); //定义标准输入流【注:这是“字节”输入流】 BufferedReader bin_1 = new BufferedReader(isr); //获取缓冲输入流【注:它是一个装饰器】 //注:将BufferedReader/BufferedWriter与文件流一起使用,可以减少 缓冲区功能匹配CPU 与 I/O的处理速度 的差异 File outputFile = new File("C:\\Users\\ASUS\\Desktop\\outTest.txt"); //构造File类实例【接下来就可以对该实例进行相应的操作】 FileWriter out = new FileWriter(outputFile); //基于“字符”的输出操作 BufferedWriter bout = new BufferedWriter(out); //获取缓冲输出流【注:它是一个装饰器】 String s; System.out.println("-----以下是将要写入outTest文件的数据:(以单行“#”结束)-----"); try{ while( (s = bin_1.readLine()) != null ){ if( "#".equals(s) ) break; //System.out.println(s); bout.write(s); bout.newLine(); //转到下一行 } }catch( IOException e ){ //若输入有异常,则执行下面一条语句 System.out.println("There is a error!"); } bin_1.close(); //最先关闭缓冲输入流 isr.close(); //在关闭标准输入流 bout.flush(); //清空缓冲区 bout.close(); //关闭缓冲输出流,释放和这个流相关的系统资源【】 out.close(); //在关闭文件输出流 System.out.println("-----以下是从outTest文件读出的数据:-----"); File fin = new File("C:\\Users\\ASUS\\Desktop\\outTest.txt"); FileReader finReader = new FileReader(fin); //基于“字符”的输入操作 BufferedReader bin_2 = new BufferedReader(finReader); String ss; while( (ss = bin_2.readLine()) != null ){ System.out.println(ss); //输出到命令行窗口 } bin_2.close(); //依次关闭,注意关闭顺序 finReader.close(); } }

查阅了很多资料后,终于解决了问题:

接下来分别记录一下:

  1、解决方法

  2、为什么要这样解决?

-----------------------------------分割线------------------------------------------

1、解决方法:   只需要在 标准输入流函数内 增加一个参数 "gbk"即可。 2、为什么要这样解决?【引用附录链接[2]】   1. 系统的编码和 程序的编码各采用了不同的编码格式。   2.通常,假如自己不修改的话,windows自身采用的编码格式是 gbk(而 gbk和 gb2312基本上是一样的编码方式).   3.而IDE中默认是 utf-8的编码,这就是为什么会出现乱码的原因。   4.当在OS下手工创建并写入的txt文件( 编码形式为gbk),用程序直接去读( 编码形式为utf-8),就会出现乱码。 以下是修改后的代码: package AllJavaExperiments; import java.io.*; /** * * @author NJUPT_wly */ public class JavaExperiment_3 { public static void main(String[] args) throws IOException{ InputStreamReader isr = new InputStreamReader(System.in,"gbk"); //以“gbk”方式定义标准输入流【注:这是“字节”输入流】 BufferedReader bin_1 = new BufferedReader(isr); //获取缓冲输入流【注:它是一个装饰器】 //注:将BufferedReader/BufferedWriter与文件流一起使用,可以减少 缓冲区功能匹配CPU 与 I/O的处理速度 的差异 File outputFile = new File("C:\\Users\\ASUS\\Desktop\\outTest.txt"); //构造File类实例【接下来就可以对该实例进行相应的操作】 FileWriter out = new FileWriter(outputFile); //基于“字符”的输出操作 BufferedWriter bout = new BufferedWriter(out); //获取缓冲输出流【注:它是一个装饰器】 String s; System.out.println("-----以下是将要写入outTest文件的数据:(以单行“#”结束)-----"); try{ while( (s = bin_1.readLine()) != null ){ if( "#".equals(s) ) break; //System.out.println(s); bout.write(s); bout.newLine(); //转到下一行 } }catch( IOException e ){ //若输入有异常,则执行下面一条语句 System.out.println("There is a error!"); } bin_1.close(); //最先关闭缓冲输入流 isr.close(); //在关闭标准输入流 bout.flush(); //清空缓冲区 bout.close(); //关闭缓冲输出流,释放和这个流相关的系统资源【】 out.close(); //在关闭文件输出流 System.out.println("-----以下是从outTest文件读出的数据:-----"); File fin = new File("C:\\Users\\ASUS\\Desktop\\outTest.txt"); FileReader finReader = new FileReader(fin); //基于“字符”的输入操作 BufferedReader bin_2 = new BufferedReader(finReader); String ss; while( (ss = bin_2.readLine()) != null ){ System.out.println(ss); //输出到命令行窗口 } bin_2.close(); //依次关闭,注意关闭顺序 finReader.close(); } }

运行结果图片:

在这里插入图片描述

参考附录:

[1] 《ANSI是什么编码?》【桌面上txt文件默认为ANSI编码形式,那ANSI是什么呢? 通过这篇文章,你可以比较系统地学习到:各种编码的由来和原理】 链接: ANSI是什么编码?. [2] 《Java读写中文文件,解决中文乱码问题 》【这篇文章就是我在文中所引用的】 链接: Java读写中文文件,解决中文乱码问题. [3] 《深入理解Java中的IO》【通过这篇文章你可以系统地学习Java中的输入输出流的原理及实现】 链接: 深入理解Java中的IO.

后记:感谢以上博主。这是小生第一篇博文,疏漏之处还望海涵,烦请指正。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有