1. 程式人生 > >Java IO與NIO的總結、比較

Java IO與NIO的總結、比較

one 何事 數據對象 容易 緩沖 rst 字符流 LEDE 如何

一、IO流總結

  1、Java I/O主要包括如下3層次:

  流式部分——最主要的部分。如:OutputStream、InputStream、Writer、Reader等
  非流式部分——如:File類、RandomAccessFile類和FileDescriptor等類
  其他——文件讀取部分的與安全相關的類,如:SerializablePermission類,以及與本地操作系統相關的文件系統的類,如:FileSystem類和Win32FileSystem類和WinNTFileSystem類。

  

  2、流式部分的不同分類

  • 按數據的流動方向:輸入流、輸出流
  • 按所要操作的數據對象的格式:字節流、字符流
  • 按來源和去向:
    • File(文件): FileInputStream, FileOutputStream, FileReader, FileWriter
    • byte[]:ByteArrayInputStream, ByteArrayOutputStream

    • Char[]: CharArrayReader, CharArrayWriterString: StringBufferInputStream, StringReader, StringWriter
    • 網絡數據流:InputStream, OutputStream, Reader, Writer

  以上也是我們在選擇使用IO流時要考慮的因素,除此之外,還需要考慮另外三點:

  1、是否需要轉換流?
  是,就使用轉換流,從Stream轉化為Reader、Writer:InputStreamReader。

  2、是否需要緩沖提高效率

  是,就加上Buffered:BufferedInputStream, BufferedOuputStream, BufferedReader, BufferedWriter

  3、是否需要格式化輸出

二、NIO總結

  Java NIO 的三個核心API:

  • Channel(通道-接口)
  • Buffers(緩沖區-抽象類)
  • Selector(選擇器-抽象類)

三、IO和NIO的選擇

  比較下IO與NIO的主要不同:

IO
NIO
面向流 面向緩沖
阻塞IO 非阻塞IO
選擇器

  1、面向流與面向緩沖

   Java IO面向流意味著每次從流中讀一個或多個字節,直至讀取所有字節,它們沒有被緩存在任何地方。此外,它不能前後移動流中的數據。如果需要前後移動從流中讀取的數據,需要先將它緩存到一個緩沖區。

  Java NIO的緩沖導向方法略有不同。數據讀取到一個它稍後處理的緩沖區,需要時可在緩沖區中前後移動。這就增加了處理過程中的靈活性。但是,還需要檢查是否該緩沖區中包含所有您需要處理的數據。而且,需確保當更多的數據讀入緩沖區時,不要覆蓋緩沖區裏尚未處理的數據。

  2、阻塞與非阻塞

  Java IO的各種流是阻塞的。這意味著,當一個線程調用read() 或 write()時,該線程被阻塞,直到有一些數據被讀取,或數據完全寫入。該線程在此期間不能再幹任何事情了。

  Java NIO的非阻塞模式,使一個線程從某通道發送請求讀取數據,但是它僅能得到目前可用的數據,如果目前沒有數據可用時,就什麽都不會獲取。而不是保持線程阻塞,所以直至數據變的可以讀取之前,該線程可以繼續做其他的事情。 非阻塞寫也是如此。

  一個線程請求寫入一些數據到某通道,但不需要等待它完全寫入,這個線程同時可以去做別的事情。 線程通常將非阻塞IO的空閑時間用於在其它通道上執行IO操作,所以一個單獨的線程現在可以管理多個輸入和輸出通道(channel)。

  3、關於選擇器

  Java NIO的選擇器允許一個單獨的線程來監視多個輸入通道,你可以註冊多個通道使用一個選擇器,然後使用一個單獨的線程來“選擇”通道:這些通道裏已經有可以處理的輸入,或者選擇已準備寫入的通道。這種選擇機制,使得一個單獨的線程很容易來管理多個通道。

四、NIO和IO如何影響應用程序的設計

  無論選擇IO或NIO工具箱,可能會影響您應用程序設計的以下幾個方面:

  • 對NIO或IO類的API調用。
  • 數據處理。
  • 用來處理數據的線程數。

  參考文章:http://www.importnew.com/19046.html

  

  

Java IO與NIO的總結、比較