Java中读取txt文件中中文字符时,出现乱码的解决办法

  这是我写的一个Java课程作业时,遇到的问题。

  问题描述:

    我要实现的就是将txt文件中的内容按一定格式读取出来后,存放在相应的数组。

  我刚开始运行时发现,英文可以实现,但是中文字符就是各种乱码。

  最后各种检查排错得到原因如下:

  (1)最好先检查你的Eclipse中的Window->Preference->General->WorkSpace中的字符编码格式是什么,最后选成UTF-8格式的。

      然后右键你的工程在弹出的菜单项中选择Resource查看编码格式,也把它改成UTF-8格式的。

  (2)再将InputStreamReader类对象 in2reader 中使用System.out.println(in2reader.getEncoding());

      来查看编码格式。而且使用读取txt文件中的内容最好是按照字符流进行读取使用BufferReader,它里面有很方便的按行读取的函数readLine(),返回的是换行符前的字符串;

  (3)使用Notepad++来对你的txt文件进行文件编码格式的选择,在菜单栏下的格式选项中。注意一定要选成UTF-8无BOM格式编码。

  (4)运行你的程序就正确输出啦!

  总结:其实这个问题最本质的解决办法的就是要把握好,文件本身格式的编码格式以及Java程序读取时的格式,把握好这一点,这个小问题就可以轻而易举地解决啦。

  

    下面是我的参考示例代码:

  1 /*
  2 *从txt文件中读取数据存放到学生类数组中
  3 */
  4 
  5 
  6 package woshijpf;
  7 
  8 import java.io.BufferedInputStream;
  9 import java.io.BufferedOutputStream;
 10 import java.io.BufferedReader;
 11 import java.io.File;
 12 import java.io.FileInputStream;
 13 import java.io.FileNotFoundException;
 14 import java.io.FileOutputStream;
 15 import java.io.IOException;
 16 import java.io.InputStreamReader;
 17 
 18 
 19 public class Read_Stu_Info {
 20     
 21     private int stu_num = 0;
 22     private File r_file,w_file;  
 23     private BufferedInputStream bin_r;  
 24     private BufferedOutputStream bout_w; 
 25     private InputStreamReader in2reader;
 26     private BufferedReader br;
 27     private Student[] stu_arr = null;
 28     private String[] stuStrings= new String[3];   
 29     private int count = 0;  
 30     private String numString;   
 31     private Integer numInteger;  
 32     
 33     public Read_Stu_Info(String r_filename,String w_filename)
 34     {
 35         r_file = new File(r_filename);   
 36         if(r_file.exists()==false)
 37         {
 38             try {
 39                 r_file.createNewFile();
 40             } catch (IOException e) {
 41                 // TODO Auto-generated catch block
 42                 e.printStackTrace();
 43             }
 44         }
 45         
 46         w_file = new File(w_filename);   
 47         if(w_file.exists()==false)
 48         {
 49             try {
 50                 r_file.createNewFile();
 51             } catch (IOException e) {
 52                 // TODO Auto-generated catch block
 53                 e.printStackTrace();
 54             }
 55         }
 56         
 57         try {
 58             bin_r = new BufferedInputStream(new FileInputStream(r_file));
 59             in2reader = new InputStreamReader(bin_r);
 60             br = new BufferedReader(in2reader);
 61             
 62             //System.out.println(in2reader.getEncoding());
 63             
 64             bout_w = new BufferedOutputStream(new FileOutputStream(w_file));
 65         } catch (FileNotFoundException e) {
 66             // TODO Auto-generated catch block
 67             e.printStackTrace();
 68         }
 69         
 70         try {
 71             numString = br.readLine();
 72             numInteger = Integer.valueOf(numString);
 73             stu_num = numInteger.intValue();
 74             System.out.println("学生人数: "+stu_num);
 75         } catch (IOException e) {
 76             // TODO Auto-generated catch block
 77             e.printStackTrace();
 78         }
 79         
 80         stu_arr = new Student[stu_num];   
 81         
 82     }
 83     
 84     public int Getnum()
 85     {
 86         return stu_num;
 87     }
 88     
 89     public void GetInfo()          
 90     {
 91         String temp = null;  
 92         try {
 93             while((temp = br.readLine())!=null)
 94             {
 95                 stuStrings = temp.split(" ");
 96                 stu_arr[count++] = new Student(stuStrings[0], stuStrings[1], stuStrings[2]);
 97             }
 98         } catch (IOException e) {
 99             // TODO Auto-generated catch block
100             e.printStackTrace();
101         }
102         
103     }
104     
105 
106     public Student[] GetArray()
107     {
108         return stu_arr;
109     }
110     
111     public int GetStu_num()
112     {
113         return count;
114     }
115 
116 }
/*
*学生类
*/
package woshijpf;

public class Student {
    
    private String  name;
    private String  stunum;
    private String  score;
    
    public Student(String name,String stunum,String score)
    {
        this.name = name;
        this.stunum = stunum;
        this.score = score;
    }
    
    public String getName()
    {
        return name;
    }
    
    public String getNum()
    {
        return stunum;
    }
    
    public String getScore()
    {
        return score;
    }
    
    public void Print()
    {
        System.out.println("学生信息: ");
        System.out.println("姓名: "+name+"  学号:  "+stunum+" 分数:  "+score);
    }

}
 1 /*
 2 *测试主函数类
 3 */
 4 package woshijpf;
 5 
 6 public class Test_4 {
 7     
 8     public static void main(String[] args)
 9     {    
10         /*
11          * 题目五程序
12          */
13         Student[] stu_array = null;
14         int count;
15         
16         Read_Stu_Info rsi = new Read_Stu_Info("a.txt", "a.dat");
17         rsi.GetInfo();
18         stu_array = rsi.GetArray();
19         count = rsi.GetStu_num();
20         for(int i=0;i<count;i++)
21         {
22             stu_array[i].Print();
23         }
24         
25         
26     }
27 
28 }
原文地址:https://www.cnblogs.com/woshijpf/p/3688798.html