聲明:原創(chuàng)文章复凳,轉(zhuǎn)載請(qǐng)注明出處甸昏。http://www.reibang.com/u/e02df63eaa87
1蛤迎、概述
Java BIO(標(biāo)準(zhǔn)IO)中, 提供了基于流的IO實(shí)現(xiàn)觅彰,即Inputstream和Outputstream吩蔑。也就是已字節(jié)為單位處理數(shù)據(jù)。
Java NIO是Java New IO的簡(jiǎn)稱填抬,是一套新的完全可以替代Java IO的機(jī)制烛芬。與BIO不同的是,NIO是基于塊(Block)實(shí)現(xiàn)的飒责,以塊為基本單位處理數(shù)據(jù)赘娄。
除此之外,NIO還加入了以下特性:
- Buffer:為所有的基本數(shù)據(jù)類型提供了Buffer支持
- Charset:使用Java.nio.charset.Charset 作為字符集編碼方案
- Channel:增加Channel作為新的原始IO接口
- 鎖宏蛉、內(nèi)存映射:增加鎖和內(nèi)存映射的文件訪問接口
- selector:提供了基于selector的異步網(wǎng)絡(luò)IO
Buffer是一塊連續(xù)的內(nèi)存塊遣臼,是NIO讀寫數(shù)據(jù)的中轉(zhuǎn)地。
Channel是緩沖數(shù)據(jù)的源頭或目的地拾并,用于向緩沖讀取/寫入數(shù)據(jù)揍堰,是訪問Buffer的接口。
2辟灰、Channel和Buffer
NIO中个榕,Buffer為一個(gè)抽象類。并為每個(gè)基本數(shù)據(jù)類型創(chuàng)建了一個(gè)Buffer芥喇。除了ByteBuffer之外西采,其他基本類型的Buffer,都有完全相同的成員方法和操作继控。是由于ByteBuffer多用于大部分BIO操作的接口械馆,具有一些特殊的方法。
NIO中武通,配合Buffer使用的有Channel霹崎。Channel與Stream最大的不同是,Channel是一個(gè)雙向通道冶忱。使用NIO中尾菇,Channel不能單獨(dú)使用,必須通過配合Buffer使用囚枪。例如派诬,在對(duì)一個(gè)Channel進(jìn)行讀操作時(shí),首先將數(shù)據(jù)從Channel寫入到相應(yīng)的Buffer中链沼,之后在Buffer中進(jìn)行讀取默赂。
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();
}
上例是一個(gè)簡(jiǎn)單的使用NIO讀取并寫入的操作±ㄉ祝可以看到缆八,讀取文件時(shí)曲掰,打開文件并獲取文件的Channel,并將數(shù)據(jù)讀入到空的Buffer中奈辰;同樣地寫入時(shí)栏妖,需要將有數(shù)據(jù)的Buffer寫入到Channel中。對(duì)Channel進(jìn)行讀寫操作時(shí)冯挎,都需要Buffer的配合底哥。