Java NIO系列1

聲明:原創文章,轉載請注明出處。http://www.lxweimin.com/u/e02df63eaa87

1、概述

Java BIO(標準IO)中, 提供了基于流的IO實現,即InputstreamOutputstream。也就是已字節為單位處理數據。

Java NIO是Java New IO的簡稱,是一套新的完全可以替代Java IO的機制。與BIO不同的是,NIO是基于塊(Block)實現的,以塊為基本單位處理數據。

除此之外,NIO還加入了以下特性:

  • Buffer:為所有的基本數據類型提供了Buffer支持
  • Charset:使用Java.nio.charset.Charset 作為字符集編碼方案
  • Channel:增加Channel作為新的原始IO接口
  • 鎖、內存映射:增加鎖和內存映射的文件訪問接口
  • selector:提供了基于selector的異步網絡IO

Buffer是一塊連續的內存塊,是NIO讀寫數據的中轉地。
Channel是緩沖數據的源頭或目的地,用于向緩沖讀取/寫入數據,是訪問Buffer的接口。

Channel和Buffer

2、Channel和Buffer

NIO中,Buffer為一個抽象類。并為每個基本數據類型創建了一個Buffer。除了ByteBuffer之外,其他基本類型的Buffer,都有完全相同的成員方法和操作。是由于ByteBuffer多用于大部分BIO操作的接口,具有一些特殊的方法。

NIO中,配合Buffer使用的有Channel。Channel與Stream最大的不同是,Channel是一個雙向通道。使用NIO中,Channel不能單獨使用,必須通過配合Buffer使用。例如,在對一個Channel進行讀操作時,首先將數據從Channel寫入到相應的Buffer中,之后在Buffer中進行讀取。

public static void readAndWriteFile(String src, String dst) throws IOException {

        FileInputStream fis  = new FileInputStream(src);
        FileOutputStream fos = new FileOutputStream(dst);

        FileChannel readChannel  = fis.getChannel();
        FileChannel writeChannel = fos.getChannel();

        ByteBuffer buffer = ByteBuffer.allocate(1024); // 1KB

        while (true) {
            buffer.clear();
            int readLen = readChannel.read(buffer);
            if (readLen == -1) {
                break;
            }
            buffer.flip();
            writeChannel.write(buffer);
        }
        readChannel.close();
        writeChannel.close();
    }

上例是一個簡單的使用NIO讀取并寫入的操作??梢钥吹?,讀取文件時,打開文件并獲取文件的Channel,并將數據讀入到空的Buffer中;同樣地寫入時,需要將有數據的Buffer寫入到Channel中。對Channel進行讀寫操作時,都需要Buffer的配合。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容