日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java io 读取多个对象_Java IO系列(五):读写对象ObjectOutputStream和ObjectInputStream详解...

發布時間:2023/12/4 java 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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详解...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。