1. 程式人生 > >第2章 對象操作流

第2章 對象操作流

Java

1.1 概述
用於從流中讀取對象的
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章 對象操作流