1. 程式人生 > >Java基礎知識(JAVA之IO流)

Java基礎知識(JAVA之IO流)

恢復 資源 rip 字節流 輸出 希望 str amr 對象序列化

學習Java IO,不得不提到的就是JavaIO流。

流是一組有順序的,有起點和終點的字節集合,是對數據傳輸的總稱或抽象。即數據在兩設備間的傳輸稱為流,流的本質是數據傳輸,根據數據傳輸特性將流抽象為各種類,方便更直觀的進行數據操作。

IO流的分類

根據處理數據類型的不同分為:字符流和字節流

根據數據流向不同分為:輸入流和輸出流

Java流操作有關的類或接口:

技術分享圖片

字符流和字節流

字符流的由來: 因為數據編碼的不同,而有了對字符進行高效操作的流對象。本質其實就是基於字節流讀取時,去查了指定的碼表。字節流和字符流的區別:

(1)讀寫單位不同:字節流以字節(8bit)為單位,字符流以字符為單位,根據碼表映射字符,一次可能讀多個字節。

(2)處理對象不同:字節流能處理所有類型的數據(如圖片、avi等),而字符流只能處理字符類型的數據。

(3)字節流在操作的時候本身是不會用到緩沖區的,是文件本身的直接操作的;而字符流在操作的時候下後是會用到緩沖區的,是通過緩沖區來操作文件,我們將在下面驗證這一點。

結論:優先選用字節流。首先因為硬盤上的所有文件都是以字節的形式進行傳輸或者保存的,包括圖片等內容。但是字符只是在內存中才會形成的,所以在開發中,字節流使用廣泛。

輸入流和輸出流

對輸入流只能進行讀操作,對輸出流只能進行寫操作,程序中需要根據待傳輸數據的不同特性而使用不同的流。

1.緩沖流

緩沖字節流
BufferedInputStream

BufferedOutputStream
緩沖字符流
BufferedReader
BufferedWriter
處理流內部包含了節點流,節點流決定了與其溝通的外部設備,而處理流則增加了其功能。
緩沖流的好處:
緩沖流內部包含一個緩沖區域,默認8kb,每一次程序調用read方法其實都是從緩沖區域當中讀取內容,如果讀取失敗
就說明緩沖區域當中沒有內容,那麽就從數據源當中讀取內容,然後會盡可能讀取更多的字節放入到緩沖區域當中,
最後緩沖區域當中的內容,會全部返回給程序。
從緩沖區讀取數據會比直接從數據源讀取數據的速度快,效率也更高,性能更好。
簡單說:
沒有緩存區,那麽每read一次,就會發送一次IO操作;有緩存區,第一次read時,會一下讀取x個字節放入緩存區,
然後後續的read都會從緩存中讀取,當read到緩存區末尾時,會再次讀取x個字節放入緩存區。
處理流處理數據和節點流處理數據的方法基本上完全相同。
2,轉換流:

轉換流作用:把字節流轉換成字符流,可以解決出現的因為編碼集和解碼集造成的亂碼問題。
* InputStreamReader:
* OutputStreamWriter:
* 編碼:字符—–編碼字符集——–》二進制
* 解碼:二進制—解碼字符集———》字符
* 在處理文件時,如果文件的字符格式和編譯器處理格式不一樣時,會出現亂碼問題。比如文件字符格式GBK,
* 而編譯器是UTF-8格式,那麽就會產生該問題。
*
* 出現亂碼問題的原因:
* 1.編碼和解碼字符集不一致造成了亂碼
* 2.字節的缺失,長度的丟失
*
* 大部分情況下,出現亂碼問題是因為中國漢字,因為中國漢字在不同的字符編碼當中占據的字節數不相同,但是都占據多個字節。
* 而英文字母沒有這個問題,因為英文字母在所有的字符編碼當中都占據一個字節。
InputStreamReader :轉換輸入流–》將字節輸入流轉換成字符輸入流
作用:為了防止文件使用字符輸入流處理時出現亂碼問題。

節點流:

字節數組流(內存流)
ByteArrayInputStream
ByteArrayOutputStream
因為內存輸出流當中又新增的方法,不能使用多態,不能夠讓父類的引用指向之類的對象。
作用:可以在循環當中把所有的數據存放到統一的容器當中,然後在循環結束之後可以把容器當中所有的內容一起取出來。
註意事項:
內存流屬於內存當中的資源,所以數據量不要過大,如果太大,會造成內存溢出的錯誤。

數據處理流:

DataOutputStream
DataInputStream
特點: 既能夠保存數據本身,又能夠保存數據類型(基本數據類型+String)

序列化流:

將對象轉換成字節序列的過程,就是對象序列化過程。
* 將字節序列恢復為對象的過程稱之為對象的反序列化。
*
* 作用:保留對象(引用數據類型數據的)類型+數據。
*
* 序列化流 :輸出流 ObjectOutputStream writeObject()
* 反序列化流: 輸入流 ObjectInputStream readObject()
*
* 註意事項:
* 1。先序列化然後在反序列化,而且反序列化的順序必須和序列化的順序保持一致。
* 2.並不是所有的對象都能夠被序列化。只有實現了Serializable接口的類的對象才能夠被序列化。
* 對象當中並不是所有的屬性都能夠被序列化。
*
* 對象序列化的主要用途:
* 1.把對象轉換成字節序列,保存到硬盤當中,持久化存儲,通常保存為文件。
* 2.在網絡上傳遞的是對象的字節序列
*
* 對象序列化的步驟:
* 1.創建對象輸出流,在構造方法當中可以包含其他輸出節點流,如文件輸出流。
* 2.把對象通過writeObject的方式寫入。
*
* 對象反序列化的步驟:
* 1.創建對象輸入流,在構造方法當中可以包含其他的輸入節點流,如文件輸入流
* 2.通過readObject()方法讀取對象。

serialVersionUID :序列化版本id
* 作用:從字面角度看,就是序列化版本號。凡是實現了Serializable接口的類,
* 都會有一個默認的靜態的序列化標識。
*
* 1.類在不同的版本之間,可以解決序列化兼容問題,如果之前版本當中在文件中保存對象,
* 那麽版本升級後,如果序列化id一致,我們可以認為文件中的對象依然是此類的對象。
*
* 2.如果類在不同的版本之間不希望兼容,但是還希望類的對象能夠序列,那麽就在不同版本中
* 使用不同的序列化id。
*
* transient :當類中有屬性不想被序列化,那麽就使用這個修飾符修飾。


---------------------
作者:yangm_1111
來源:CSDN
原文:https://blog.csdn.net/eternal1d/article/details/77189482
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

Java基礎知識(JAVA之IO流)