IO流

 一 . 

InputStream 和 OutPutStream 是最基本的兩個最基本的輸入輸出流 其他所有的字節輸入輸出流都是他們的子類。他倆都是抽象類不能夠實例對象。
Reader Writer 是兩個最基本的 字符輸入輸出流 , 他們兩個都是抽象類不能夠實例對象。
二 .
對于輸入輸出流做處理的時候可以單一字節或者單一字符進行處理,也可以選擇 用一個緩沖區做處理。

字節處理的時候需要 byte[] cache=new byte[1024]
字符處理的時候需要 char [] cache=new char[1024]
三 .
當我們對于輸出流以及輸入流做關閉的時候 我們可以選擇使用輸出流 flush()操作代替 關閉流。

當我們需要做涉及到文件的復制粘貼 無論什么文件除了字符文件應該都要使用字節流
切記不要使用字符流處理,文件 ,音頻,視頻以及其他類型的文件

FileOutputStream(File file, boolean append)
在文件追加的問題 當我們構造對象的時候可以將第二個參數置位true 這時候可以在文件后面追加字節或者字符了。
六 :
BufferedInputStream BufferedOutputStream 這兩個對象在初始化的時候需要在構造函數里面加入輸入輸出流 這些內存的緩存流里面加入了緩存的數組 字節的是 81024 字符的32個字符
所以我們在操作的時候可以省略自定義 緩存流的操作 如果我們自定義加入了緩存流的話 這樣可以更加加快了轉換的速度 。
當我們加入了 內存緩存流的時候 我們在關閉流的時候可以直接通過**********(輸出)
**緩存流直接進行強制刷新的操作flush()
這樣的話可以省去 自己關閉輸入輸出流的操作。

BufferedReader 和 BufferedWriter 是對于字符操作的緩存流使用方式和上面一樣。
BufferedReader 里面的方法 readLine //處理數據 如果已到達流末尾,則返回 null
BufferedWriter 里面的方法 write(String s)可以直接寫入字符串
BufferedWriter 里面的方法 newLine 直接在文件里面寫入換行的操作。

BufferedInputStream

BufferedOutputStream

ByteArrayInputStream

ByteArrayOutputStream

轉換流 : 只能是字節轉換成字符

InputStreamReader

OutputStreamWriter

鍵盤錄入就是轉換流的一個實例應用:
Reader reader=new InputStreamReader(System.in);
BufferedReader bufferedReader=new BufferedReader(reader);

標準的輸出流 System.out --->PrintStream
(1)作用:在控制臺輸出各種類型的數據
(2)把System.out.println()把輸出結果放到文件里,不要在控制臺輸出
自己實例化PrintStream new PrintStream(new File(""));

*************println()方法和 write()的方法的比較
ps.write(100); write的方法只有三個 所以此處輸出的是100的阿斯可碼 所以此處輸出的是 d
ps.println(100) 此處輸出的是 100

數據流

  • DataInputStream DataOutputStream
  • 里面提供了存儲java基本數類型 :四類八種 和 String
  • 處理流 只針對字節流(二進制文件)
    當我們學習了 對象輸出流之后就會發現 數據輸入輸出流就會被對象輸入輸出流代替了。
    數據流的輸入輸出是相互對應的 所以 我們 在read的讀取順序應該按照write時候存儲的順序

7、對象的序列化(serialization)**
(1)何為對象的序列化?
把對象保存到文件里--->對象的序列化
(2)何為反序列化?
把文件里的數據讀取出來形成對象--->反序列化
(3)作用:
a、永久保存數據(持久化)
b、可以在網絡之間傳輸數據
(4)如何實現?
a、ObjectOutputStream:對象輸出流
分類:字節流 輸出流 處理流
作用:把對象序列化到文件里
b、構造方法
new ObjectOutputStream(OuputStream out)
c、方法:
writeObject():把對象寫到文件里
(5)注意:
a、要序列化的對象--》類一定要實現Serializable接口
Serializable接口僅僅只是一中標識,表示這個類的對象
可以被序列化的
否則異常:java.io.NotSerializableException:
b、類里的屬性必須要全部可序列化(包含其他類)
c、對于瞬態屬性(transient)不能被序列化的
d、靜態的屬性也是不能被序列化的(內存存儲只有一份)
e、serialVersionUID 5832446596546430553
-1633153781288661891
作用:在反序列化時,檢測文件里的類的信息和現在類的信息是不是
一致;如果不一致,就異常
一般:自己生成版本號,不要讓系統自動生成

    當我們存多個序列化的對象的時候 需要我們先往對象流里面存入序列化對象的總個數 ,這樣方便了我們反序列化的
    時候可以正確的取出對象的個數。 
(6)反序列化
    a、ObjectInputStream:對象輸入流
    b、分類:輸入流   字節流   處理流
    c、構造方法:
        new ObjectInputStream(InputStream in)
    d、方法
        readObject():讀取對象 (強轉)

序列化 :
當我們需要不序列話的對象屬性的是時候 可以把屬性改成靜態的。這樣在 序列化和反序列化的時候 輸出對象屬性為 null
比如在 對象屬性在 聲明的時候 把屬性 設置成 static 和
Transient
當變量是用static 修飾 并且給附初始值的時候 當我們反序列的時候可以看到 此屬性賦予了相應的值。
當屬性 使用了Transient 修飾的時候 當我們設置值 并且 序列化和反序列 并沒有同時進行的時候 就不可以觀察到反序列化的值
當反序列和序列化同時操作的時候可以在短暫的觀察到此對象的屬性值。
下面的代碼可以準確的展示出 static 修飾的變量的作用:


   public static void main(String args[]) throws FileNotFoundException, IOException, ClassNotFoundException {
        User user = new User();
        user.setAge("22");
        user.setName("小明");
        user.setPassword("admin");
        System.out.println(user.getAge()+"\t"+user.getName()+"\t"+user.getPassword());
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("d:/user.txt"));
        oos.writeObject(user);
        user.setAge("33"); //在序列化后在對static修飾的變量進行一次賦值操作
       
        oos.flush();
        oos.close();
        
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d:/user.txt"));
        User users = (User) ois.readObject();
        
        System.out.println(users.getAge()+"\t"+users.getName()+"\t"+users.getPassword());
        
    }

在讀源碼的時候看到了一個 transient 修飾的變量 ,字面意思是瞬變的。在以前的開發過程中也沒用到過這個修飾語,查了一下這個修飾語的作用為使被 transient 修飾的變量在序列化的時候不會被
保存到文件中,也就是通過序列化后再被反序列化后讀取這個變量不會有值

被static修飾的變量應該也是不會被序列化的,因為只有堆內存會被序列化.所以靜態變量會天生不會被序列化。
那這里被static修飾的變量反序列化后有值又是什么鬼 這是因為 靜態變量在方法區,本來流里面就沒有寫入靜態變量,我們打印靜態變量當然會去方法區查找,我們當前 jvm 中有所以靜態變量在序列化后任然有值。 由此可以看出 static 修飾的變量本身是不會被序列化的
我們讀取的值是當前jvm中的方法區對應此變量的值

image.png
image.png
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,362評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,577評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,486評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,852評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,600評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,944評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,944評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,108評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,652評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,385評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,616評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,111評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,798評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,205評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,537評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,334評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,570評論 2 379

推薦閱讀更多精彩內容