java io 读取多个对象_Java IO系列(五):读写对象ObjectOutputStream和ObjectInputStream详解...
有必要多看幾遍的
關于字符和字節,例如文本文件,XML這些都是用字符流來讀取和寫入。而如RAR,EXE文件,圖片等非文本,則用字節流來讀取和寫入。
讀寫對象,傳輸對象在Java中很常使用,在javaBean中就經常用到。一般來說,對象要能被對寫,自身要實現特定的接口,Serializable或Externalizable接口。
實現Serializable接口對象的讀寫
實現了Serializable的對象,會被全序列化,當我們在進行序列化時,一般對象中存在我們不需要序列化的數據。但Serializable會全序列化,影響效率,一般來說,可能并不是最好的選擇。
class Person implements Serializable{
private int age;
private String name;
public Person(int age, String name){
this.age = age;
this.name = name;
}
@Override
public String toString(){
return "[age:" + age + ",name:" + name + "]";
}
}
public class TestObject {
public static void main(String[] args) throws IOException, ClassNotFoundException {
String path = "F:/io/person.txt";
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(path));
out.writeObject(new Person(20, "nick"));
out.writeObject(new Person(21, "liu"));
out.writeObject(new Person(22, "mike"));
out.close();
ObjectInputStream in = new ObjectInputStream(new FileInputStream(path));
for (int i = 0; i < 3; i++) {
System.out.println(in.readObject());
}
in.close();
}
}
結果為:
[age:20,name:nick]
[age:21,name:liu]
[age:22,name:mike]
transient使實現Serializable對象不全序列化
transient是一個關鍵字,配合Serializable使用,表示該數據不需要序列化。
class Person implements Serializable{
private int age;
private transient String name;//注意這里使用了transient
public Person(int age, String name){
this.age = age;
this.name = name;
}
@Override
public String toString(){
return "[age:" + age + ",name:" + name + "]";
}
}
public class TestObject {
public static void main(String[] args) throws IOException, ClassNotFoundException {
String path = "F:/io/person.txt";
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(path));
out.writeObject(new Person(20, "nick"));
out.writeObject(new Person(21, "liu"));
out.writeObject(new Person(22, "mike"));
out.close();
ObjectInputStream in = new ObjectInputStream(new FileInputStream(path));
for (int i = 0; i < 3; i++) {
System.out.println(in.readObject());
}
in.close();
}
}
結果為:
[age:20,name:null]
[age:21,name:null]
[age:22,name:null]
可見,name確實沒有被序列化
實現Externalizable接口對象的局部數據讀寫
實現Externalizable,則必須實現writeExternal(ObjectOutput out)和readExternal(ObjectInput in)這兩個方法,而這兩個方法正是關鍵。
對于Serializable對象,對象不會調用它的構造器。但是Externalizable對象會調用它所有的默認構造器。而我們一般對對象初始化,不是在默認的構造器,這樣的話,對象中的數據都沒有初始化。
所以我們要在writeExternal中,寫我們需要的數據,在readExternal中取我們需要的數據。
class Person implements Externalizable{
private int age;
private String name;
private String address;
public Person(){
}
public Person(int age, String name, String address){
this.age = age;
this.name = name;
this.address = address;
}
@Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeInt(age);
out.writeObject(name);
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
age = in.readInt();
name = (String) in.readObject();
}
@Override
public String toString(){
return "[age:" + age + ",name:" + name + ",address:" + address + "]";
}
}
public class TestObject {
public static void main(String[] args) throws IOException, ClassNotFoundException {
String path = "F:/io/person.txt";
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(path));
out.writeObject(new Person(20, "nick", "beijing"));
out.writeObject(new Person(21, "liu", "guangzhou"));
out.writeObject(new Person(22, "mike", "shanghai"));
out.close();
ObjectInputStream in = new ObjectInputStream(new FileInputStream(path));
for (int i = 0; i < 3; i++) {
System.out.println((Person) in.readObject());
}
in.close();
}
}
結果為:
[age:20,name:nick,address:null]
[age:21,name:liu,address:null]
[age:22,name:mike,address:null]
可見,在writeExternal中,并沒有寫入address,因為我不需要它。所以我只讀取到age和name。
總結
以上是生活随笔為你收集整理的java io 读取多个对象_Java IO系列(五):读写对象ObjectOutputStream和ObjectInputStream详解...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果手表Apple Watch怎么充电?
- 下一篇: java美元兑换,(Java实现) 美元