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

实验环境:

Netbeans IDE 11.2、JDK1.8等


问题阐述:

刚开始我向文本文件输入中文时,出现了以下问题:


Java中文转拼音代码 java 输入中文_java


以下是代码部分【已加上详细注释,若想深入了解 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();
    }
}


运行结果图片:

Java中文转拼音代码 java 输入中文_java_02