打印流(PrintStream)

 

PrintStreamPrintStream:在OutputStream基礎上提供了增強的功能,即可以方便地輸出各種類型的數據(而不僅限於byte類型)的格式化表示形式。 ·

構造方法:

PrintStream可以作爲節點流使用而直接關聯到文件數據源,也可以作爲處理流關聯到其他的字節輸出流並向其輸出數據提供增強的功能。
PrintStream(File file)
PrintStream(String fileName)
PrintStream(OutputStream out)
PrintStream(OutputStream out, boolean autoFlush)

PrintStream的方法不拋IOException;而是在異常的情況下設置一個內部標誌,可以通過成員方法checkError()測試此標誌的值以表明是否出現異常。

System.out就是一個PrintStream類型的對象。

PrintWriter:和PrintStream相似,區別在於:作爲處理流使用時,PrintStream只能封裝OutputStream類型的字節輸出流,而PrintWriter既可封裝OutputStream,還能夠封裝Writer類型字符輸出流並增強其功能。

例子:

/如果既要有自動刷新,又可執行編碼。如何創建流對象?

PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream("a.txt"),"utf-8"),true);

//如果想要提高效率,還要使用打印方法。

PrintWriter pw = new PrintWriter(new BufferdWriter(new OutputStreamWriter(new FileOutputStream("a.txt"),"utf-8")),true);

處理流

DataInputStream:

屬於處理流,它能夠以一種與機器無關的方式,直接從底層字節輸入流讀取Java基本數據類型和String類型的數據。

public DataInputStream(InputStream);
FileInputStream fis=new FileInputStream(“a.txt”);
DataInputStream ds=new DataInputStream(fis);

常用方法
int readInt();    boolean readBoolean();
short readShort();      long readLong();
String readUTF();

DataOutputStream:能夠直接將Java基本類型數據寫出其他的字節輸出流,隨後可以使用DataInputStream輸入流讀取這些數據

構造方法 public DataOutputStream(OutputStream);

常用方法
writeInt(int):一次寫入四個字節writeBoolean(boolean);
writeShort(short);
writeLong(long);
writeUTF(String);//按照utf-8修改版將字符數據進行存儲,只能通過readUTF讀取。

 

對象的序列化

序列化的本意是把並行數據轉換成串行數據的處理過程。

對象序列化是指將對象的狀態數據以字節流的形式進行處理,一般用於實現對象的持久性,即長久保持一個對象的狀態並在需要時獲取該對象的信息以重新構造一個狀態完全相同的對象。

簡單的說,對象的序列化可以理解爲使用I/O“對象流”類型實現的對象讀/寫操作。---ObjectInputStream以及ObjectOutputStream

Employ類,屬性包括name、age和dept,方法有構造方法、getter和setter方法以及showInfo方法

使用ObjectOutputStream對象的writeOjbect()將員工對象存入指定文件。該方法將內存中員工對象的狀態信息(姓名、年齡和部門)以有序二進制流的形式輸出到目標文件中。--對象序列化

對象序列化的主要任務:寫出對象的狀態信息,並遍歷該對象對其他對象的引用,遞歸的序列化所有被引用到的其他對象,從而建立完整的序列化流。

 

使用ObjectInputStream對象的readObject()將文件中的員工信息讀取出來。--反序列化。

該方法反序列化輸入流中的下一個對象,遍歷該對象中所有對其他對象的引用,並遞歸的反序列化這些引用對象。

注意:

並不是任何引用類型的對象都可以被序列化,只有實現了java.io.Serializable接口的類的對象纔可以。--出於安全性考慮,因爲一些封裝敏感信息或時效性強的信息的類不建議支持序列化,以避免出現泄密或信息失效問題。

注意:

 

Serializable接口中實際上沒有定義任何屬性和方法,它只是起到標記性作用(標記接口)。

 

在Java的語言規範中規定,Serializable接口的實現類均應提供無參的構造方法,以供可能的反序列化操作、系統重建對象時自動調用。

 

類中的靜態成員不會被序列化。

 

對應非靜態的成員如果也不想被序列化,可以通過transient關鍵字修飾。

 

實例,序列化過程中的數據保護。
發佈了42 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章