使用序列化儲存物件資訊的時候出現中文亂碼問題
阿新 • • 發佈:2018-11-15
eclipse的預設文字編碼格式
預設是GBK的編碼格式,可以調成UTF-8的格式,方法是:
Windows—preferences—General—Workspace—text for encoding
改成UTF-8即可
序列化物件
1、將eclipse預設編碼格式改變特別注意的一點是,你以前用預設編碼格式的所有專案的中文將會全部亂碼,如果再切換成GBK也是沒有作用的
2、使用序列化將物件進行儲存成檔案格式,是一種二進位制編碼儲存,所以你開啟儲存的txt檔案,開啟是中文亂碼的,這點初學者是最想不通的一點,甚至會和我一樣傻逼的看看能不能用用轉換編碼試試,就是用fileoutputstreamwriter進行編碼轉換,但還是沒有理解這些流類的層級關係,序列化物件使用的ObjectOutputstream是位元組輸出流,是Outputstream的一個子類,而fileoutputstreamwriter是字元流Writer的一個子類,這兩者不能混了。
3、所以就需要反序列化將你序列化的物件進行輸出到控制檯給大家看
package test2;
import java.io.Serializable;
/*
* 學生類
*/
public class Student implements Serializable {
private static final long serialVersionUID = 1L;
private String id;
private String name;
private int age;
private String sex;
private String address;
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(String id, String name, int age, String sex, String address) {
super();
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
this.address = address;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "編號:" +this.getId() +"\t" + "姓名:" +this.getName() +"\t" + "年齡:" + this.getAge()+"\t" + "性別:" +this.getSex()+ "\t" +
"地址"+this.getAddress();
}
}
public class Test {
public static void main(String[] args) {
//集合儲存學生資訊
List<Student> list =new ArrayList<Student>();
//新增2個學員到集合中
list.add(new Student("101", "張三", 20, "男", "深圳福田"));
list.add(new Student("102", "李四", 23, "男", "深圳龍崗"));
list.add(new Student("103", "王五", 22, "女", "深圳寶安"));
//序列化集合物件儲存學生資訊
ObjectOutputStream oos=null;
try {
oos=new ObjectOutputStream(new FileOutputStream("src//test2//test.txt"));
// System.out.println(stu);
oos.writeObject(list);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
oos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
反序列化物件
將剛才序列化的集合物件通過反序列化顯示在控制檯
ObjectInputStream ois=null;
//反序列化顯示集合中資訊,得到新的集合
ois=new ObjectInputStream(new FileInputStream("src//test2//test.txt"));
@SuppressWarnings("unchecked")
ArrayList<Student> list2=(ArrayList<Student>) ois.readObject();
//遍歷集合
for (int i = 0; i < list2.size(); i++) {
Student stu=list.get(i);
System.out.println(stu);
}