1. 程式人生 > >Java IO 總結

Java IO 總結

IO的分類

BIO(Blocking I/O):同步阻塞IO

以電腦為中心,InputStream(Reader)就是將外部資料以流的形式載入到電腦的記憶體中,OutputStream(Writer)就是把記憶體中的資料以流的形式向外輸出。

位元組流:以xxStream命名,一般成對出現,如InputStreamOutputStream

常見的位元組流:

  • 檔案流:FileInputStream,FileOutputStream –用於處理檔案
  • 過濾流:FilterInputStream,FilterOutputStream –套在InputStreamOutputStream
    外層,提供一些方便的功能
    • BufferedInputStream,BufferedOutputStream –提供緩衝區功能,提升效率
    • 其他:DataInputStream,DataOutputStream,PrintStream,PushbackInputStream
  • 位元組陣列流:ByteArrayInputStream,ByteArrayOutputStream –將資料寫入內部資料,陣列大小隨著資料寫入而動態擴充套件
  • 管道流:PipedInputStream,PipedOutputStream –用於多執行緒間管道通訊
  • 物件流:ObjectInputStream,ObjectOutputStream
    –用於物件和流之間轉換

字元流:以xxReader(xxWriter)命名,功能型別同上

  • BufferedReader,BufferedWriter
  • CharArrayReader,CharArrayWriter
  • PipedReader,PipedWriter
  • PushbackReader,PrintWriter
  • StringReader,StringWriter
  • InputStreamReader,OutputStreamWriter –將位元組流轉為字元流(注意編碼)
    • FileReader,FileWriter

NIO(New I/O):同步非阻塞IO(也支援同步阻塞IO) –since jdk1.4

Java的NIO模型,底層依賴的是作業系統的NIO模型;因此,windows和Linux下的底層實現是不同的。(linux版本大於2.6的話用的是EPoll,小於2.6用的Poll)。

標準IO中,資料打包是以的形式,而NIO中是以的形式處理,這樣速度更快。

Channel

通道Channel是一個物件,用來讀寫資料。它是對流Stream的模擬,但是流區分方向(Input/Output),而通道沒有方向的概念,可以讀也可以寫。所有資料,都是從通道讀入到緩衝區Buffer,或者從緩衝區寫入通道。

channel-buffer

常用Channel
* FileChannel
* DatagramChannel
* SocketChannel
* ServerSocketChannel

Buffer

緩衝區Buffer是一個物件,可以看做一個容器,用來存放資料(剛讀入的資料,或者要寫出去的資料)。在NIO中,所有的資料都是在緩衝區裡處理的。緩衝區實質上是一個數組。通常它是一個位元組陣列,但是也可以使用其他種類的陣列。

常用Buffer:

  • ByteBuffer
  • CharBuffer
  • DoubleBuffer
  • FloatBuffer
  • IntBuffer
  • LongBuffer
  • ShortBuffer

Selector

選擇器Selector用來監聽1個或多個通道(是否準備好讀寫),從而實現一個執行緒管理多個通道。執行緒之間切換,效能開銷較大,因此,用一個執行緒來維護所有通道比較好。

AIO(Asynchronous I/O, NIO 2.0):非同步非阻塞IO –since jdk1.7

從程式設計模式上來看AIO相對於NIO的區別在於,NIO需要使用者執行緒不停的輪詢IO物件,來確定是否有資料準備好可以讀了,而AIO則是在資料準備好之後,才會通知資料使用者,這樣使用者就不需要不停地輪詢了。當然AIO的非同步特性並不是Java實現的偽非同步,而是使用了系統底層API的支援,在Unix系統下,採用了epoll IO模型,而windows便是使用了IOCP模型。

參考資料