聲明:原創文章,轉載請注明出處。http://www.lxweimin.com/u/e02df63eaa87
1、概述
Java BIO(標準IO)中, 提供了基于流的IO實現,即Inputstream和Outputstream。也就是已字節為單位處理數據。
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的配合。