国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java NIO (一)--簡介

2019-11-06 06:14:58
字體:
來源:轉載
供稿:網友

一、簡介

java NIO (New IO)是JDK1.4后引入的新輸入/輸出API,提供基于緩沖區(buffer)的塊寫入/讀取,而以前的I/O是基于流(Stream)的方式,NIO基于塊的IO操作,將最耗時的緩存區讀取和填充交由底層操作系統實現,因此速度上要快得多;主要由以下三個核心部分組成: 1.Channel2. Buffer 3. Selector

二、Channel - 通道

通道可以理解為以前的“流”,數據從通道讀取,也可以向通道寫入數據,是雙向的,但是讀取和寫入都必須是使用Buffer,即讀取數據時,需要從通道讀取到緩存區,然后再從緩沖區獲取數據,寫入數據也需要先將數據寫入到緩存區,再將緩沖區寫入通道;NIO中主要有以下通道類型: - FileChannel - 文件IO - DatagramChannel - UDP傳輸 - SocketChannel - TCP傳輸 - ServerSocketChannel -TCP傳輸

三、Buffer - 緩沖區

緩沖區可以認為是一個數據容器,可以理解為一個基本數據類型數組,如字節數組等;NIO中任何數據輸入/輸出都是必須經由緩沖區實現,主要有以下緩沖區類型: - ByteBuffer - CharBuffer - ShortBuffer - IntBuffer - LongBuffer - FloatBuffer - DoubleBuffer - MappedByteBuffer可以看出以上類型覆蓋Java的全部基本類型,MappedByteBuffer(內存映射文件,后續章節講解)對于每種Buffer都有相同的方法,只有ByteBuffer擁有部分特殊的方法

向Buffer中寫數據 

寫數據到Buffer有兩種方式: 

·        從Channel寫到Buffer。

·        通過Buffer的put()方法寫到Buffer里。

從Channel寫到Buffer的例子 : 

int bytesRead = inChannel.read(buf); //read into buffer.通過put方法寫Buffer的例子:

buf.put(127);  

從Buffer中讀取數據 

從Buffer中讀取數據有兩種方式: 

·        從Buffer讀取數據到Channel。

·       使用get()方法從Buffer中讀取數據。

從Buffer讀取數據到Channel的例子:

 //read from buffer into channel.   int bytesWritten = inChannel.write(buf);使用get()方法從Buffer中讀取數據的例子 :
byte aByte = buf.get(); 

四、Selector - 選擇器

選擇器支持單個線程處理多個Channel,將多個Channel注冊到一個選擇器中,選擇器基于事件的方式處理;從選擇器獲取注冊Channel中關注的事件(如讀、寫)并進行數據處理,非常適用于多個數據量不大、讀寫不頻繁的通道,使用單個線程來處理;

五、NIO簡單(標準)的輸入/輸出

一個簡單(標準)的NIO輸入輸出一般包含如下步驟: 1. 從數據源獲取通道 2. 分配緩沖區 3. 切換緩存區為寫模式 4. 從通道讀取數據寫入緩沖區 5. 切換緩沖區為讀模式 6. 緩沖區數據寫入通道中 7. 關閉資源

實例代碼如下:

package com.denny.aio.test;import java.io.IOException;import java.io.RandomaccessFile;import java.nio.ByteBuffer;import java.nio.channels.FileChannel;public class Test {	public static void main(String[] args) throws IOException {				RandomAccessFile formFile = new RandomAccessFile("src//a.txt", "rw");		RandomAccessFile toFile = new RandomAccessFile("src//b.txt", "rw");				//獲取channel		FileChannel fromChannel = formFile.getChannel();		FileChannel toChannel = toFile.getChannel();				// 定義緩沖大小		int bufSize = 1024*4;				// 定義緩沖		ByteBuffer byteBuffer = ByteBuffer.allocate(bufSize);				int len = 0;				// 將數據從源channel寫入到緩沖區		while(  (len=fromChannel.read(byteBuffer)) !=-1 ){						//切換到讀模式			byteBuffer.flip();						//讀取緩沖區數據寫到目標channel			toChannel.write(byteBuffer);						// 清空緩沖			byteBuffer.clear();		}				// 釋放資源		toChannel.close();		fromChannel.close();	}}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 瓦房店市| 青龙| 渑池县| 满城县| 灵武市| 新营市| 仙游县| 莎车县| 共和县| 五原县| 襄城县| 灵寿县| 安义县| 太仆寺旗| 滁州市| 全椒县| 左权县| 台湾省| 敦煌市| 平陆县| 门头沟区| 温泉县| 伊通| 大丰市| 奇台县| 木兰县| 资源县| 台东县| 九台市| 利辛县| 金沙县| 马关县| 通海县| 汉源县| 淮南市| 灵丘县| 湖北省| 花莲县| 英超| 乡宁县| 嘉义市|