I/O 或者輸入/輸出指的是計算機與外部世界或者一個程式與計算機的其餘部分的之間的接口。它對于任何計算機系統都非常關鍵,因而所有 I/O 的主體實際上是内置在作業系統中的。單獨的程式一般是讓系統為它們完成大部分的工作。
在 Java 程式設計中,直到最近一直使用流的方式完成 I/O。所有 I/O 都被視為單個的位元組的移動,通過一個稱為 Stream 的對象一次移動一個位元組。流 I/O 用于與外部世界接觸。它也在内部使用,用于将對象轉換為位元組,然後再轉換回對象。
NIO 與原來的 I/O 有同樣的作用和目的,但是它使用不同的方式塊 I/O。正如您将在本教程中學到的,塊 I/O 的效率可以比流 I/O 高許多。
NIO 的建立目的是為了讓 Java 程式員可以實作高速 I/O 而無需編寫自定義的本機代碼。NIO 将最耗時的 I/O 操作(即填充和提取緩沖區)轉移回作業系統,因而可以極大地提高速度。
原來的 I/O 庫(在 java.io.*中) 與 NIO 最重要的差別是資料打包和傳輸的方式。正如前面提到的,原來的 I/O 以流的方式處理資料,而 NIO 以塊的方式處理資料。
面向流的 I/O 系統一次一個位元組地處理資料。一個輸入流産生一個位元組的資料,一個輸出流消費一個位元組的資料。為流式資料建立過濾器非常容易。連結幾個過濾器,以便每個過濾器隻負責單個複雜處理機制的一部分,這樣也是相對簡單的。不利的一面是,面向流的 I/O 通常相當慢。
一個面向塊的 I/O 系統以塊的形式處理資料。每一個操作都在一步中産生或者消費一個資料塊。按塊處理資料比按(流式的)位元組處理資料要快得多。但是面向塊的 I/O 缺少一些面向流的 I/O 所具有的優雅性和簡單性。
在 JDK 1.4 中原來的 I/O 包和 NIO 已經很好地內建了。 java.io.* 已經以 NIO 為基礎重新實作了,是以現在它可以利用 NIO 的一些特性。例如, java.io.* 包中的一些類包含以塊的形式讀寫資料的方法,這使得即使在更面向流的系統中,處理速度也會更快。
也可以用 NIO 庫實作标準 I/O 功能。例如,可以容易地使用塊 I/O 一次一個位元組地移動資料。但是正如您會看到的,NIO 還提供了原 I/O 包中所沒有的許多好處。
本文轉自 夢朝思夕 51CTO部落格,原文連結:http://blog.51cto.com/qiangmzsx/1409426