對象操作流(序列化流) 每次讀取和寫出的都是JavaBean對象. 序列化:將對象寫入到文件中的過程 反序列化:從文件中讀取對象到程式的過程 transient: 標識瞬態,序列化的時候,該修飾符修飾的成員不能序列化 ObjectOutputStream 構造方法: public ObjectOut ...
對象操作流(序列化流)
每次讀取和寫出的都是JavaBean對象.
序列化:將對象寫入到文件中的過程
反序列化:從文件中讀取對象到程式的過程
transient: 標識瞬態,序列化的時候,該修飾符修飾的成員不能序列化
ObjectOutputStream
- 構造方法:
- public ObjectOutputStream(OutputStream out) : 創建一個指定OutputStream的ObjectOutputStream。
- 特有方法:
- public final void writeObject (Object obj) : 將指定的對象寫出。
ObjectInputStream
- 構造方法:
- public ObjectInputStream(InputStream in) : 創建一個指定InputStream的ObjectInputStream。
- 特有方法:
- public final Object readObject () : 讀取一個對象。
- java.io.EOFException : 數據輸出流到了末尾,繼續讀取會拋出此異常(讀到文件的末尾)
- 解決方案:使用集合存儲要寫出的對象,寫數據的時候只需要寫一個集合對象,下次使用的時候只需要讀取了一次就可以.
舉個例子:
package review.serializable;
import lombok.*;
import java.io.Serializable;
import java.net.ServerSocket;
/**
* 創建學生類
* 利用lombok可以使用註解來寫get,set等方法,使實體類看起來很簡單
* @author WZLOVE
* @create 2018-07-25 19:17
*/
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Student implements Serializable {
private static final long serialVersionUID = -1495868075552053159L;
private String name;
private int age;
private double score;
}
package review.serializable;
import java.io.*;
import java.util.ArrayList;
/**
* 測試序列化流
*
* @author WZLOVE
* @create 2018-07-25 19:19
*/
public class SerializableDemo {
public static void main(String[] args) throws IOException, ClassNotFoundException {
// 創建對象輸出流
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("stu1.txt"));
// 向文件中輸出數據(為了方便讀取,所以存入集合,這樣的話,讀取的時候只用讀取一次,查看源碼也可以看出,集合也實現了Serializable介面)
ArrayList<Student> list = new ArrayList<>();
// 向集合中添加數據
list.add(new Student("stu1",23,100.0));
list.add(new Student("stu2",23,98.0));
list.add(new Student("stu3",24,96.0));
// 利用對象輸入流向文件中寫入內容
oos.writeObject(list);
oos.close();
// 創建對象輸入流
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("stu1.txt"));
// 利用對象輸入流獲取文件內容
Object object = ois.readObject();
// 強制類型轉換,將Object轉換為集合
ArrayList<Student> arrayList = (ArrayList<Student>)object;
// 進行遍歷
for (int i = 0; i < arrayList.size(); i++) {
System.out.println(arrayList.get(i));
}
// 關閉流
ois.close();
}
}
列印流(只有輸出流)
- 位元組列印流(瞭解)
- PrintStream:
- 字元列印流(掌握)
- PrintWriter
- 構造方法:
- public PrintStream(String fileName) : 使用指定的文件名創建一個新的列印流。
- PrintWriter(File file) 使用指定的文件創建一個新的PrintWriter,而不需要自動的線路刷新。
- PrintWriter(OutputStream out) 從現有的OutputStream創建一個新的PrintWriter,而不需要自動線路刷新。
- PrintWriter(Writer out) 創建一個新的PrintWriter,沒有自動線沖洗(追加內容考慮參數的變化)。
- PrintWriter(Writer out, boolean autoFlush)創建一個新的PrintWriter。
- PrintWriter(OutputStream out, boolean autoFlush) 從現有的OutputStream創建一個新的PrintWriter。
- 特有方法(自動換行(實現自動換行,必須使用println方法)和自動刷新(在構造方法中啟用並且要使用println()方法)功能):
- void println(Object x) 列印一個對象,然後終止該行。
- 構造方法:
- PrintWriter
註意:
- 實現自動換行必須使用PrintWriter中特有的方法println
- 實現自動刷新必須滿足兩個要求,第一個是在構造方法中啟用自動刷新,第二個是使用PrintWriter中特有的方法println
舉個例子:
package review.print;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
/**
* 測試列印流的書寫
* 列印流也是用寫文件的,簡單的是他能實現自動刷新和自動換行,其他的都簡單,就不演示了
* 列印流分為列印位元組流和列印字元流
* @author WZLOVE
* @create 2018-07-25 19:55
*/
public class PrintWriteDemo {
public static void main(String[] args) throws IOException {
// 列印流只有輸出流
// 創建列印字元流對象(一個true表示追加,第二個true代表開啟自動刷新)
PrintWriter pw = new PrintWriter(new FileWriter("pw.txt",true),true);
// 利用特有的方法進行輸出(無論是自動刷新還是自動換行,都要利用這個特有的方法)
pw.println("qazxswedc,我愛你");
pw.println("qazxswedc,我愛你");
pw.println("qazxswedc,我愛你");
// 關閉流
pw.close();
}
}