




版權(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è)備 ( 硬盤(pán)、終端和網(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ù)寫(xiě)入另一個(gè)通道 30.
12、; buffer.flip(); 31. / 從輸出通道中將數(shù)據(jù)寫(xiě)入緩沖區(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)控制讀寫(xiě)的過(guò)程。此三個(gè)變量的含義見(jiàn)如下表格: 參數(shù) 寫(xiě)模式 讀模式 position 當(dāng)前寫(xiě)入的單位數(shù)據(jù)數(shù)量。 當(dāng)前讀取的單位數(shù)據(jù)位置。 limit
14、 代表最多能寫(xiě)多少單位數(shù)據(jù)和容量是一樣的。 代表最多能讀多少單位數(shù)據(jù),和之前寫(xiě)入的單位數(shù)據(jù)量一致。 capacity buffer 容量 buffer 容量 Buffer 常見(jiàn)方法: flip(): 寫(xiě)模式轉(zhuǎn)換成讀模式 rewind() :將 position 重置為 0 ,一般用于重復(fù)讀。 clear() :清空 buffer ,準(zhǔn)備再次被寫(xiě)入 (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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 環(huán)保行業(yè)廢棄物處理風(fēng)險(xiǎn)協(xié)議
- 高級(jí)化妝品行業(yè)售后免責(zé)協(xié)議
- 建設(shè)工程施工協(xié)議(32篇)
- 上海手房買(mǎi)賣(mài)協(xié)議
- 臨時(shí)租車協(xié)議書(shū)
- 班班通設(shè)備管理和使用協(xié)議
- 物流配送中心建設(shè)委托代理合同
- 建筑工地安全施工責(zé)任與免責(zé)合同
- 房地產(chǎn)項(xiàng)目銷售居間合同
- 教練與學(xué)員合同協(xié)議
- 光伏電站小EPC規(guī)定合同范本
- 2024年01月江蘇2024年昆山鹿城村鎮(zhèn)銀行第三期校園招考筆試歷年參考題庫(kù)附帶答案詳解
- 中國(guó)人口研究專題報(bào)告-中國(guó)2025-2100年人口預(yù)測(cè)與政策建議-西南財(cái)經(jīng)大學(xué)x清華大學(xué)-202501
- 建筑工程安全與管理
- 2025年內(nèi)蒙古機(jī)電職業(yè)技術(shù)學(xué)院高職單招職業(yè)技能測(cè)試近5年??及鎱⒖碱}庫(kù)含答案解析
- 2024年05月齊魯銀行總行2024年社會(huì)招考筆試歷年參考題庫(kù)附帶答案詳解
- 浙江省紹興市2024-2025學(xué)年高一上學(xué)期期末調(diào)測(cè)英語(yǔ)試題(無(wú)答案)
- 幼兒園開(kāi)學(xué)教師安全知識(shí)培訓(xùn)
- 2024年醫(yī)療器械經(jīng)營(yíng)質(zhì)量管理規(guī)范培訓(xùn)課件
- 中華人民共和國(guó)學(xué)前教育法-知識(shí)培訓(xùn)
- 2023年新高考(新課標(biāo))全國(guó)2卷數(shù)學(xué)試題真題(含答案解析)
評(píng)論
0/150
提交評(píng)論