JAVA基礎(10)——IO、NIO

轉載:http://blog.csdn.net/weitry/article/details/52964948html

JAVA基礎系列規劃:java


IO 是主存和外部設備 ( 硬盤、終端和網絡等 ) 拷貝數據的過程。 IO 是操做系統的底層功能實現,底層經過 I/O 指令進行完成。編程

1. 標準IO

Java 標準 IO 類庫是 io 面向對象的一種抽象。基於本地方法的底層實現,咱們無須關注底層實現。網絡

從處理數據類型上,能夠分爲字節流和字符流;從數據流向上,能夠分爲輸入流和輸出流。併發

- 字節流 字符流
輸入流 InputStrea Reader
輸出流 OutputStream Writer

字節流均繼承自InputStream和OutputStream這兩個抽象類。字符流均繼承自Reader和Writer這兩個抽象類。異步

字節流和字符流的區別,除了讀寫單位和處理對象不一樣外,在文件操做中,字節流在操做時不使用緩衝區(內存),是文件自己直接操做的,而字符流在操做時使用了緩衝區,經過緩衝區再操做文件。編碼

輸入流和輸出流的區別在於流向上,流入程序的爲輸入,從程序流出的爲輸出。spa

Java 標準 IO 類庫提供了數量衆多的封裝類,爲了更加從容的使用這些類,使用標準IO時能夠參考如下原則:操作系統

  1. 考慮最原始的數據格式是什麼 
    • 二進制格式(只要不能肯定是純文本的),使用InputStream/OutputStream類的子類。
    • 純文本格式(含純英文與漢字或其餘編碼方式),使用Reader/Writer類型子類。
  2. 數據方向 
    • 輸入,使用Reader/InputStream類的子類
    • 輸出,使用Writer/OutputStream類的子類
  3. 是否須要轉換流 
    • 若須要Stream -> Reader/Writer,使用InputStreamReader/OutputStreamWriter。
  4. 數據來源 
    • 文件: FileInputStream、 FileOutputStream、FileReader、FileWriter
    • byte[]:ByteArrayInputStream、ByteArrayOutputStream
    • Char[]:CharArrayReader、 CharArrayWriter
    • String:StringBufferInputStream、StringBufferOuputStream、StringReader、StringWriter
    • 網絡數據流:InputStream、OutputStream、Reader、Writer
  5. 是否須要用到緩衝區 
    • BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter
  6. 是否有特殊須要 
    • 格式化輸出:PrintStream、PrintWriter
    • 對象輸入輸出: ObjectInputStream、ObjectOutputStream
    • 進程間通訊: PipeInputStream、PipeOutputStream、PipeReader、PipeWriter
    • 合併輸入: SequenceInputStream
    • 更特殊的須要: PushbackInputStream、PushbackReader、LineNumberInputStream、LineNumberReader

操做示例可參考《java中的IO整理》.net

2. NIO

Java NIO是JDK1.4以後新出的一套IO接口,這裏的的新是相對於原有標準的Java IO和Java Networking接口。NIO提供了一種徹底不一樣的操做方式:

    • Channel和Buffer

      標準IO的編程接口是面向字節流和字符流的。而NIO是面向通道和緩衝區的,數據老是從通道中讀到Buffer緩衝區內,或者從Buffer寫入到通道中。

      Buffer。Buffer是一塊連續的內存塊,是NIO數據讀或寫的中轉地,其只能和Channel對接。

      Channel。Channel是數據的源頭或者目的地,用於向Buffer提供數據或者讀取Buffer數據,Buffer的惟一接口,支持異步IO。

    • Non-blocking

      NIO中的N能夠理解爲Non-blocking,不單純是New。Java NIO使咱們能夠進行非阻塞IO操做。好比說,單線程中從通道讀取數據到buffer,同時能夠繼續作別的事情,當數據讀取到buffer中後,線程再繼續處理數據。寫數據也是同樣的。

    • Selectors

      Selector能夠檢測多個通道的事件狀態(例如:連接打開,數據到達),這樣單線程就能夠操做多個通道的數據,實現多路 (non-bloking) 非阻塞式的高伸縮性網絡 I/O 

相關文章
相關標籤/搜索