在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]】
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();
}
}
运行结果图片: