




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Java NIO簡(jiǎn)介IO 是主存和外部設(shè)備 ( 硬盤、終端和網(wǎng)絡(luò)等 ) 拷貝數(shù)據(jù)的過(guò)程。 IO 是操作系統(tǒng)的底層功能實(shí)現(xiàn),底層通過(guò) I/O 指令進(jìn)行完成。1. Java標(biāo)準(zhǔn)IOJava 標(biāo)準(zhǔn) IO 類庫(kù)是 IO 面向?qū)ο蟮囊环N抽象。InputStreamOutputStream( 字節(jié)流 ) :一次傳送一個(gè)字節(jié)。 ReaderWriter( 字符流 ) :一次一個(gè)字符。2. Java NIOSun 官方標(biāo)榜的特性如下: n 為所有的原始類型提供 (Buffer) 緩存支持。 n 字符集編碼解碼解決方案。 n Channel :一個(gè)新的原始 I/O 抽象。 n 支持鎖和內(nèi)存映射文件的文件訪問(wèn)接口
2、。 n 提供多路 (non-bloking) 非阻塞式的高伸縮性網(wǎng)絡(luò) I/O 。 2.1. Buffer&ChanelChannel 和 buffer 是 NIO 兩個(gè)最基本的數(shù)據(jù)類型抽象。 Buffer: n 是一塊連續(xù)的內(nèi)存塊。 n 是 NIO 數(shù)據(jù)讀或?qū)懙闹修D(zhuǎn)地。 Channel: n 數(shù)據(jù)的源頭或者數(shù)據(jù)的目的地。 n 用于向 buffer 提供數(shù)據(jù)或者讀取 buffer 數(shù)據(jù) ,buffer 對(duì)象的唯一接口。 n 異步 I/O 支持。 圖1:channel和buffer關(guān)系例子 1:CopyFile.java: 1. package sample;
3、60;2. 3. import java.io.FileInputStream; 4. import java.io.FileOutputStream; 5. import java.nio.ByteBuffer; 6. import java.nio.channels.FileChannel; 7. 8. public class CopyFile 9.
4、 public static void main(String args) throws Exception 10. String infile = "C:copy.sql" 11. Stri
5、ng outfile = "C:copy.txt" 12. / 獲取源文件和目標(biāo)文件的輸入輸出流 13. FileInputStream fin = new FileInputStream(infile); 14.
6、0; FileOutputStream fout = new FileOutputStream(outfile); 15. / 獲取輸入輸出通道 16. FileChannel fcin = fin.getCh
7、annel(); 17. FileChannel fcout = fout.getChannel(); 18. / 創(chuàng)建緩沖區(qū) 19. ByteBuffer buffer =
8、60;ByteBuffer.allocate(1024); 20. while (true) 21. / clear方法重設(shè)緩沖區(qū),使它可以接受讀入的數(shù)據(jù) 22.
9、0; buffer.clear(); 23. / 從輸入通道中將數(shù)據(jù)讀到緩沖區(qū) 24. int r = fcin.read(buffer); 25.
10、160; / read方法返回讀取的字節(jié)數(shù),可能為零,如果該通道已到達(dá)流的末尾,則返回-1 26. if (r = -1) 27.
11、; break; 28. 29. / flip方法讓緩沖區(qū)可以將新讀入的數(shù)據(jù)寫入另一個(gè)通道 30.
12、; buffer.flip(); 31. / 從輸出通道中將數(shù)據(jù)寫入緩沖區(qū) 32. fcout.write(buffer);
13、;33. 34. 35. 其中 buffer 內(nèi)部結(jié)構(gòu)如下 ( 下圖拷貝自資料 )圖2:buffer內(nèi)部結(jié)構(gòu)一個(gè) buffer 主要由 position,limit,capacity 三個(gè)變量來(lái)控制讀寫的過(guò)程。此三個(gè)變量的含義見(jiàn)如下表格: 參數(shù) 寫模式 讀模式 position 當(dāng)前寫入的單位數(shù)據(jù)數(shù)量。 當(dāng)前讀取的單位數(shù)據(jù)位置。 limit
14、 代表最多能寫多少單位數(shù)據(jù)和容量是一樣的。 代表最多能讀多少單位數(shù)據(jù),和之前寫入的單位數(shù)據(jù)量一致。 capacity buffer 容量 buffer 容量 Buffer 常見(jiàn)方法: flip(): 寫模式轉(zhuǎn)換成讀模式 rewind() :將 position 重置為 0 ,一般用于重復(fù)讀。 clear() :清空 buffer ,準(zhǔn)備再次被寫入 (position 變成 0 , limit 變成 capacity) 。 compact(): 將未讀取的數(shù)據(jù)拷貝到 buffer 的頭部位。 mark() 、 reset():mark 可以標(biāo)記一個(gè)位置, reset 可以重置到該位置。 Buff
15、er 常見(jiàn)類型: ByteBuffer 、 MappedByteBuffer 、 CharBuffer 、 DoubleBuffer 、 FloatBuffer 、 IntBuffer 、 LongBuffer 、 ShortBuffer 。 channel 常見(jiàn)類型 :FileChannel 、 DatagramChannel(UDP) 、 SocketChannel(TCP) 、 ServerSocketChannel(TCP) 2.2. nio.charset 字符編碼解碼 : 字節(jié)碼本身只是一些數(shù)字,放到正確的上下文中被正確被解析。向 ByteBuffer 中存放數(shù)據(jù)時(shí)需要考慮字符集的
16、編碼方式,讀取展示 ByteBuffer 數(shù)據(jù)時(shí)涉及對(duì)字符集解碼。 Java.nio.charset 提供了編碼解碼一套解決方案。 以我們最常見(jiàn)的 http 請(qǐng)求為例,在請(qǐng)求的時(shí)候必須對(duì)請(qǐng)求進(jìn)行正確的編碼。在得到響應(yīng)時(shí)必須對(duì)響應(yīng)進(jìn)行正確的解碼。 以下代碼向 baidu 發(fā)一次請(qǐng)求,并獲取結(jié)果進(jìn)行顯示。例子演示到了 charset 的使用。 例子 2BaiduReader.java Java代碼 36. package nio.readpage; 37. 38. import java.nio.ByteBuffer;
17、 39. import java.nio.channels.SocketChannel; 40. import java.nio.charset.Charset; 41. import .InetSocketAddress; 42. import java.io.IOException; 43. public class BaiduReader 44.
18、60; private Charset charset = Charset.forName("GBK");/ 創(chuàng)建GBK字符集 45. private SocketChannel channel; 46. public void readHTMLContent() 47. &
19、#160; try 48. InetSocketAddress socketAddress = new InetSocketAddress( 49. "", 80); 50. /step1:打開(kāi)連接 51.
20、 channel = SocketChannel.open(socketAddress); 52. /step2:發(fā)送請(qǐng)求,使用GBK編碼 53. channel
21、.write(charset.encode("GET " + "/ HTTP/1.1" + "rnrn"); 54. /step3:讀取數(shù)據(jù) 55.
22、60;ByteBuffer buffer = ByteBuffer.allocate(1024);/ 創(chuàng)建1024字節(jié)的緩沖 56. while (channel.read(buffer) != -1) 57.
23、60; buffer.flip();/ flip方法在讀緩沖區(qū)字節(jié)操作之前調(diào)用。 58. System.out.println(charset.decode(buffer); 59.
24、 / 使用Charset.decode方法將字節(jié)轉(zhuǎn)換為字符串 60. buffer.clear();/ 清空緩沖 61.
25、160; 62. catch (IOException e) 63. System.err.println(e.toString(); 64.
26、160; finally 65. if (channel != null) 66. try 67.
27、160; channel.close(); 68. catch (IOException e) 69.
28、 70. 71. 72. 73. public static void main(String args) 74. new BaiduReader().readHTMLContent(); 75.
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 初中音樂(lè)課堂多聲部合唱教學(xué)策略與音樂(lè)教育改革研究論文
- 校本課程開(kāi)發(fā)中的課程內(nèi)容設(shè)計(jì)論文
- 繪畫課程對(duì)學(xué)生視覺(jué)思維的影響論文
- 基于虛擬現(xiàn)實(shí)技術(shù)的初中地理教學(xué)情境創(chuàng)設(shè)與教學(xué)效果評(píng)價(jià)論文
- 艾伯森財(cái)務(wù)管理制度
- 苗圃地員工管理制度
- 茶牌坊人員管理制度
- 融資合同:流動(dòng)資金貸款合同
- 評(píng)估指標(biāo)體系和評(píng)估機(jī)制構(gòu)建支撐工作競(jìng)爭(zhēng)性磋商文件
- 財(cái)政學(xué) 期末考試復(fù)習(xí)重點(diǎn)總結(jié)
- 小學(xué)生玩手機(jī)危害課件
- 2025年中國(guó)石油集團(tuán)招聘筆試參考題庫(kù)含答案解析
- 數(shù)字金融發(fā)展與跨境貿(mào)易人民幣結(jié)算
- 智能制造能力成熟度模型(-CMMM-)介紹及評(píng)估方法分享
- 子宮腺肌病三級(jí)管理專家共識(shí)解讀
- 鋼材采銷方案
- 上海市2025年中考模擬初三英語(yǔ)試卷試題及答案
- 長(zhǎng)租公寓管理制度
- 華東理工大學(xué)《藥劑學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 第四單元《遵守法律規(guī)范》測(cè)試卷-高二思想政治課《職業(yè)道德與法治》附答案
- 保安保潔物業(yè)服務(wù)招投標(biāo)書范本
評(píng)論
0/150
提交評(píng)論