天天看點

【Java基礎】IO流總結

一、流的概念:

       Java的IO流是實作輸入/輸出的基礎,它可以友善地實作資料的輸入/輸出操作,在java中把不同的輸入/輸出源(鍵盤、檔案、網絡連接配接等)抽象表述為“流”(stream)。通過流的方式允許Java程式使用相同的方式來通路不同的輸入/輸出源。stream是從起源(source)到接收(sink)的有序資料。

       Java把所有傳統的流類型(類或抽象類)都放在java.io包中,用以實作輸入/輸出功能。

二、流的分類:

       1、輸入流和輸出流:

       按照流的流向來分,可以分為輸入流和輸出流:(輸入、輸出都是從程式運作所在記憶體的角度來劃分的)

              (1)輸入流:隻能從中讀取資料,而不能向其寫入資料。

    (2)輸出流:隻能向其寫入資料,而不能從中讀取資料。

       2、位元組流和字元流:

       位元組流和字元流的用法幾乎完全一樣,差別在于位元組流和字元流所操作的資料單元不同--位元組流操作的資料單元是8位位元組,而字元流操作的資料單元是16位的字元。

       3、節點流和處理流:

       按照流的角色來分,可以分為節點流和處理流:

  (1)節點流:

  可以從/從一個特定的IO裝置(如磁盤、網絡)讀/寫資料的流,稱為節點流,節點流也被稱為低級流(Low Level Stream)。

  下圖顯示了節點流示意圖:

    

【Java基礎】IO流總結

       從上圖可以看出,當使用節點流進行輸入/輸出時,程式直接連接配接到實際的資料源,和時間的輸入/輸出節點連接配接。

       (2)處理流:

       處理流則用于對一個已存在的流進行連接配接或封裝,通過封裝後的流來實作資料讀/寫功能,處理流也被稱為進階流。

  下圖顯示了處理流示意圖:

      

【Java基礎】IO流總結

  從上圖可以看出,當使用處理流進行輸入/輸出時,程式并不會直接連接配接到實際的資料源,沒有和實際的輸入/輸出節點連接配接。使用處理流的一個明顯好處是,隻要使用相同的處理流,程式就可以采用完全相同的輸入/輸出代碼來通路不同的資料源,随着處理流所包裝節點流的變化,程式實際所通路的資料源也相應的發生變化。

       處理流的功能主要展現在以下兩個方面:

       a.性能的提高:主要以增加緩沖的方式來提高輸入/輸出的效率。

       b.操作的便捷:處理流可能提供了一系列便捷的方法來一次輸入/輸出大批量的内容,而不是輸入/輸出一個或多個“水滴”。

三、IO流的體系

       Java的IO流共涉及40多個類,都是從如下4個抽象基類派生的。

       1、InputStream/Reader:所有輸入流的基類,前者是位元組輸入流,後者是字元輸入流。

       2、OutputStream/Writer:所有輸出流的基類,前者是位元組輸出流,後者是字元輸出流。

【Java基礎】IO流總結

四、字元流和位元組流有什麼差別?

       位元組流讀取的時候,讀到一個位元組就傳回一個位元組; 字元流使用了位元組流讀到一個或多個位元組(中文對應的位元組數是兩個,在 UTF-8 碼表中是 3 個位元組)時。先去查指定的編碼表,将查到的字元傳回。 位元組流可以處理所有類型資料,如:圖檔, MP3, AVI 視訊檔案,而字元流隻能處理字元資料。隻要是處理純文字資料,就要優先考慮使用字元流,除此之外都用位元組流。 位元組流主要是操作 byte 類型資料,以 byte 數組為準,主要操作類就是 OutputStream、InputStream。

       字元流處理的單元為 2 個位元組的 Unicode 字元,分别操作字元、字元數組或字元串,而位元組流處理單元為 1 個位元組,操作位元組和位元組數組。是以字元流是由 Java 虛拟機将位元組轉化為 2 個位元組的 Unicode 字元為機關的字元而成的,是以它對多國語言支援性比較好!如果是音頻檔案、圖檔、歌曲,就用位元組流好點,如果是關系到中文(文本)的,用字元流好點。在程式中一個字元等于兩個位元組, java 提供了 Reader、 Writer 兩個專門操作字元流的類。

       規則:如果進行輸入/輸出的内容是文本内容,則應該考慮使用字元流;如果進行輸入/輸出的内容是二進制内容,則應該考慮使用位元組流。

五、什麼是 java 序列化,如何實作 java 序列化?

       1、概念:

         序列化:将一個Java對象寫入IO流中。

         反序列化:從IO流中恢複該Java對象的過程。

       2、用途:

              對象的序列化主要有兩種用途:

              (1)把對象的位元組序列永久地儲存到硬碟上,通常存放在一個檔案中;

              (2)在網絡上傳送對象的位元組序列。

       序列化就是一種用來處理對象流的機制,所謂對象流也就是将對象的内容進行流化。可以對流化後的對象進行讀寫操作,也可将流化後的對象傳輸于網絡之間。序列化是為了解決在對對象流進行讀寫操作時所引發的問題。

       注解:當兩個程序在進行遠端通信時,彼此可以發送各種類型的資料。無論是何種類型的資料,都會以二進制序列的形式在網絡上傳送。發送方需要把這個Java對象轉換為位元組序列,才能在網絡上傳送;接收方則需要把位元組序列再恢複為Java對象。

       3、序 列 化 的 實 現 :

       使用Serializable來實作序列化非常簡單,主要讓目标類實作Serializable标記接口即可,無須實作任何方法。一旦某個類實作了Serializable接口,該類的對象就是可序列化的,程式可以通過如下兩個步驟來序列化該對象。

       (1)建立一個ObjectOutputStream,這個輸出流是一個處理流,是以必須建立在其他節點流的基礎之上。如下代碼所示:

//建立個 ObjectOutputStream 輸出流
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("object.txt"));
           

       (2)調用ObjectOutputStream對象的writeObject()方法輸出可序列化對象,如下代碼所示:

//将一個Person對象輸出到輸入流中
oos.writeObject(per);
           

       相關連結: https://www.cnblogs.com/yangchunze/p/6728086.html

六、NIO和IO的不同:

       1、概念:NIO即 New IO,是在JDK1.4中才引入的。如果說傳統的輸入/輸出系統是面向流的處理,則新IO則是面向塊的處理。NIO的效率要比IO高很多。

       2、主要不同:

【Java基礎】IO流總結

       參考連結:https://www.cnblogs.com/aspirant/p/8630283.html

七、5種IO模型

       五種IO模型包括:阻塞IO、非阻塞IO、IO多路複用、信号驅動IO、異步IO。其中,前四個被稱為同步IO。

       參考連結:https://segmentfault.com/a/1190000003063859

                         https://blog.csdn.net/ZWE7616175/article/details/80591587