Java IO與NIO的總結、比較
一、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
- 網絡數據流:InputStream, OutputStream, Reader, Writer
- Char[]: CharArrayReader, CharArrayWriterString: StringBufferInputStream, StringReader, StringWriter
以上也是我們在選擇使用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的總結、比較