把對象以流的方法,寫入到文件中保存:寫對象(對象的序列化)
對象中包含的不單單是字符,使用字節流java
ObjectOutputStream(對象序列化流)
ObjectInputStream(對像反序列化流)數組
對象的序列化流
java.io.ObjectOutputStream extends OutputStream
把對象以流的形式寫入到文件中保存編碼
構造方法:spa
ObjectOutputStream(OutputStream out):建立寫入指定OutputStream的ObjectOutputStream 參數: OutputStream out:字節輸出流
特有成員方法:3d
void writeObject(Object obj):將指定的對象寫入ObjectOutputStream
使用步驟code
序列化和反序列化時,會拋出NotSerializableException
要實現序列化和反序列化的類必須實現Serializable接口(僅起標記做用)對象
public class Person implements Serializable { private String name; private int age; .... }
public static void main(String[] args) throws IOException { ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("E:\\A JI\\program\\java\\test-txt\\person.txt")); oos.writeObject(new Person("hehe", 18)); oos.close(); }
對象的反序列化流
java.io.ObjectInputStream extends InputStream
把文件中保存的對象,以流的方式讀取使用blog
構造方法:繼承
ObjectInputStream(InputStream In):建立寫入指定InputStream的ObjectInputStream 參數: InputStream in:字節輸入流
特有的成員方法:接口
Object readObject() 從ObjectInputStream 讀取對象
使用步驟
readObject()聲明會拋出ClassNotFoundException(class文件找不到異常)
**1.類必須實現Serializable接口
2.必須存在類對應的class文件**
public static void main(String[] args) throws IOException, ClassNotFoundException { ObjectInputStream ois = new ObjectInputStream(new FileInputStream("E:\\A JI\\program\\java\\test-txt\\person.txt")); Object o = ois.readObject(); ois.close(); System.out.println(o); Person p = (Person)o; System.out.println(p.getName() + p.getAge()); } output: Person{name='hehe', age=18} hehe18
transient關鍵字
被transient修飾的成員變量,不能被序列化
解決方案:
開發者本身定義一個序列號
private static final long serialVersionUID = 1L;
序列化集合
public static void main(String[] args) throws IOException, ClassNotFoundException { //定義存儲Person對象的數組 ArrayList<Person> list = new ArrayList<>(); list.add(new Person("zz", 18)); list.add(new Person("qq", 19)); list.add(new Person("cc", 20)); //存儲Person對象到ArrayList數組中 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("E:\\A JI\\program\\java\\test-txt\\person12.txt")); oos.writeObject(list); //讀取文件中保存的集合 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("E:\\A JI\\program\\java\\test-txt\\person12.txt")); Object o = ois.readObject(); //將Object類型集合轉換爲ArrayList集合 ArrayList<Person> list2 = (ArrayList<Person>) o; for (Person person : list2) { System.out.println(person.getName() + " " + person.getAge()); } } output: zz 18 qq 19 cc 20
java.io.PrintStream extends OutputStream
特色:
構造方法:
PrintStream(File file):輸出目的地是一個文件 PrintStream(OutputStream out):...是一個字節輸出流 PrintStream(String fileName):...是一個文件路徑
若是使用繼承自父類的write方法寫數據,查數據會查詢編碼表
若是使用自身特有的print/println方法寫數據,寫得數據原樣輸出