問:流的概念?
在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 IO、Java NIO 詳解(一)、Java NIO 詳解(二)、Java IO教程