Java NIO簡介_第1頁
Java NIO簡介_第2頁
Java NIO簡介_第3頁
Java NIO簡介_第4頁
Java NIO簡介_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、Java NIO簡介IO 是主存和外部設(shè)備 ( 硬盤、終端和網(wǎng)絡(luò)等 ) 拷貝數(shù)據(jù)的過程。 IO 是操作系統(tǒng)的底層功能實現(xiàn),底層通過 I/O 指令進行完成。1. Java標準IOJava 標準 IO 類庫是 IO 面向?qū)ο蟮囊环N抽象。InputStreamOutputStream( 字節(jié)流 ) :一次傳送一個字節(jié)。 ReaderWriter( 字符流 ) :一次一個字符。2. Java NIOSun 官方標榜的特性如下: n 為所有的原始類型提供 (Buffer) 緩存支持。 n 字符集編碼解碼解決方案。 n Channel :一個新的原始 I/O 抽象。 n 支持鎖和內(nèi)存映射文件的文件訪問接口

2、。 n 提供多路 (non-bloking) 非阻塞式的高伸縮性網(wǎng)絡(luò) I/O 。 2.1. Buffer&ChanelChannel 和 buffer 是 NIO 兩個最基本的數(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 對象的唯一接口。 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.         / 獲取源文件和目標文件的輸入輸出流   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ù),可能為零,如果該通道已到達流的末尾,則返回-1   26.             if (r = -1)    27.         

11、;        break;   28.                29.             / flip方法讓緩沖區(qū)可以將新讀入的數(shù)據(jù)寫入另一個通道   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)一個 buffer 主要由 position,limit,capacity 三個變量來控制讀寫的過程。此三個變量的含義見如下表格: 參數(shù) 寫模式     讀模式 position 當前寫入的單位數(shù)據(jù)數(shù)量。 當前讀取的單位數(shù)據(jù)位置。 limit

14、 代表最多能寫多少單位數(shù)據(jù)和容量是一樣的。 代表最多能讀多少單位數(shù)據(jù),和之前寫入的單位數(shù)據(jù)量一致。 capacity buffer 容量 buffer 容量 Buffer 常見方法: flip(): 寫模式轉(zhuǎn)換成讀模式 rewind() :將 position 重置為 0 ,一般用于重復(fù)讀。 clear() :清空 buffer ,準備再次被寫入 (position 變成 0 , limit 變成 capacity) 。 compact(): 將未讀取的數(shù)據(jù)拷貝到 buffer 的頭部位。 mark() 、 reset():mark 可以標記一個位置, reset 可以重置到該位置。 Buff

15、er 常見類型: ByteBuffer 、 MappedByteBuffer 、 CharBuffer 、 DoubleBuffer 、 FloatBuffer 、 IntBuffer 、 LongBuffer 、 ShortBuffer 。 channel 常見類型 :FileChannel 、 DatagramChannel(UDP) 、 SocketChannel(TCP) 、 ServerSocketChannel(TCP) 2.2. nio.charset 字符編碼解碼 : 字節(jié)碼本身只是一些數(shù)字,放到正確的上下文中被正確被解析。向 ByteBuffer 中存放數(shù)據(jù)時需要考慮字符集的

16、編碼方式,讀取展示 ByteBuffer 數(shù)據(jù)時涉及對字符集解碼。 Java.nio.charset 提供了編碼解碼一套解決方案。 以我們最常見的 http 請求為例,在請求的時候必須對請求進行正確的編碼。在得到響應(yīng)時必須對響應(yīng)進行正確的解碼。 以下代碼向 baidu 發(fā)一次請求,并獲取結(jié)果進行顯示。例子演示到了 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:打開連接   51.  

20、           channel = SocketChannel.open(socketAddress);   52.         /step2:發(fā)送請求,使用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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論