这是我写的一个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) 21 { 22 stu_array[i].Print(); 23 } 24 25 26 } 27 28 }