JAVA I/O輸入輸出流操作(二)

此文章對之前JAVA I/O輸入輸出流操作(一)文章中字節流基礎剩余補充,以及字符流、對象的序列化和反序列化問題簡介。

1. 字節流

1.1字節流之數據輸入輸出流
數據輸入輸出流DataInputStream和DataOutputStream,
DataInputStream和DataOutputStream是對流的擴展,方便對int,long,字符流進行讀寫,以int/double/long等方式讀取文件內容。

DataInputStream dps=new DataInputStream (文件輸出流(FileInputStream));
DataOutputStream dps=new DataIOutputStream (文件輸入流(FileOutputStream));

dos.write (int,double,long,utf,chars(寫入格式為utf-16be));
dps.read(int,double,long,utf(讀取方式為utf-8));

向文件數據輸出程序如下圖:


image.png

文件數據讀入程序如下圖:


image.png

讀入控制臺顯示結果如下:


image.png

2.字節緩存流
BufferedOutputStream/BufferedInputStream:字節緩沖流 這兩個流類位IO提供了帶緩沖區 的操作,一般打開文件進行寫入或讀取操作時,都會加上緩沖,這種流模式提高了IO的性能。 從應用程序中把輸入放入文件,相當于將一缸水倒入到另一個缸中

FileOutStream---->write()方法相當于一滴一滴地把水“轉移”過去
DataOutputStream---->相當于一瓢一瓢把水“轉移”過去
BufferedOutputStream----->write方法更方便,相當于一瓢一瓢先放入桶中,在桶中倒入缸中

使用字節緩存流方式實現文本拷貝,程序代碼如下圖:


image.png

之前我們使用過,單字節不帶緩沖拷貝,使用數組批量拷貝,以及現在的字節緩存拷貝,相比之下,
FileOutputStream批量讀取效率>BufferedOutputStream中readXxx()讀取效率>FileoutputStream中read()讀取效率;

2.字符流

java的文本(char)是16位無符號整數,是字符的unicode編碼(雙字節編碼),
文件是byte byte byte......的數據序列
文本文件是文本(char)序列按照某種編碼(utf-8,utf-16be,gbk)序列化為byte的結果
字符流顧名思義,相較于字節流,字符流(Reader,Writer)---->操作的是文本文件
是對字符的處理,一次處理一個字符,字符的底層仍然是基本的字節序列.

2.1字符字節轉換流
InputStreamReader 完成byte流解析為char流,按照編碼解析 可以自定義編碼格式
OutputStreamWriter 提供char流到byte流,按照編碼處理

使用字符字節轉換流實現文本拷貝,實現如下圖:

image.png

2.2字符流之文件讀寫流
FileWriter和FileReader ,這種方式的讀寫流構造要相對簡單,相比于字符字節轉換流,使用文件讀寫流實現文本拷貝,程序如下圖
image.png

2.3字符流的過濾器
BufferedReader -->readLine 一次讀一行
BufferedWriter/PrintWriter -->寫一行
使用字符流的過濾器實現文本拷貝,程序如下圖:
image.png

使用此方法不能實現自動換行,要通過newLine()方法單獨寫出實現

3. 對象的序列化,反序列化

1.對象序列化,就是將Object轉換成byte序列,反之叫對象的反序列化
2.序列化流(ObjectOutputStream),是過濾流-----writeObject
反序列化流(ObjectInputStream)-----readObject
3.序列化接口(Serializable) implements Serializable
對象必須實現序列化接口,才能進行序列化,否則將出現異常
這個接口,沒有任何方法,只是一個標準
對Student對象實現序列化,程序如下圖:


image.png

反序列化:


image.png

反序列化控制臺輸出結果:
image.png

transient關鍵字
使用transient關鍵字,修飾的變量在被序列化是會被jvm默認跳過。但仍然可以通過其他方式完成對該變量的序列化

序列化中子父類構造函數問題
序列化中,子類和父類構造函數的調用問題:
1、無論子、父類是否實現序列化接口,創建子類對象時都會遞歸調用父、子類構造函數
2、沒有實現序列化接口的父類們不會被序列化到文件
3、在反序列化操作時,由于沒有實現序列化接口的父類們沒有被序列化到文件中,所以在生成其子對象時jvm自動調用了父類們的無參構造方法

一個類實現了序列化接口,那么其子類都可以進行序列化
序列化遞歸調用了父類的構造函數
對子類對象進行反序列化操作時,如果其父類沒有實現序列化接口,那么其父類的構造函數會被調用

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容