瞭解IO(1)-------------【Java基礎】

問:流的概念?

在Java中的流是一種抽象的概念,表示數據的無結構化傳遞;平常說的數據流就是一種數據的傳輸通道。流也是分種類的,而且依據不同,分的數據流也有不同的名稱和區別的;流的結構圖如下圖所示:

 

 

 

問:瞭解它們之間的區別?

答:其實計算機的數據都是以字節保存的,所以對於我們的字符,都需要使用其對應的字節之後再傳入計算機中。因爲計算機的底層設備永遠使用只接受字節數據。字符流是字節流的包裝,字符流則是直接接受字符串,它內部將串轉成字節,再寫入底層設備的;這就是字符流和字節流直接的關係以及區別。

 

 

問:瞭解NIO嗎?

答:瞭解,NIO的英文也就是New I/O;也就是新的IO;所以NIO和傳統的IO是不同的;

因爲它是以塊的方式處理數據,而IO是以最基礎的字節流的形式去寫入和讀出的;所以它們在效率上的話,肯定是NIO比IO效率高出很多。

還有就是NIO不再是和IO一樣用OutputStream和InputStream 輸入流的形式來進行處理數據的,而是基於這種流的形式,採用通道和緩衝區的形式來進行處理數據的。同時NIO的通道是可以雙向的,而IO中的流只能是單向的。

另一個區別就是NIO的緩衝區(其實也就是一個字節數組)是可以進行分片,也就是說可以建立只讀緩衝區、直接緩衝區和間接緩衝區;至於只讀緩衝區很明顯就是字面意思,直接緩衝區是爲加快 I/O 速度,而以一種特殊的方式分配其內存的緩衝區。

嗯,這就是我對NIO的瞭解以及其和傳統IO的區別。

 

 

問:通道和緩衝區有哪些含義?

答:首先我先說下我對通道的瞭解吧!通道其實也就是對原 I/O 包中的流的模擬;它的一個關鍵對象就是Channel;因爲任何數據的讀取都要通過緩衝區再到通道,所以channel對象的作用就是從緩衝區中讀入或取出數據。其實通道和流的不同之處在於通道是雙向的,而流是單向,也就是說一個流必須是 InputStream 或者 OutputStream 的子類;但通道 就不同了,它可以用於讀、寫或者同時用於讀寫。

在前面我提到了數據的讀取需要經過緩衝區纔可以,所以緩衝區的作用也就是緩存數據;但是它的緩存和傳統的IO不同;它使用的是 Buffer 對象(Buffer實質上是一個容器對象),而傳統的I/O中,也僅是將數據直接寫入或者將數據直接讀到Stream對象中。其實也就涉及到緩衝區的本質:數組,通常是字節數組,但還有其他種類的數組;還有就是緩衝區不僅僅只有緩存的作用,它還有提供了對數據的結構化訪問,和對系統讀/寫進程的跟蹤。

下圖是NIO的流程:

è¿éåå¾çæè¿°

 

參考博文:深入分析 Java I/O 的工作機制Java IOJava NIO 詳解(一)Java NIO 詳解(二)Java IO教程

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