Java操作字符流與字節流

前言:這幾天在做一些文件的解壓加密上傳工作,經常用到Java操作字符流與字節流,所以總結一下,也是在慕課網上學習 一站式學習Java網絡編程 全面理解BIO/NIO/AIO 第三章1,2節做的筆記

目錄

第一章 前言

第二章 java.io 之字符流

第三章 java.io 之字節流

第四章 java.io裏的裝飾器模式


第一章 前言

網絡編程的本質是進程之間的通信,比如說在客戶端有一個瀏覽器的應用進程,我們如果想要從服務器端接收不同的網頁、文件,我們就需要向服務器發送我們的請求,服務器端收到我們的請求進行處理,然後把我們請求的對應的數據發送給客戶端,所以網絡上進行的活動就是客戶端和服務器端兩個進程之間進行的數據交換,也就是數據通信。

通信的基礎是IO模型,假設我們有一個數據源,然後我們要把數據輸入到我們的應用進程裏,那麼從應用的角度來說,這一串就是輸入流,反之則是輸出流。

數據源可以是多種多樣的,如文件、對象(Java中實現了Serializable接口的對象可以被序列化,就可以像字節流一樣傳輸)、字符串等,

java.io提供了各種的工具可以操作輸入輸出流,是一個大家族,java.io包裏的類處理的流分爲兩種字節流與字符流,字節流處理的是字節,字節就是有8位的bit,字符流處理的是字符,一般一個字符由兩三個字節組成,直接處理字符的話就省去了我們將讀取到的字節轉換成字符的過程,字符流幫我們做了轉換,讓我們可以更輕鬆地處理字符。下面的四個類分別是處理字符、字節流的抽象類,java.io中有很多子類實現了它們。

 

第二章 java.io 之字符流

第一個CharArrayReader表明我們的應用是從一個字符數組裏不斷地讀取數據流,StringReader是從字符串中不斷地讀取內容。當我們創建CharArrayReader與StringReader要把數據源傳入。

同理,CharArrayWriter是輸出到字符數組,StringWriter是輸出到字符串中。

可以看到,我們不需要做字符字節之間的轉換,這是字符流帶給我們的便利,

除了這些簡單的類,java.io中還有一些更復雜的子類.

複雜在哪裏呢?比如下圖三個reader,bufferedReader,FilterReader,InputStreamReader,這些Reader你在創建它們的時候,都需要在額外的傳入一個reader纔可以,也就是說,這三個reader的類,它們並不是自己獨立生存的,它們好似是疊加在別的reader之上一起來作用的,即這三個reader在我們剛說的幾個基本的類型reader之上,再提供了一些額外的功能,比如說BufferedReader它提供的額外的功能就是在額外的提供一個緩衝區,如果沒有這個緩衝區,我們的應用進程每次要從原始的數據源裏進行讀取的操作,但是有時對原始的數據源進行頻繁的讀寫操作是非常昂貴的操作,會消耗掉比較多的系統資源或者速度就比較慢,這時一個效率比較高的方法是給reader增加一個緩衝區,那麼我們就可以從原始的數據源裏多讀一些數據,然後先放在我們的緩衝區裏,我們的應用進程可以頻繁的從緩衝區裏進行讀寫,而不需要在原始的數據源裏進行操作,緩衝區一般是在內存,所以效率會比較高(這句話好像有點問題,我又搜了一下)。

爲什麼使用緩衝效率高:https://blog.csdn.net/lsfor365/article/details/87005569

FilterReader在原有的reader之上可以增加一些額外的操作,比如說跳過字符流中的一些特定的字符不去處理,也可以在字符流中標記一些位置,然後讀着讀着跳回到之前的位置重新讀。

剛纔說過,處理字符流的叫做reader,處理字節流的叫做Inputstream,InputStreamReader是連接兩種流的橋樑,它是把字節流轉換成字符流類似這樣的數據流,所以其比較常用的子類FileReader,因爲對於一個File來講,文件本身存儲的最原始的基本數據就是一個字節一個字節,可是當我們讀取文件內容的時候,我們不想再自己花時間實現字節到字符的轉換,所以對於一個FileReader來講,它從系統中讀取的就是硬盤中的字節數據,我們想把讀到的字節流轉換成字符流,所以FileReaderader要繼承將字節轉換成字符的Reader。

對應的也有3中writer,具體與reader類似,創建此writer時也要傳入基本的writer,作用與reader相反。

 

第三章 java.io 之字節流

字節流分爲輸入、輸出字節流,最基本的字節流對於輸入來講就是ByteArrayInputStream和FileInputStream,在這裏是從字節數組與文件中讀數據,如果我們只是想把字節讀取過來,用FileInputStream就可以了,就不需要之前的FileReader了。

對應的也有兩種輸出字節流,可以向字節數組和文件中輸出內容。

 同樣,字節流也有更復雜一些的字節流操作類。

FilterInputstream、FilterOutputstream與FilterReader、FilterWriter比較類似,它們也都是抽象類,創建它們時也都需要傳入另外的字節流,它們可以在傳入的字節流之上再添加一些額外的功能。

BufferedInputStream又和之前字符流中的BufferedReader非常像,都是在基本的InputStream上再爲它添加一個緩衝區,這樣減少對原本數據源低效率的操作,然而把操作轉換到應用進程和緩衝區之間頻繁的操作,從緩衝區裏讀效率更高。

DataInputStream與DataOutputStream配置使用,比如Java中一些基本的數據類型,int,double,long,char等等,可使用DataOutputStream來把這些基本類型變量輸出出去,當DataOutputStream把這些基本類型寫到輸出流之後,對應的可以使用DataInputStream從輸出的數據流中再把它們讀進來,讀進來的時候可以把它們直接轉換成Java中的基本數據類型,也就是說DataInputStream解決了字節到基本類型的轉換,比如說要讀取char,DataInputStream就會從字節流中讀取兩個2個字節幫你轉換成char。

 

第四章 java.io裏的裝飾器模式

前面基本上捋了一下java.io包裏比較常見的處理io流的類,我們在講解一些稍微高級些的流處理的類,比如說FilterReader、FilterInputStream,還有BufferedReader和BufferdInputStream時都說過,在創建這樣的類時,它們不是獨立存在的,而是在創建的時候要傳入另外一個比較基本的,另外一個輸入輸出流的類,讓它們在傳入的類之上再額外添加一點功能,這種設計模式叫做裝飾器模式。

如bufferedInputStream,在創建它時,可以看它的構造函數,你會看到它要求你再傳入一個另外的InputStream,也就是說它可以爲各種其他的繼承了inputStream的類來提供這樣的一個緩衝區,比如說可以傳入FileInputStream,它是InputStream的子類,這樣我們創建出的bufferedInputStream仍然是InputStream抽象類的一個子類,它有FileInputStream的所欲功能,還能使用緩衝區。

同樣,也不只是裝飾一種功能就結束了,我們裝飾了緩衝區功能,還可以再裝飾別的功能。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章