2019-06-04

對象流

?我們前邊學(xué)到的數(shù)據(jù)流只能實現(xiàn)對基本數(shù)據(jù)類型和字符串類型的讀寫,并不能讀取對象(字符串除外),如果要對某個對象進(jìn)行讀寫操作,我們需要學(xué)習(xí)一對新的處理流:ObjectInputStream/ObjectOutputStream

為什么序列化

序列化以后的對象可以保存到磁盤上,也可以在網(wǎng)絡(luò)上傳輸,使得不同的計算機(jī)可以共享對象.(序列化的字節(jié)序列是平臺無關(guān)的)

對象序列化的條件

只有實現(xiàn)了Serializable接口的類的對象才可以被序列化。Serializable接口中沒有任何的方法,實現(xiàn)該接口的類不需要實現(xiàn)額外的方法。如果對象的屬性是對象,屬性對應(yīng)類也必須實現(xiàn)Serializable

注意

? ? ? 1. 對象流不僅可以讀寫對象,還可以讀寫基本數(shù)據(jù)類型。

? ? ??2. 使用對象流讀寫對象時,該對象必須序列化與反序列化。

? ? ??3. 系統(tǒng)提供的類(如Date等)已經(jīng)實現(xiàn)了序列化接口,自定義類必須手動實現(xiàn)序列化接口。

代碼練習(xí):



字節(jié)數(shù)組流

?ByteArrayInputStream和ByteArrayOutputStream經(jīng)常用在需要流和數(shù)組之間轉(zhuǎn)化的情況!

? ? ??說白了,F(xiàn)ileInputStream是把文件當(dāng)做數(shù)據(jù)源。ByteArrayInputStream則是把內(nèi)存中的”某個字節(jié)數(shù)組對象”當(dāng)做數(shù)據(jù)源。

字節(jié)數(shù)組流的作用?

ByteArrayInputStream 序列化輸出時以字節(jié)數(shù)組的形式傳輸,提高網(wǎng)絡(luò)傳輸?shù)男?/p>

課堂代碼:



?序列化和反序列化


兩個進(jìn)程遠(yuǎn)程通信時,彼此可以發(fā)送各種類型的數(shù)據(jù)。 無論是何種類型的數(shù)據(jù),都會以二進(jìn)制序列的形式在網(wǎng)絡(luò)上傳送。比如,我們可以通過http協(xié)議發(fā)送字符串信息;我們也可以在網(wǎng)絡(luò)上直接發(fā)送Java對象。發(fā)送方需要把這個Java對象轉(zhuǎn)換為字節(jié)序列,才能在網(wǎng)絡(luò)上傳送;接收方則需要把字節(jié)序列再恢復(fù)為Java對象才能正常讀取。

? ? ??把Java對象轉(zhuǎn)換為字節(jié)序列的過程稱為對象的序列化。把字節(jié)序列恢復(fù)為Java對象的過程稱為對象的反序列化。

? ? ??對象序列化的作用有如下兩種:

? ? ??1. 持久化: 把對象的字節(jié)序列永久地保存到硬盤上,通常存放在一個文件中,比如:休眠的實現(xiàn)。以后服務(wù)器session管理,hibernate將對象持久化實現(xiàn)。

? ? ??2. 網(wǎng)絡(luò)通信:在網(wǎng)絡(luò)上傳送對象的字節(jié)序列。比如:服務(wù)器之間的數(shù)據(jù)通信、對象傳遞。

列化與反序列化的內(nèi)容?

? ObjectOutputStream代表對象輸出流,它的writeObject(Object obj)方法可對參數(shù)指定的obj對象進(jìn)行序列化,把得到的字節(jié)序列寫到一個目標(biāo)輸出流中。

?ObjectInputStream代表對象輸入流,它的readObject()方法從一個源輸入流中讀取字節(jié)序列,再把它們反序列化為一個對象,并將其返回。

序列化涉及的類和接口

?ObjectOutputStream代表對象輸出流,它的writeObject(Object obj)方法可對參數(shù)指定的obj對象進(jìn)行序列化,把得到的字節(jié)序列寫到一個目標(biāo)輸出流中。

? ? ??ObjectInputStream代表對象輸入流,它的readObject()方法從一個源輸入流中讀取字節(jié)序列,再把它們反序列化為一個對象,并將其返回。

? ? ??只有實現(xiàn)了Serializable接口的類的對象才能被序列化。 Serializable接口是一個空接口,只起到標(biāo)記作用。

裝飾器模式

