第2章 對象操作流
阿新 • • 發佈:2018-04-18
Java1.1 概述
用於從流中讀取對象的
ObjectInputStream 稱為 反序列化流,利用輸入流從文件中讀取對象
ObjectOutputStream 稱為 序列化流,利用輸出流向文件中寫入對象
特點:用於操作對象。可以將對象寫入到文件中,也可以從文件中讀取對象。
用於從流中讀取對象的
ObjectInputStream 稱為 反序列化流,利用輸入流從文件中讀取對象
ObjectOutputStream 稱為 序列化流,利用輸出流向文件中寫入對象
特點:用於操作對象。可以將對象寫入到文件中,也可以從文件中讀取對象。
package com.itheima_07; /* * 對象操作流:可以用於讀寫任意類型的對象 * ObjectOutputStream * writeObject * ObjectOutputStream(OutputStream out) * ObjectInputStream * readObject * ObjectInputStream(InputStream in) * * 註意: * 使用對象輸出流寫出對象,只能使用對象輸入流來讀取對象 * 只能將支持 java.io.Serializable 接口的對象寫入流中 * */ public class ObjectOutputStreamDemo2 { public static void main(String[] args) { } }
1.2 利用序列化流讀寫對象
package com.itheima_07; import java.io.Serializable; public class Student implements Serializable { /** * */ String name; int age; public Student(String name,int age) { this.name = name; this.age = age; } @Override public String toString() { return "Student [name=" + name + ", age=" + age +"]"; } } package com.itheima_07; import java.io.EOFException; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; /* * 使用對象輸出流和讀對象輸入流寫對象 * Exception in thread "main" java.io.NotSerializableException: com.itheima_07.Student * Serializable:序列號,是一個標識接口,只起標識作用,沒有方法 * 當一個類的對象需要IO流進行讀寫的時候,這個類必須實現該接口 * * Exception in thread "main" java.io.EOFException:當輸入過程中意外到達文件或流的末尾時,拋出此異常。 * */ public class ObjectOutputStreamDemo { public static void main(String[] args) throws IOException, ClassNotFoundException { //method(); //創建對象輸入流的對象 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("a.txt")); //讀取對象 /*Object obj = ois.readObject(); System.out.println(obj); Object obj2 = ois.readObject(); System.out.println(obj2); Object obj3 = ois.readObject(); System.out.println(obj3);*/ try { while(true) { Object obj = ois.readObject(); System.out.println(obj); } } catch(EOFException e) { System.out.println("讀到了文件的末尾"); } //釋放資源 ois.close(); } private static void method() throws IOException, FileNotFoundException { //創建對象輸出流的對象 //FileOutputStream fos = new FileOutputStream("a.txt"); //ObjectOutputStream oos = new ObjectOutputStream(fos); ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("a.txt")); //創建學生對象 Student s = new Student("zhangsan",18); Student s2 = new Student("lisi",19); //寫出學生對象 oos.writeObject(s); oos.writeObject(s2); //釋放資源 oos.close(); } }
1.2.1 案例代碼六:
package com.itheima_02; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; /* * 使用字符流復制文本文件 * * 數據源 IODemo.java * 目的地 d:\\IODemo.java * */ public class FileCopyDemo { public static void main(String[] args) throws IOException { //創建字符輸入流對象 FileReader fr = new FileReader("IODemo.java"); //創建字符輸出流對象 FileWriter fw = new FileWriter("d:\\IODemo.java"); //一次讀寫一個字符 /*int ch; while((ch = fr.read()) != -1) { fw.write(ch); fw.flush(); }*/ //一次讀寫一個字符數組 int len;//用於存儲讀到的字符個數 char[] chs = new char[1024]; while((len = fr.read(chs)) != -1) { fw.write(chs,0,len); fw.flush(); } //釋放資源 fw.close(); fr.close(); } }
1.3 解決對象輸入流讀取對象出現異常的問題1.3.1 案例代碼七:
package com.itheima_07;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
/*
* 解決對象輸入流讀取對象出現異常的問題
*
*/
public class ObjectOutputStreamDemo3 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//method();
//創建對象輸入流的對象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("b.txt"));
//讀取數據
Object obj = ois.readObject();
//System.out.println(obj);
//向下轉型,獲取具體的子類對象
ArrayList<Student> list = (ArrayList<Student>) obj;
for (Student student : list) {
System.out.println(student);
}
//釋放資源
ois.close();
}
private static void method() throws IOException, FileNotFoundException {
//創建對象輸出流的對象
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("b.txt"));
//創建集合對象
ArrayList<Student> list = new ArrayList<Student>();
//添加學生對象
list.add(new Student("wangwu",30));
list.add(new Student("zhaoliu",28));
//寫出集合對象
oos.writeObject(list);
//釋放資源
oos.close();
}
}
1.4 解決讀寫對象版本不一致問題
1.4.1 案例代碼八:
package com.itheima_07;
import java.io.Serializable;
public class Student implements Serializable {
/**
*
*/
private static final long serialVersionUID = 6361890890437825953L;
String name;
int age;
String gender;
public Student(String name,int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", gender=" + gender + "]";
}
}
package com.itheima_07;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
/*
* 解決對實現序列化接口出現的×××警告問題
* Exception in thread "main" java.io.InvalidClassException
* 當 Serialization 運行時檢測到某個類具有以下問題之一時,拋出此異常。
該類的序列版本號與從流中讀取的類描述符的版本號不匹配
該類包含未知數據類型
該類沒有可訪問的無參數構造方法
*
*/
public class ObjectOutputStreamDemo4 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//method();
method2();
}
//讀取學生對象
private static void method2() throws IOException, FileNotFoundException, ClassNotFoundException {
//創建對象輸入流的對象
第2章 對象操作流