柚子快報邀請碼778899分享:JAVA-NIO介紹-與緩沖區(qū)
柚子快報邀請碼778899分享:JAVA-NIO介紹-與緩沖區(qū)
介紹
NIO與原來的IO有同樣的作用和目的,但是使用的方式完全不同,NIO支持面向緩沖區(qū)的、基于通道的IO操作。NIO將以更加高效的方式進(jìn)行文件的讀寫操作。
非阻塞式網(wǎng)絡(luò)通信模型
傳統(tǒng)流是單通道的
線程從某通道進(jìn)行讀寫數(shù)據(jù)時,若沒有數(shù)據(jù)可用時,該線程可以進(jìn)行其他任務(wù)。線程通常將非阻塞IO 的空閑時間用于在其他通道上執(zhí)行 IO操作,所以單獨(dú)的線程可以管理多個輸入和輸出通道NIO 可以讓服務(wù)器端使用一個或有限幾個線程來同時處理連接到服務(wù)器端的所有客戶端
緩沖區(qū)
流 vs 緩沖區(qū)
流:隨著時間到來的數(shù)據(jù)緩沖區(qū):緩沖作用
按鍵太快磁盤寫入操作太多網(wǎng)絡(luò)請求太多現(xiàn)實(shí)模型:理發(fā)店緩沖的本質(zhì)是排隊(duì)、流的本質(zhì)是數(shù)據(jù)
直接緩沖區(qū)
通過 allocateDirect() 方法分配直接緩沖區(qū),將緩沖區(qū)建立在物理內(nèi)存中。可以提高效率可以駐留在常規(guī)的垃圾回收堆之外直接字節(jié)緩沖區(qū)還可以通過FileChannel 的 map() 方法?將文件區(qū)域直接映射到內(nèi)存中來創(chuàng)建
非直接緩沖區(qū)
通過 allocate() 方法分配緩沖區(qū),將緩沖區(qū)建立在 JVM 的內(nèi)存中
屬性與流程
屬性
容量 (capacity) :不能更改,不能為負(fù)。限制 (limit):位于 limit 后的數(shù)據(jù)不可讀寫位置 (position):當(dāng)前要讀取或?qū)懭霐?shù)據(jù)的索引標(biāo)記 (mark):是一個索引,標(biāo)記為position位置。 恢復(fù)到標(biāo)記的position0 <= mark <= position <= limit <= capacity
流程
靜態(tài)方法創(chuàng)建緩存區(qū),進(jìn)入寫準(zhǔn)備PUT 方法寫入,flip方法切換讀讀完后,clear 為下一次 寫循環(huán)準(zhǔn)備重復(fù)讀 rewind mark/reset
方法
Buffer flip():將limit設(shè)置為當(dāng)前position,將position設(shè)置為 0,mark設(shè)置為-1Buffer rewind():將position設(shè)為為 0, mark設(shè)為-1??芍貜?fù)讀Buffer mark():對緩沖區(qū)設(shè)置markBuffer reset():將位置 position 轉(zhuǎn)到以前設(shè)置的 mark 所在的位置boolean hasRemaining():判斷緩沖區(qū)中是否還有元素int remaining():返回 position 和 limit 之間的元素個數(shù)Buffer clear():將limit設(shè)為capacity,將position設(shè)為0,并將mark設(shè)為-1。數(shù)據(jù)沒有清空Buffer limit(int n):將設(shè)置緩沖區(qū)界限為 n, 并返回一個具有新 limit 的緩沖區(qū)對象int capacity() :返回 Buffer 的 capacity 大小int limit() :返回 Buffer 的界限(limit) 的位置int position() :返回緩沖區(qū)的當(dāng)前位置 positionBuffer position(int n) :將設(shè)置緩沖區(qū)的當(dāng)前位置為 n , 并返回修改后的 Buffer 對象
String str = "abcde";
ByteBuffer buf = ByteBuffer.allocateDirect(1024);
buf.put(str.getBytes());
buf.flip();
byte[] dst = new byte[buf.limit()];
buf.get(dst, 0, 2);
System.out.println(new String(dst, 0, 2));
System.out.println(buf.position());
//mark() : 標(biāo)記
buf.mark();
//不可重復(fù)讀
buf.get(dst, 2, 2);
System.out.println(new String(dst, 2, 2));
System.out.println(buf.position());
//reset() : 恢復(fù)到 mark 的位置
buf.reset();
System.out.println(buf.position());
//緩沖區(qū)遍歷
if(buf.hasRemaining()){
System.out.println(buf.remaining());
}
//5. rewind() : 可重復(fù)讀
buf.rewind();
System.out.println("-----------------rewind()----------------");
System.out.println(buf.position());
System.out.println(buf.limit());
System.out.println(buf.capacity());
//6. clear() : 清空緩沖區(qū). 但是緩沖區(qū)中的數(shù)據(jù)依然存在,但是處于“被遺忘”狀態(tài)
buf.clear();
System.out.println("-----------------clear()----------------");
System.out.println(buf.position());
System.out.println(buf.limit());
System.out.println(buf.capacity());
System.out.println((char)buf.get());
柚子快報邀請碼778899分享:JAVA-NIO介紹-與緩沖區(qū)
精彩文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。