裝飾器模式是GOF23種設(shè)計模式中較為常用的一種模式。它可以實現(xiàn)對原有類的包裝和裝飾,使新的類具有更強(qiáng)的功能。

? ? ??我這里有智能手機(jī)iphone, 我們可以通過加裝投影組件,實現(xiàn)原有手機(jī)功能的擴(kuò)展。這就是一種“裝飾器模式”。 我們在未來給普通人加裝“外骨骼”裝飾,讓普通人具有力扛千斤的能力,也是一種“裝飾器模式”。

代碼練習(xí):







Apache IOUtils和FileUtils


?JDK中提供的文件操作相關(guān)的類,但是功能都非?;A(chǔ),進(jìn)行復(fù)雜操作時需要做大量編程工作。實際開發(fā)中,往往需要你自己動手編寫相關(guān)的代碼,尤其在遍歷目錄文件時,經(jīng)常用到遞歸,非常繁瑣。 Apache-commons工具包中提供了IOUtils/FileUtils,可以讓我們非常方便的對文件和目錄進(jìn)行操作。 本文就是讓大家對IOUtils/FileUtils類有一個全面的認(rèn)識,便于大家以后開發(fā)與文件和目錄相關(guān)的功能。

? ? ??Apache IOUtils和FileUtils類庫為我們提供了更加簡單、功能更加強(qiáng)大的文件操作和IO流操作功能。

FileUtils


FieUtils類中常用方法的介紹

? ? ??打開FileUtils的api文檔,我們抽出一些工作中比較常用的方法,進(jìn)行總結(jié)和講解??偨Y(jié)如下:

? ? ??cleanDirectory:清空目錄,但不刪除目錄。

? ? ??contentEquals:比較兩個文件的內(nèi)容是否相同。

? ? ??copyDirectory:將一個目錄內(nèi)容拷貝到另一個目錄。可以通過FileFilter過濾需要拷貝的 文件。

? ? ??copyFile:將一個文件拷貝到一個新的地址。

? ? ??copyFileToDirectory:將一個文件拷貝到某個目錄下。

? ? ??copyInputStreamToFile:將一個輸入流中的內(nèi)容拷貝到某個文件。

? ? ??deleteDirectory:刪除目錄。

? ? ??deleteQuietly:刪除文件。

? ? ??listFiles:列出指定目錄下的所有文件。

? ? ??openInputSteam:打開指定文件的輸入流。

? ? ??readFileToString:將文件內(nèi)容作為字符串返回。

? ? ??readLines:將文件內(nèi)容按行返回到一個字符串?dāng)?shù)組中。

? ? ??size:返回文件或目錄的大小。

? ? ??write:將字符串內(nèi)容直接寫到文件中。

? ? ??writeByteArrayToFile:將字節(jié)數(shù)組內(nèi)容寫到文件中。

? ? ??writeLines:將容器中的元素的toString方法返回的內(nèi)容依次寫入文件中。

? ? ??writeStringToFile:將字符串內(nèi)容寫到文件中。

IOUtils

IOUtils類中常用方法

??1. buffer方法:將傳入的流進(jìn)行包裝,變成緩沖流。并可以通過參數(shù)指定緩沖大小。

? ? ??2. closeQueitly方法:關(guān)閉流。

? ? ??3. contentEquals方法:比較兩個流中的內(nèi)容是否一致。

? ? ??4. copy方法:將輸入流中的內(nèi)容拷貝到輸出流中,并可以指定字符編碼。

? ? ??5. copyLarge方法:將輸入流中的內(nèi)容拷貝到輸出流中,適合大于2G內(nèi)容的拷貝。

? ? ??6. lineIterator方法:返回可以迭代每一行內(nèi)容的迭代器。

? ? ??7. read方法:將輸入流中的部分內(nèi)容讀入到字節(jié)數(shù)組中。

? ? ??8. readFully方法:將輸入流中的所有內(nèi)容讀入到字節(jié)數(shù)組中。

? ? ??9. readLine方法:讀入輸入流內(nèi)容中的一行。

? ? ??10. toBufferedInputStream,toBufferedReader:將輸入轉(zhuǎn)為帶緩存的輸入流。

? ? ??11. toByteArray,toCharArray:將輸入流的內(nèi)容轉(zhuǎn)為字節(jié)數(shù)組、字符數(shù)組。

? ? ??12. toString:將輸入流或數(shù)組中的內(nèi)容轉(zhuǎn)化為字符串。

? ? ??13. write方法:向流里面寫入內(nèi)容。

? ? ??14. writeLine方法:向流里面寫入一行內(nèi)容。

代碼練習(xí):



IO流體系總結(jié)


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容