亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

J2SE1.4的I/O新特性

2019-11-18 11:55:55
字體:
來源:轉載
供稿:網友

  譯者序:這是一篇比較使用的I/O新特性的介紹文章。文中使用了大量的代碼實例來演示和解說如何使用J2SE1.4的新I/O特性并提供你應用程序的性能,而且提供了兩個完整的例子,其中包括一個循環WEB服務器的雛形,非常值得我們參考。
  
  
  
  回溯到2000年的1月,當人們正在爭論著公元2000年究竟是一個世紀的開始還是一個實際的結束的時候,一份新的java規范——JSR(Java Specification Request)51也被審核通過了。這份JSR的名字是《New I/O APIs for the Java Platform》(JAVA平臺的新I/O API)。許多人認為這份新的規范只會給大家帶來非阻塞I/O操作的能力,但是在JSDK1.4Beta(JavaTM 2 Platform, Standard Edition)中引入的新的特性,卻還包含其它的一些新而有趣的特征。新的API在提供了可升級的套接口(socket)和文件I/O操作的同時(這是理所當然的),你也可以找到一個正則表達的包來支持模式匹配,以及對字符集轉換的編碼器和解碼器,和優化過的文件系統支持如文件鎖定、內存映射等功能。我們在這篇文章中的討論會全面覆蓋上面所說的四個新特性。注重:JAVA本地接口(JNI)為新的I/O操作所做的修改我們將不會涉及,假如你需要了解有關的內容,請參考本文結尾“資源”部分的有關內容。
  
  
  
  Buffers
  
  
  
  按照從最簡單到最復雜的習慣,我們將從java.nio包中的一系列Buffer類開始說起。Buffer提供了一種在內存容器中保存一系列原始數據的機制?;旧?,你可以設想一下,把DataInputStream/DataOutputStream組合在一起封裝成一個固定字節大小的數組而只答應讀寫一種數據類型,例如char,int,或者double。在這個包里,總共有7種這樣的Buffer可用:
  
  
  
  · ByteBuffer · CharBuffer · DoubleBuffer · FloatBuffer · IntBuffer · LongBuffer · ShortBuffer
  
  
  
  實際上,ByteBuffer也能夠對其它六種類型進行讀寫,但是這些非凡的Buffer更有針對性,更專門化一些。為了示范如何使用一個Buffer,接下來這一小片代碼將完成一個從String型變量到一個CharBuffer的轉換,并從這個Buffer中逐一的讀出單個字符。你可以用warp方法來完成轉換,用get方法來取一個字符。
  
  
  
  CharBuffer buff = CharBuffer.wrap(args[0]);
  
  for (int i=0, n=buff.length(); i  
  {System.out.PRintln(buff.get());}
  
  
  
  在使用Buffer的時候,一定要注重它目前的大?。╯izing)和位置(positioning)的值是有區別的,千萬不要混淆了。方法length是不規范的,尤其是對于CharBuffer而言。當然這并非是出了什么錯,而是它返回的是Buffer中的剩余長度的值,所以假如position并非在Buffer的開始處的話,返回值將不是Buffer的長度,而是在Buffer中剩余的字符的長度。換句話說,上面程序中的循環也可以修改成這樣:
  
  
  
  CharBuffer buff = CharBuffer.wrap(args[0]);
  
  for (int i=0; buff.length() 0; i++)
  
  {System.out.println(buff.get());}
  
  
  
  我們回到正題,繼續討論大?。╯izing)和位置(positioning)的關系,在這里,有四個概念必須明確,它們是mark(標記),position(位置),limit(限制),和capacity(容量)?!?mark——用mark方法設置的可設位置,mark方法可以使用reset來重置position,<=position,=0;· position——在Buffer中目前讀寫的位置,<=limit;· limit——第一個不應該被讀取的元素的位置的index(索引號),<=cpacity;· capcity——Buffer的大小,=size。Position(位置)屬性值是我們在對一個Buffer讀取或者寫入的時候需要時刻牢記的信息。例如,假如你想讀取你剛剛寫入的字符,你不許把position移動到你想讀取的位置,否則,你將越過limit的限制,而讀到一個不知道是什么的字符。這時候你需要馬上使用flip方法,把limit移動到當前的位置,并把position移動到0位置。你也可以回繞一個buffer來保持當前的limit位置,而把position返回到0位置。舉個例子,假如從下面這一小段代碼中的flip調用去掉,將返回一個空白,因為在buffer中還什么都沒有。
  
  
  
  buff.put('a');
  
  buff.flip();
  
  buff.get();
  
  
  
  上面的封裝機制是一個非直接緩沖(non-direct buffer)的例子。非直接緩沖也可以通過allocate方法來創建和限定大小,本質上來說,只是把數據封裝到一個數組里了。假如愿意消耗稍微多一點的創建資源,你也可以通過allocateDirect方法開辟一塊連續的內存來保存數據,這也可以稱作直接緩沖。直接緩沖是依靠于系統的本地接口的I/O操作來優化存取操作的。
  
  
  
  文件映射
  
  
  
  MappedByteBuffer是一個專門用于直接緩沖的ByteBuffer,這個類用字節緩沖來映射一個文件。想要映射一個文件到MappedByteBuffer,你必須先取得這個文件的通道(channel)。通道是某種已建立的連接,例如管道(pipe),套接口(socket),或者文件(file)等能夠完成I/O操作的對象。假如是文件通道,你可以通過FileInputStream(文件輸入流),FileOutputStream(文件輸出流)或者RandomaccessFile(隨機存取文件)的getChannel方法來獲得一個通道。一旦你取得這個通道,你就可以通過它的map方法,指明映射模式來把你想映射的那一部分文件映射到緩沖中去。文件通道可以使用FileChannel.MapMode的任一個常數打開:只讀(READ_ONLY),私有/寫時拷貝(PRIVATE),或者讀寫(READ_WRITE)。下面是一個從文件中創建只讀的MappedByteBuffer的基本例程:
  
  
  
  String filename = ...;
  
  FileInputStream input = new FileInputStream(filename);
  
  FileChannel channel = input.getChannel();
  
  int fileLength = (int)channel.size();
  
  MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, fileLength);
  
  
  
  你可以在java.nio.channels包里找到與通道有關的類。一旦MappedByteBuffer被建立了,你就可以象存取其它任何ByteBuffer一樣來操作它。當然在這個例子里它是只讀的,所以加入你試圖寫入一些東西的時候,它會拋出一個NonWritableChannelException的異常。假如你想把它當作字符來處理的話,你必須制定一個字符集把ByteBuffer轉化成CharBuffer。這個字符集是在Charset類中定義的。然后你用CharsetDecoder類對文件的內容進行解碼。它相反的操作是由CharsetEncoder類來完成的。
  
  
  
  // ISO-8859-1 是ISO拉丁字符表#1Charset
  
  charset = Charset.forName("ISO-8859-1");
  
  CharsetDecoder decoder = charset.newDecoder();
  
  CharBuffer charBuffer = decoder.decode(buffer);
  
  
  
  這個類可以在java.nio.charset包中找到。
  
  
  
  正則表達式
  
  
  
  一旦你完成了從文件到CharBuffer的可輸入映射,你就可以對文件內容進行模式匹配。就像我們分別使用grep命令和wc命令來進行正則表達的匹配和單詞計數一樣。其中使用到了java.util.regex中的Pattern和Matcher兩個類。Pattern類為匹配正則表達提供了所有的構造類型。一般來說,你的模式表達是一個字符串,可以查閱類文檔得到模式的完整細節,這里只提供一些簡單常用的例子:· 行模式,任意個字符然后以回車換行借宿并且/或者行結束:.* ?或.*$ · 連續的數字:[0-9]* 或者 d*· 一個控制符:{cntrl}· 一個大寫或者小寫US-ASCII字符,接著一個空格,接著標點:[p{Lower}p{Upper}]sp{Punct}注:不幸的是,J2SE 1.4 beta3中打斷了這一切,因為它對正則表達式所必須的字符緩沖的次序支持的非常不好。從SUN的Bug Parade可以看到這個問題的具體資料(希望你有JDC的帳號,呵呵,沒有就快去申請啊,還愣著干什么?)。很遺憾,這意味著你不能用模式匹配同時去讀取一個詞或者一行。假如想獲得更多的有關正則表達式庫的信息,可以參考本文最后所列“資源”中的《Regular EXPressions and the Java Programming Language》(正則表達和java編程語言)
  
  
  
  套接口通道
  
  
  
  下面我們要從文件通道轉移到讀寫一個套接口連接的通道中來。這個通道可以用做阻塞模式,也可以用作非阻塞模式。假如是阻塞模式,取決于你的程序是服務器端還是客戶端,只需把你的調用換成connect或者accept。而在非阻塞模式,它們的處理方式是不一樣的。這些新類處理基本套接口的讀寫操作。在java.net包中的InetSocketAddress類指定連接地址,java.nio.channels包中的SocketChannel類來完成實際的讀寫操作。使用InetSocketAddress來進行連接非常類似于普通的Socket類的操作。你所要做的一切僅僅是提供主機和端口號:
  
  
  
  String host = ...;
  
  InetSocketAddress socketAddress = new InetSocketAddress(host, 80);
  
  
  
  一旦你獲得了InetSocketAddress,一切都改變了(怎么聽著象童話^&^)。你可以打開一個SocketChannel來連接到InetSocketAddress,用它來取代我們以前從套接口的輸入流來讀取、向套接口的輸出流寫入的所有操作:
  
  
  
  SocketChannel channel = SocketChannel.open();
  
  channel.connect(socketAddress);
  
  
  
  在連接完成之后,你馬上可以使用By

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产欧美日韩精品丝袜高跟鞋| 日本中文字幕不卡免费| 国产精品影院在线观看| 中文字幕国产日韩| 久久精品视频va| 国产精品久久久久久一区二区| 欧美日韩激情视频8区| 亚洲二区中文字幕| 国产精品久久久久久久久免费| 久久精品视频在线| 亚洲国产精品人久久电影| 欧美成人中文字幕| 中日韩美女免费视频网址在线观看| 精品国产一区二区三区四区在线观看| 欧美日韩亚洲系列| 久久天天躁狠狠躁夜夜躁2014| 97人洗澡人人免费公开视频碰碰碰| 国产精品自产拍在线观看| 亚洲一区国产精品| 欧美日韩国产区| 日韩色av导航| 欧美日韩视频在线| 欧美肥臀大乳一区二区免费视频| 欧美一区二区大胆人体摄影专业网站| 北条麻妃一区二区三区中文字幕| 日韩av电影手机在线| 成人黄色在线免费| 亚洲人成伊人成综合网久久久| www.xxxx精品| 91香蕉电影院| 黑人与娇小精品av专区| 57pao成人永久免费视频| 亚洲va电影大全| 一本一道久久a久久精品逆3p| 成人春色激情网| 欧美日韩国产精品一区二区三区四区| 久久亚洲电影天堂| 国产一级揄自揄精品视频| 中文字幕在线看视频国产欧美在线看完整| 亚洲视频综合网| 精品视频偷偷看在线观看| 国产精品欧美一区二区三区奶水| 久久久欧美一区二区| 亚洲第一页自拍| 久久久亚洲福利精品午夜| 九九热精品视频在线播放| 欧美视频在线免费| 中文字幕日韩欧美在线| 久久人人97超碰精品888| 亚洲精品国产精品国自产在线| 91久久精品国产91久久| 7777精品久久久久久| 欧美日韩国产一中文字不卡| 久久精品成人欧美大片| 日韩国产精品一区| 91探花福利精品国产自产在线| 这里只有精品视频在线| 国产免费一区二区三区香蕉精| 中文字幕精品一区久久久久| 亚洲色图av在线| 日韩免费看的电影电视剧大全| 亚洲欧洲一区二区三区久久| 亚洲福利视频在线| 日韩国产精品视频| 欧美疯狂做受xxxx高潮| 亚洲精品中文字幕有码专区| 亚洲三级免费看| 在线成人中文字幕| 日韩在线观看成人| 中文字幕免费国产精品| 国产欧美精品va在线观看| 亚洲国产91精品在线观看| 亚洲a成v人在线观看| 亚洲天堂色网站| 成人黄色短视频在线观看| 高跟丝袜欧美一区| 国产成人精品一区| 色综合91久久精品中文字幕| 欧美性受xxxx黑人猛交| 久久男人资源视频| 中文字幕日韩精品在线观看| 国产精自产拍久久久久久| 欧美日韩国产激情| 日韩电影在线观看免费| 欧美激情一级欧美精品| 91欧美视频网站| 欧美激情a∨在线视频播放| 国产aⅴ夜夜欢一区二区三区| 亚洲免费成人av电影| 色偷偷噜噜噜亚洲男人的天堂| 国产成人精品国内自产拍免费看| 精品人伦一区二区三区蜜桃网站| 91国产在线精品| 日韩av高清不卡| 欧美另类第一页| 中文字幕av一区| 国产亚洲精品久久久久久牛牛| zzjj国产精品一区二区| 日韩免费中文字幕| 欧美一区二区三区四区在线| 日韩精品中文字幕在线观看| 91精品国产99久久久久久| 欧美性色xo影院| 亚洲性视频网站| www亚洲欧美| 国产日韩精品入口| 亚洲精品美女久久久久| 91精品久久久久久久久中文字幕| 成人性生交大片免费看小说| 欧美午夜性色大片在线观看| 91精品国产高清久久久久久91| 欧美精品成人91久久久久久久| 国语自产精品视频在线看抢先版图片| 91香蕉嫩草影院入口| 欧美国产日韩二区| 在线性视频日韩欧美| 日韩欧美极品在线观看| 精品久久久一区| 2020国产精品视频| 日韩精品视频免费| 日韩美女免费观看| 日韩av在线免费看| 精品国产一区二区三区久久久狼| 国产精品电影观看| 国产视频精品一区二区三区| 久久人人爽亚洲精品天堂| 成人写真视频福利网| 欧美有码在线视频| 国产亚洲欧洲黄色| 爱福利视频一区| 欧美日韩国产123| 国产日韩欧美视频在线| 日韩在线观看免费高清| 欧美寡妇偷汉性猛交| 国产成人精品久久久| 久久亚洲精品网站| 性色av一区二区三区免费| 欧美一级电影免费在线观看| 国产亚洲欧美日韩精品| 久久久久久久999精品视频| 亚洲美女福利视频网站| 欧美午夜激情视频| 亚洲精品中文字幕女同| 久久综合色影院| 国产精品揄拍一区二区| 欧美一区亚洲一区| 成人免费视频网址| 久久久国产一区二区三区| 国产欧美日韩视频| 国产午夜精品免费一区二区三区| 欧美精品免费看| 久久偷看各类女兵18女厕嘘嘘| 国产精品久久久久久久久男| 亚洲一区二区三区乱码aⅴ| 久久99精品视频一区97| 日韩在线观看你懂的| 久久久久久久一区二区三区| 成人夜晚看av| 国产精品主播视频| 国产97在线播放| 亚洲色图校园春色| 26uuu亚洲伊人春色| 97在线免费观看| 国产欧美一区二区三区在线看|