對象流:
ObjectInputStream/ObjectOutputStream:對象流,用于将對象的屬性資訊儲存到磁盤上,和将磁盤裡儲存的對象讀取到程式上。
示意圖:
<a href="https://s1.51cto.com/oss/201710/27/cd29c7dc38d85272928f2109987116d3.png" target="_blank"></a>
對象也不是能直接通過對象流儲存到磁盤上的,如果要儲存的那個對象沒有實作Serializable接口是儲存不了的,會抛出異常。
代碼示例:
<a href="https://s4.51cto.com/oss/201710/27/46ce788ee9c8f8649465df1db154f615.png" target="_blank"></a>
<a href="https://s1.51cto.com/oss/201710/27/c4382d19f8f14065cd056bf024458d56.png" target="_blank"></a>
運作結果:
<a href="https://s1.51cto.com/oss/201710/27/0901cbc009ccf260bdb50a4c8a0ea729.png" target="_blank"></a>
沒有實作Serializable接口是會抛NotSerializableException異常的。
實作接口後:
<a href="https://s2.51cto.com/oss/201710/27/c492a8b5cbfc361cda63b813c7bcae03.png" target="_blank"></a>
<a href="https://s5.51cto.com/oss/201710/27/2b8aa7e6d9bee3a463e94b96ac9b3c0d.png" target="_blank"></a>
<a href="https://s5.51cto.com/oss/201710/27/07cb4f04413e01dc9fc35d25e457d056.png" target="_blank"></a>
這個接口的内部什麼都沒有的,就是一個空接口,但是為什麼要實作這麼一個接口呢,是因為這相當于一個身份的象征,隻有實作了這個接口,java虛拟機看到這個對象有這個“身份标記”才能将它的屬性儲存到磁盤上去。為什麼不實作這個接口就不能儲存呢?這是因為有些對象屬性資訊儲存着一些比較重要的資料,如果輕易儲存到磁盤上就會有一定的風險,是以沒有實作這個接口的所有對象是無法被儲存的。
除了這個需要實作這個接口外還有一個問題,如果我把對象的某個屬性删除了或增加某個屬性,那麼将這個對象讀取出來就會發生異常。
<a href="https://s2.51cto.com/oss/201710/27/e03d4bc63145b6f08d5cfde10452a39d.png" target="_blank"></a>
<a href="https://s1.51cto.com/oss/201710/27/fb6274468cf5a8fc714a86510a3b9c05.png" target="_blank"></a>
<a href="https://s3.51cto.com/oss/201710/27/05d53e567a0543a7f44ab0d900627d60.png" target="_blank"></a>
會發生這個異常的原因是類的版本号不同,每個類編譯時都有自己的版本号,對這個類進行更改了,這個類的版本号就會改變。
那麼解決這個問題的方法就是:自行設定一個唯一的版本号,這玩意就像構造器一樣,你寫了虛拟機就不會給你自動加了,是以需要自行設定一個唯一的版本号。
<a href="https://s4.51cto.com/oss/201710/27/42b98e3edce54e0d4f7a9125c54d894a.png" target="_blank"></a>
版本号的數字可以自己任意設定。隻要不超出long類型的容量即可。
設定完版本号後,我們再進行實驗一下,把對象的某個屬性删除了或增加某個屬性,看看是否還會抛出異常。
<a href="https://s5.51cto.com/oss/201710/27/92b6907e79bc463ce2caa765262cb0c6.png" target="_blank"></a>
<a href="https://s4.51cto.com/oss/201710/27/62878de6bb68c5457b984a7c45f7b726.png" target="_blank"></a>
<a href="https://s4.51cto.com/oss/201710/27/c2afbf7878d2b4c8ae31f9752b1d0552.png" target="_blank"></a>
能夠正常運作,不會報錯。
如果想要對象的某個屬性不被存儲到硬碟上的時候,就需要用到transient無需序列化關鍵字。在儲存對象的時候加上這個關鍵字的屬性就不會被儲存。
<a href="https://s2.51cto.com/oss/201710/27/c69f901dd8862860090735eb01150eb3.png" target="_blank"></a>
<a href="https://s3.51cto.com/oss/201710/27/c152f7633a0c24040d74e622be828517.png" target="_blank"></a>
<a href="https://s5.51cto.com/oss/201710/27/480b255ff1b64a964721b5dfddede431.png" target="_blank"></a>
從運作結果可以看出,加上這個關鍵字的屬性值就會為null(基本類型值則會為0),表示沒有儲存。
利用對象流可以一個記憶視窗坐标位置的功能,能讓視窗程式每次打開都在上一次關閉的位置。
代碼示例:
先寫好一個具有四個屬性分别用于記錄視窗的X,Y,Width,Height坐标的值。并且在構造器聲明四個參數,用于傳遞視窗的X,Y,Width,Height坐标值:
<a href="https://s3.51cto.com/oss/201710/27/e16065f92ddfb3a55c8485781e1cff28.png" target="_blank"></a>
<a href="https://s4.51cto.com/oss/201710/27/1a92447681547b3655631d30bfdb7d97.png" target="_blank"></a>
<a href="https://s4.51cto.com/oss/201710/27/0a07eb18a9706d514ac32c3349b73eae.png" target="_blank"></a>
在對象流中要注意的是對象是無法追加輸出的,是以不要追加輸出。多個對象則可以一起一次性輸出,但是同一個對象則無法輸出兩次。
基本資料類型流:
DataInputStream/DataOutputStream:基本資料類型流,用于将基本資料類型的值存儲到磁盤中,選擇輸出的資料類型是多少個位元組的,那麼輸出最少就會占用多少個位元組。例如int是占用四個位元組,那麼在輸出的時候占用的也是四個位元組,其他類型則以此類推。這個流平時并不常用,一般都是專門處理資料方面的人員才會用得上。
<a href="https://s5.51cto.com/oss/201710/27/f43464c61af40f1034c96fa232824a08.png" target="_blank"></a>
<a href="https://s4.51cto.com/oss/201710/27/55bd60a94f6391cde41b67b7b69ae06c.png" target="_blank"></a>
加密解密流:
下面介紹最簡單的加密方式,如果想要做複雜的加密方式可以自己編寫一個加解密算法,但是在公司開發中除非你是專業人員,不然是不需要自行對程式去做加解密的,這些都是由專業的加解密人員去完成,是以對這方面知道個簡單原理就可以了。
先編寫兩個流,一個加密流,和一個解密流。利用裝飾設計模式去編寫:
加密流:
<a href="https://s5.51cto.com/oss/201710/27/b1aaa50bd71d23c391e8d47a95dc312a.png" target="_blank"></a>
解密流:
<a href="https://s2.51cto.com/oss/201710/27/f7446fcddfdafc690a798a5cddc7fa0c.png" target="_blank"></a>
測試類:
<a href="https://s3.51cto.com/oss/201710/27/cdde22ad138fbd256bd680fb9896de8e.png" target="_blank"></a>
加密後的檔案内容:
<a href="https://s3.51cto.com/oss/201710/27/6c9bf24438eedc14215f9c6726c61322.png" target="_blank"></a>
解密後讀取列印出來的内容:
<a href="https://s3.51cto.com/oss/201710/27/621e2100469631dc79e8af97473fec36.png" target="_blank"></a>
本文轉自 ZeroOne01 51CTO部落格,原文連結:http://blog.51cto.com/zero01/1976625,如需轉載請自行聯系原作者