(今天又是元氣滿滿的一天,公司大小周上班,不巧的是,今天是小周,so,我現在在辦公室繼續上班,不忙的時候,我給大家更新部落格。)
Java 的 io 可以說是Java中的一個大石頭,很少能有人搬起來,擡走。原因很簡單,這個東西學不好就這樣,一旦涉及到檔案操作,就頭大,我希望大家看完我的這幾篇連載部落格,能夠有所感悟,廢話不多說,開剛!
一、IO
我們先來認識一下IO,什麼是IO
IO,這倆字母需要分看看,I(這是“愛”!不是數字1 也不是L !!!)代表的單詞是input,翻譯過來是輸入,O(這是字母“歐”,不是數字0)代表的單詞是Output,翻譯過來是輸出,這倆字母合起來就是輸入輸出。
知道了什麼是IO,我就可以繼續說Java了,Java中将IO抽象了一下,并且給定義了一個名字,流。
流是一種抽象概念,它代表了資料的無結構化傳遞。按照流的方式進行輸入輸出,資料被當成無結構的位元組序或字元序列。從流中取得資料的操作稱為提取操作,而向流中添加資料的操作稱為插入操作。用來進行輸入輸出操作的流就稱為IO流。換句話說,IO流就是以流的方式進行輸入輸出-------《百度百科-IO流》
大家詳細請看百度百科,這個比較權威。
我自身的了解,流就類似一個通道,資料到了通道口,開始進行轉換,轉換成能進入通道口的樣子,然後順着通道進行流動,然後出來通道的時候,再進行反轉換,轉換回去。
二、輸入流、輸出流
有了流之後,還不行,我們還得劃分,你給我,對于你來說是輸出,對于我來說是輸入。是以人們還給流定義了方向。
當然,上面說的隻是一個比喻,我們實際上可以用計算機來說輸入流輸出流
輸入流:輸入流是相對程式而言的,外部傳入資料給程式需要借助輸入流。就像你從計算機硬碟上讀取檔案,相對于你來說,這是輸入,因為你得到了檔案
輸出流:輸出流是相對程式而言的,程式把資料傳輸到外部需要借助輸出流。這就像你寫了一個word,然後存到硬碟上。這就是輸出。
要好好了解這裡,有點繞,我給大家畫個圖,大家可能更明白。

好吧,我屬實畫不出來,是以從網上摟了一個圖得了
三、位元組流 字元流
說完流動方向之後,然後就是流動的内容了。
在說這個之前,我們先來說一下位元組和字元這兩個東西
位元組:Byte
字元:Character
一個位元組 等于 8bit(bit是存儲資訊的最小機關)
一個字元 等于 2個位元組 等于 16個bit
這麼看說明 一個字元 要比 一位元組大 兩倍,知道了這個我們繼續看
Java将檔案進行解析,拆分,按照拆分的情況,一個拆到位元組就不往下拆分了,一個拆到字元就也不拆分了。
是以,Java還按照這兩種拆分情況,将流劃分成兩種一個是位元組流,一個是字元流。
以上都為你記憶位元組流和字元流不同,我用另外的一個思想和你說的,但實際情況如下:
原本其實沒有字元流,隻有位元組流,主要是用在處理二進制資料,而它處理是按照位元組來進行處理的。
但是實際上來說,我們一般用到的資料都是文本,這才提出字元流的概念,這個是使用Unicode編碼,位元組流是采用的ASCll編碼。
加粗的一定要記住!!!!
四、位元組流和字元流的差別
差別1:他倆基本機關不一樣,一個大一個小,看上面就知道
差別2:位元組和字元 這倆流處理的對象不同,字元主要是處理文本,位元組是啥都行。
差別3:(我們後面會講)字元流按照字元進行讀取資料,一次讀取兩個位元組,傳回了這兩個位元組所對應的int類型的值(其實這個值就是編碼)。寫入檔案時把這兩個位元組的内容解碼成這個字元在Unicode碼下對應的二進制資料寫入。也就是說,讀取的時候,按照字元形式讀取出來二進制資料,然後,再以二進制寫入。咋進咋出。
位元組流和字元流類似,但是人家是按照一個一個位元組進行讀取,咋讀咋寫。
擴充:你要是用字元流去讀取圖檔,然後再用字元流去存,我和你說,要是能打開存好的圖檔,我吃屎!(原因:人家圖檔是按照位元組去存儲的,你用字元流形式先讀再存,最後能看才有了鬼,讀就讀錯了)
差別4:看圖說話
圖
好吧,沒有圖,我就用嘴說,字元流中用了緩沖,而位元組流并沒有使用緩沖,問題來了,用緩沖好呢,還是不用緩沖好呢?
答案在後幾篇部落格中,自己去翻着看吧。
五、IO流大家族
是的,你沒有看錯啊,很多。。。
我是一下子記不住那麼多,我隻記住一些常用的,不常用的需要現查
大家可以打開Overview (Java Platform SE 8 ) Java Api 開發文檔,一邊看一邊熟悉,可以自己找個本子,紙張畫一下繼承啊啥的結構。
下一節内容,先來學習一下位元組流!我們先學位元組流,字元流排在位元組流後面說