娣卞叆鍒嗘瀽 Java I/O 鐨勫伐浣滄満鍒

娣卞叆鍒嗘瀽 Java I/O 鐨勫伐浣滄満鍒?

Java I/O 绫诲簱鐨勫熀鏈灦鏋?/strong>

I/O 闂鏄换浣曠紪绋嬭瑷€閮芥棤娉曞洖閬跨殑闂锛屽彲浠ヨ I/O 闂鏄暣涓汉鏈轰氦浜掔殑鏍稿績闂锛屽洜涓?I/O 鏄満鍣ㄨ幏鍙栧拰浜ゆ崲淇℃伅鐨勪富瑕佹笭閬撱€傚湪褰撲粖杩欎釜鏁版嵁澶х垎鐐告椂浠o紝I/O 闂灏ゅ叾绐佸嚭锛屽緢瀹规槗鎴愪负涓€涓€ц兘鐡堕銆傛鍥犲姝わ紝鎵€浠?Java 鍦?I/O 涓婁篃涓€鐩村湪鍋氭寔缁殑浼樺寲锛屽浠?1.4 寮€濮嬪紩鍏ヤ簡 NIO锛屾彁鍗囦簡 I/O 鐨勬€ц兘銆傚叧浜?NIO 鎴戜滑灏嗗湪鍚庨潰璇︾粏浠嬬粛銆?/p>

Java 鐨?I/O 鎿嶄綔绫诲湪鍖?java.io 涓嬶紝澶ф鏈夊皢杩?80 涓被锛屼絾鏄繖浜涚被澶ф鍙互鍒嗘垚鍥涚粍锛屽垎鍒槸锛?/p>

  1. 鍩轰簬瀛楄妭鎿嶄綔鐨?I/O 鎺ュ彛锛欼nputStream 鍜?OutputStream
  2. 鍩轰簬瀛楃鎿嶄綔鐨?I/O 鎺ュ彛锛歐riter 鍜?Reader
  3. 鍩轰簬纾佺洏鎿嶄綔鐨?I/O 鎺ュ彛锛欶ile
  4. 鍩轰簬缃戠粶鎿嶄綔鐨?I/O 鎺ュ彛锛歋ocket

鍓嶄袱缁勪富瑕佹槸鏍规嵁浼犺緭鏁版嵁鐨勬暟鎹牸寮忥紝鍚庝袱缁勪富瑕佹槸鏍规嵁浼犺緭鏁版嵁鐨勬柟寮忥紝铏界劧 Socket 绫诲苟涓嶅湪 java.io 鍖呬笅锛屼絾鏄垜浠嶇劧鎶婂畠浠垝鍒嗗湪涓€璧凤紝鍥犱负鎴戜釜浜鸿涓?I/O 鐨勬牳蹇冮棶棰樿涔堟槸鏁版嵁鏍煎紡褰卞搷 I/O 鎿嶄綔锛岃涔堟槸浼犺緭鏂瑰紡褰卞搷 I/O 鎿嶄綔锛屼篃灏辨槸灏嗕粈涔堟牱鐨勬暟鎹啓鍒颁粈涔堝湴鏂圭殑闂锛孖/O 鍙槸浜轰笌鏈哄櫒鎴栬€呮満鍣ㄤ笌鏈哄櫒浜や簰鐨勬墜娈碉紝闄や簡鍦ㄥ畠浠兘澶熷畬鎴愯繖涓氦浜掑姛鑳藉锛屾垜浠叧娉ㄧ殑灏辨槸濡備綍鎻愰珮瀹冪殑杩愯鏁堢巼浜嗭紝鑰屾暟鎹牸寮忓拰浼犺緭鏂瑰紡鏄奖鍝嶆晥鐜囨渶鍏?閿殑鍥犵礌浜嗐€傛垜浠悗闈㈢殑鍒嗘瀽涔熸槸鍩轰簬杩欎袱涓洜绱犳潵灞曞紑鐨勩€?/p>

鍩轰簬瀛楄妭鐨?I/O 鎿嶄綔鎺ュ彛杈撳叆鍜岃緭鍑哄垎鍒槸锛欼nputStream 鍜?OutputStream锛孖nputStream 杈撳叆娴佺殑绫荤户鎵垮眰娆″涓嬪浘鎵€绀猴細


娣卞叆鍒嗘瀽 Java I/O 鐨勫伐浣滄満鍒

杈撳叆娴佹牴鎹暟鎹被鍨嬪拰鎿嶄綔鏂瑰紡鍙堣鍒掑垎鎴愯嫢骞蹭釜瀛愮被锛屾瘡涓瓙绫诲垎鍒鐞嗕笉鍚屾搷浣滅被鍨嬶紝OutputStream 杈撳嚭娴佺殑绫诲眰娆$粨鏋勪篃鏄被浼硷紝濡備笅鍥炬墍绀猴細


娣卞叆鍒嗘瀽 Java I/O 鐨勫伐浣滄満鍒

杩欓噷灏变笉璇︾粏瑙i噴姣忎釜瀛愮被濡備綍浣跨敤浜嗭紝濡傛灉涓嶆竻妤氱殑璇濆彲浠ュ弬鑰冧竴涓?JDK 鐨?API 璇存槑鏂囨。锛岃繖閲屽彧鎯宠鏄庝袱鐐癸紝涓€涓槸鎿嶄綔鏁版嵁鐨勬柟寮忔槸鍙互缁勫悎浣跨敤鐨勶紝濡傝繖鏍风粍鍚堜娇鐢細

OutputStream out = new BufferedOutputStream(new ObjectOutputStream(new FileOutputStream("fileName"))锛?/pre>


杩樻湁涓€鐐规槸娴佹渶缁堝啓鍒颁粈涔堝湴鏂瑰繀椤昏鎸囧畾锛岃涔堟槸鍐欏埌纾佺洏瑕佷箞鏄啓鍒扮綉缁滀腑锛屽叾瀹炰粠涓婇潰鐨勭被鍥句腑鎴戜滑鍙戠幇锛屽啓缃戠粶瀹為檯涓婁篃鏄啓鏂囦欢锛屽彧涓嶈繃鍐欑綉缁滆繕鏈変竴姝ラ渶瑕佸鐞嗗氨鏄簳灞傛搷浣滅郴缁熷啀灏嗘暟鎹紶閫佸埌鍏跺畠鍦版柟鑰屼笉鏄湰鍦扮鐩樸€傚叧浜庣綉缁?I/O 鍜岀鐩?I/O 鎴戜滑灏嗗湪鍚庨潰璇︾粏浠嬬粛銆?br>
鍩轰簬瀛楃鐨?I/O 鎿嶄綔鎺ュ彛
涓嶇鏄鐩樿繕鏄綉缁滀紶杈擄紝鏈€灏忕殑瀛樺偍鍗曞厓閮芥槸瀛楄妭锛岃€屼笉鏄瓧绗︼紝鎵€浠?I/O 鎿嶄綔鐨勯兘鏄瓧鑺傝€屼笉鏄瓧绗︼紝浣嗘槸涓哄暐鏈夋搷浣滃瓧绗︾殑 I/O 鎺ュ彛鍛紵杩欐槸鍥犱负鎴戜滑鐨勭▼搴忎腑閫氬父鎿嶄綔鐨勬暟鎹兘鏄互瀛楃褰㈠紡锛屼负浜嗘搷浣滄柟渚垮綋鐒惰鎻愪緵涓€涓洿鎺ュ啓瀛楃鐨?I/O 鎺ュ彛锛屽姝よ€屽凡銆傛垜浠煡閬撳瓧绗﹀埌瀛楄妭蹇呴』瑕佺粡杩囩紪鐮佽浆鎹紝鑰岃繖涓紪鐮佸張闈炲父鑰楁椂锛岃€屼笖杩樹細缁忓父鍑虹幇涔辩爜闂锛屾墍浠?I/O 鐨勭紪鐮侀棶棰樼粡甯告槸璁╀汉澶寸柤鐨勯棶棰樸€傚叧浜?I/O 缂栫爜闂璇峰弬鑰冨彟涓€绡囨枃绔?銆婃繁鍏ュ垎鏋怞ava涓殑涓枃缂栫爜闂銆嬨€?br>
涓嬪浘鏄啓瀛楃鐨?I/O 鎿嶄綔鎺ュ彛娑夊強鍒扮殑绫伙紝Writer 绫绘彁渚涗簡涓€涓娊璞℃柟娉?write(char cbuf[], int off, int len) 鐢卞瓙绫诲幓瀹炵幇銆?/p>

鍥?3. Writer 鐩稿叧绫诲眰娆$粨鏋?br>娣卞叆鍒嗘瀽 Java I/O 鐨勫伐浣滄満鍒

璇诲瓧绗︾殑鎿嶄綔鎺ュ彛涔熸湁绫讳技鐨勭被缁撴瀯锛屽涓嬪浘鎵€绀猴細
鍥?4.Reader 绫诲眰娆$粨鏋?/p>


娣卞叆鍒嗘瀽 Java I/O 鐨勫伐浣滄満鍒

璇诲瓧绗︾殑鎿嶄綔鎺ュ彛涓篃鏄?int read(char cbuf[], int off, int len)锛岃繑鍥炶鍒扮殑 n 涓瓧鑺傛暟锛屼笉绠℃槸 Writer 杩樻槸 Reader 绫诲畠浠兘鍙畾涔変簡璇诲彇鎴栧啓鍏ョ殑鏁版嵁瀛楃鐨勬柟寮忥紝涔熷氨鏄€庝箞鍐欐垨璇伙紝浣嗘槸骞舵病鏈夎瀹氭暟鎹鍐欏埌鍝幓锛屽啓鍒板摢鍘诲氨鏄垜浠悗闈㈣璁ㄨ鐨勫熀浜庣鐩樺拰缃戠粶鐨勫伐浣滄満鍒躲€?br>
瀛楄妭涓庡瓧绗︾殑杞寲鎺ュ彛
鍙﹀鏁版嵁鎸佷箙鍖栨垨缃戠粶浼犺緭閮芥槸浠ュ瓧鑺傝繘琛岀殑锛屾墍浠ュ繀椤昏鏈夊瓧绗﹀埌瀛楄妭鎴栧瓧鑺傚埌瀛楃鐨勮浆鍖栥€傚瓧绗﹀埌瀛楄妭闇€瑕佽浆鍖栵紝鍏朵腑璇荤殑杞寲杩囩▼濡備笅鍥炬墍绀猴細

鍥?5. 瀛楃瑙g爜鐩稿叧绫荤粨鏋?/p>


娣卞叆鍒嗘瀽 Java I/O 鐨勫伐浣滄満鍒

InputStreamReader 绫绘槸瀛楄妭鍒板瓧绗︾殑杞寲妗ユ锛孖nputStream 鍒?Reader 鐨勮繃绋嬭鎸囧畾缂栫爜瀛楃闆嗭紝鍚﹀垯灏嗛噰鐢ㄦ搷浣滅郴缁熼粯璁ゅ瓧绗﹂泦锛屽緢鍙兘浼氬嚭鐜颁贡鐮侀棶棰樸€係treamDecoder 姝f槸瀹屾垚瀛楄妭鍒板瓧绗︾殑瑙g爜鐨勫疄鐜扮被銆備篃灏辨槸褰撲綘鐢ㄥ涓嬫柟寮忚鍙栦竴涓枃浠舵椂锛?br>
娓呭崟 1.璇诲彇鏂囦欢

try { 
            StringBuffer str = new StringBuffer(); 
            char[] buf = new char[1024]; 
            FileReader f = new FileReader("file"); 
            while(f.read(buf)>0){ 
                str.append(buf); 
            } 
            str.toString(); 
 } catch (IOException e) {} 

FileReader 绫诲氨鏄寜鐓т笂闈㈢殑宸ヤ綔鏂瑰紡璇诲彇鏂囦欢鐨勶紝FileReader 鏄户鎵夸簡 InputStreamReader 绫伙紝瀹為檯涓婃槸璇诲彇鏂囦欢娴侊紝鐒跺悗閫氳繃 StreamDecoder 瑙g爜鎴?char锛屽彧涓嶈繃杩欓噷鐨勮В鐮佸瓧绗﹂泦鏄粯璁ゅ瓧绗﹂泦銆傚啓鍏ヤ篃鏄被浼肩殑杩囩▼濡備笅鍥炬墍绀恒€?br>
鍥?6. 瀛楃缂栫爜鐩稿叧绫荤粨鏋?/p>


娣卞叆鍒嗘瀽 Java I/O 鐨勫伐浣滄満鍒

閫氳繃 OutputStreamWriter 绫诲畬鎴愶紝瀛楃鍒板瓧鑺傜殑缂栫爜杩囩▼锛岀敱 StreamEncoder 瀹屾垚缂栫爜杩囩▼銆?/p>

纾佺洏 I/O 宸ヤ綔鏈哄埗
鍓嶉潰浠嬬粛浜嗗熀鏈殑 Java I/O 鐨勬搷浣滄帴鍙o紝杩欎簺鎺ュ彛涓昏瀹氫箟浜嗗浣曟搷浣滄暟鎹紝浠ュ強浠嬬粛浜嗘搷浣滀袱绉嶆暟鎹粨鏋勶細瀛楄妭鍜屽瓧绗︾殑鏂瑰紡銆傝繕鏈変竴涓叧閿棶棰樺氨鏄暟鎹啓鍒颁綍澶勶紝鍏朵腑涓€涓富瑕佹柟寮忓氨鏄皢鏁版嵁鎸佷箙鍖栧埌鐗╃悊纾佺洏锛屼笅闈㈠皢浠嬬粛濡備綍灏嗘暟鎹寔涔呭寲鍒扮墿鐞嗙鐩樼殑杩囩▼銆?br>
鎴戜滑鐭ラ亾鏁版嵁鍦ㄧ鐩樼殑鍞竴鏈€灏忔弿杩板氨鏄枃浠讹紝涔熷氨鏄涓婂眰搴旂敤绋嬪簭鍙兘閫氳繃鏂囦欢鏉ユ搷浣滅鐩樹笂鐨勬暟鎹紝鏂囦欢涔熸槸鎿嶄綔绯荤粺鍜岀鐩橀┍鍔ㄥ櫒浜や簰鐨勪竴涓渶灏忓崟鍏冦€傚€煎緱娉ㄦ剰鐨勬槸 Java 涓€氬父鐨?File 骞朵笉浠h〃涓€涓湡瀹炲瓨鍦ㄧ殑鏂囦欢瀵硅薄锛屽綋浣犻€氳繃鎸囧畾涓€涓矾寰勬弿杩扮鏃讹紝瀹冨氨浼氳繑鍥炰竴涓唬琛ㄨ繖涓矾寰勭浉鍏宠仈鐨勪竴涓櫄鎷熷璞★紝杩欎釜鍙兘鏄竴涓湡瀹炲瓨鍦ㄧ殑鏂囦欢鎴栬€呮槸涓€涓寘鍚涓枃浠剁殑鐩綍銆備负浣曡杩欐牱璁捐锛熷洜涓哄ぇ閮ㄥ垎鎯呭喌涓嬶紝鎴戜滑骞朵笉鍏冲績杩欎釜鏂囦欢鏄惁鐪熺殑瀛樺湪锛岃€屾槸鍏冲績杩欎釜鏂囦欢鍒板簳濡備綍鎿嶄綔銆備緥濡傛垜浠墜鏈洪噷閫氬父瀛樹簡鍑犵櫨涓湅鍙嬬殑鐢佃瘽鍙风爜锛屼絾鏄垜浠€氬父鍏冲績鐨勬槸鎴戞湁娌℃湁杩欎釜鏈嬪弸鐨勭數璇濆彿鐮侊紝鎴栬€呰繖涓數璇濆彿鐮佹槸浠€涔堬紝浣嗘槸杩欎釜鐢佃瘽鍙风爜鍒板簳鑳戒笉鑳芥墦閫氾紝鎴戜滑骞朵笉鏄椂鏃跺埢鍒婚兘鍘绘鏌ワ紝鑰屽彧鏈夊湪鐪熸瑕佺粰浠栨墦鐢佃瘽鏃舵墠浼氱湅杩欎釜鐢佃瘽鑳戒笉鑳界敤銆備篃灏辨槸浣跨敤杩欎釜鐢佃瘽璁板綍瑕佹瘮鎵撹繖涓數璇濈殑娆℃暟澶氬緢澶氥€?br>
浣曟椂鐪熸浼氳妫€鏌ヤ竴涓枃浠跺瓨涓嶅瓨锛熷氨鏄湪鐪熸瑕佽鍙栬繖涓枃浠舵椂锛屼緥濡?FileInputStream 绫婚兘鏄搷浣滀竴涓枃浠剁殑鎺ュ彛锛屾敞鎰忓埌鍦ㄥ垱寤轰竴涓?FileInputStream 瀵硅薄鏃讹紝浼氬垱寤轰竴涓?FileDescriptor 瀵硅薄锛屽叾瀹炶繖涓璞″氨鏄湡姝d唬琛ㄤ竴涓瓨鍦ㄧ殑鏂囦欢瀵硅薄鐨勬弿杩帮紝褰撴垜浠湪鎿嶄綔涓€涓枃浠跺璞℃椂鍙互閫氳繃 getFD() 鏂规硶鑾峰彇鐪熸鎿嶄綔鐨勪笌搴曞眰鎿嶄綔绯荤粺鍏宠仈鐨勬枃浠舵弿杩般€備緥濡傚彲浠ヨ皟鐢?FileDescriptor.sync() 鏂规硶灏嗘搷浣滅郴缁熺紦瀛樹腑鐨勬暟鎹己鍒跺埛鏂板埌鐗╃悊纾佺洏涓€?br>
涓嬮潰浠ユ竻鍗?1 鐨勭▼搴忎负渚嬶紝浠嬬粛涓嬪浣曚粠纾佺洏璇诲彇涓€娈垫枃鏈瓧绗︺€傚涓嬪浘鎵€绀恒€?br>鍥?7. 浠庣鐩樿鍙栨枃浠?/p>


娣卞叆鍒嗘瀽 Java I/O 鐨勫伐浣滄満鍒

褰撲紶鍏ヤ竴涓枃浠惰矾寰勶紝灏嗕細鏍规嵁杩欎釜璺緞鍒涘缓涓€涓?File 瀵硅薄鏉ユ爣璇嗚繖涓枃浠讹紝鐒跺悗灏嗕細鏍规嵁杩欎釜 File 瀵硅薄鍒涘缓鐪熸璇诲彇鏂囦欢鐨勬搷浣滃璞★紝杩欐椂灏嗕細鐪熸鍒涘缓涓€涓叧鑱旂湡瀹炲瓨鍦ㄧ殑纾佺洏鏂囦欢鐨勬枃浠舵弿杩扮 FileDescriptor锛岄€氳繃杩欎釜瀵硅薄鍙互鐩存帴鎺у埗杩欎釜纾佺洏鏂囦欢銆傜敱浜庢垜浠渶瑕佽鍙栫殑鏄瓧绗︽牸寮忥紝鎵€浠ラ渶瑕?StreamDecoder 绫诲皢 byte 瑙g爜涓?char 鏍煎紡锛岃嚦浜庡浣曚粠纾佺洏椹卞姩鍣ㄤ笂璇诲彇涓€娈垫暟鎹紝鐢辨搷浣滅郴缁熷府鎴戜滑瀹屾垚銆傝嚦浜庢搷浣滅郴缁熸槸濡備綍灏嗘暟鎹寔涔呭寲鍒扮鐩樹互鍙婂浣曞缓绔嬫暟鎹粨鏋勯渶瑕佹牴鎹綋鍓嶆搷浣滅郴缁熶娇鐢ㄤ綍绉嶆枃浠剁郴缁熸潵鍥炵瓟锛岃嚦浜庢枃浠剁郴缁熺殑鐩稿叧缁嗚妭鍙互鍙傝€冨彟澶栫殑鏂囩珷銆?/p>

Java Socket 鐨勫伐浣滄満鍒?/strong>
Socket 杩欎釜姒傚康娌℃湁瀵瑰簲鍒颁竴涓叿浣撶殑瀹炰綋锛屽畠鏄弿杩拌绠楁満涔嬮棿瀹屾垚鐩镐簰閫氫俊涓€绉嶆娊璞″姛鑳姐€傛墦涓瘮鏂癸紝鍙互鎶?Socket 姣斾綔涓轰袱涓煄甯備箣闂寸殑浜ら€氬伐鍏凤紝鏈変簡瀹冿紝灏卞彲浠ュ湪鍩庡競涔嬮棿鏉ュ洖绌挎浜嗐€備氦閫氬伐鍏锋湁澶氱锛屾瘡绉嶄氦閫氬伐鍏蜂篃鏈夌浉搴旂殑浜ら€氳鍒欍€係ocket 涔熶竴鏍凤紝涔熸湁澶氱銆傚ぇ閮ㄥ垎鎯呭喌涓嬫垜浠娇鐢ㄧ殑閮芥槸鍩轰簬 TCP/IP 鐨勬祦濂楁帴瀛楋紝瀹冩槸涓€绉嶇ǔ瀹氱殑閫氫俊鍗忚銆?br>
涓嬪浘鏄吀鍨嬬殑鍩轰簬 Socket 鐨勯€氫俊鐨勫満鏅細


娣卞叆鍒嗘瀽 Java I/O 鐨勫伐浣滄満鍒

涓绘満 A 鐨勫簲鐢ㄧ▼搴忚鑳藉拰涓绘満 B 鐨勫簲鐢ㄧ▼搴忛€氫俊锛屽繀椤婚€氳繃 Socket 寤虹珛杩炴帴锛岃€屽缓绔?Socket 杩炴帴蹇呴』闇€瑕佸簳灞?TCP/IP 鍗忚鏉ュ缓绔?TCP 杩炴帴銆傚缓绔?TCP 杩炴帴闇€瑕佸簳灞?IP 鍗忚鏉ュ鍧€缃戠粶涓殑涓绘満銆傛垜浠煡閬撶綉缁滃眰浣跨敤鐨?IP 鍗忚鍙互甯姪鎴戜滑鏍规嵁 IP 鍦板潃鏉ユ壘鍒扮洰鏍囦富鏈猴紝浣嗘槸涓€鍙颁富鏈轰笂鍙兘杩愯鐫€澶氫釜搴旂敤绋嬪簭锛屽浣曟墠鑳戒笌鎸囧畾鐨勫簲鐢ㄧ▼搴忛€氫俊灏辫閫氳繃 TCP 鎴?UPD 鐨勫湴鍧€涔熷氨鏄鍙e彿鏉ユ寚瀹氥€傝繖鏍峰氨鍙互閫氳繃涓€涓?Socket 瀹炰緥鍞竴浠h〃涓€涓富鏈轰笂鐨勪竴涓簲鐢ㄧ▼搴忕殑閫氫俊閾捐矾浜嗐€?br>
寤虹珛閫氫俊閾捐矾
褰撳鎴风瑕佷笌鏈嶅姟绔€氫俊锛屽鎴风棣栧厛瑕佸垱寤轰竴涓?Socket 瀹炰緥锛屾搷浣滅郴缁熷皢涓鸿繖涓?Socket 瀹炰緥鍒嗛厤涓€涓病鏈夎浣跨敤鐨勬湰鍦扮鍙e彿锛屽苟鍒涘缓涓€涓寘鍚湰鍦板拰杩滅▼鍦板潃鍜岀鍙e彿鐨勫鎺ュ瓧鏁版嵁缁撴瀯锛岃繖涓暟鎹粨鏋勫皢涓€鐩翠繚瀛樺湪绯荤粺涓洿鍒拌繖涓繛鎺ュ叧闂€傚湪鍒涘缓 Socket 瀹炰緥鐨勬瀯閫犲嚱鏁版纭繑鍥炰箣鍓嶏紝灏嗚杩涜 TCP 鐨勪笁娆℃彙鎵嬪崗璁紝TCP 鎻℃墜鍗忚瀹屾垚鍚庯紝Socket 瀹炰緥瀵硅薄灏嗗垱寤哄畬鎴愶紝鍚﹀垯灏嗘姏鍑?IOException 閿欒銆?br>
涓庝箣瀵瑰簲鐨勬湇鍔$灏嗗垱寤轰竴涓?ServerSocket 瀹炰緥锛孲erverSocket 鍒涘缓姣旇緝绠€鍗曞彧瑕佹寚瀹氱殑绔彛鍙锋病鏈夎鍗犵敤锛屼竴鑸疄渚嬪垱寤洪兘浼氭垚鍔燂紝鍚屾椂鎿嶄綔绯荤粺涔熶細涓?ServerSocket 瀹炰緥鍒涘缓涓€涓簳灞傛暟鎹粨鏋勶紝杩欎釜鏁版嵁缁撴瀯涓寘鍚寚瀹氱洃鍚殑绔彛鍙峰拰鍖呭惈鐩戝惉鍦板潃鐨勯€氶厤绗︼紝閫氬父鎯呭喌涓嬮兘鏄€?鈥濆嵆鐩戝惉鎵€鏈夊湴鍧€銆備箣鍚庡綋璋冪敤 accept() 鏂规硶鏃讹紝灏嗚繘鍏ラ樆濉炵姸鎬侊紝绛夊緟瀹㈡埛绔殑璇锋眰銆傚綋涓€涓柊鐨勮姹傚埌鏉ユ椂锛屽皢涓鸿繖涓繛鎺ュ垱寤轰竴涓柊鐨勫鎺ュ瓧鏁版嵁缁撴瀯锛岃濂楁帴瀛楁暟鎹殑淇℃伅鍖呭惈鐨勫湴鍧€鍜岀鍙d俊鎭鏄姹傛簮鍦板潃鍜岀鍙c€傝繖涓柊鍒涘缓鐨勬暟鎹粨鏋勫皢浼氬叧鑱斿埌 ServerSocket 瀹炰緥鐨勪竴涓湭瀹屾垚鐨勮繛鎺ユ暟鎹粨鏋勫垪琛ㄤ腑锛屾敞鎰忚繖鏃舵湇鍔$涓庝箣瀵瑰簲鐨?Socket 瀹炰緥骞舵病鏈夊畬鎴愬垱寤猴紝鑰岃绛夊埌涓庡鎴风鐨勪笁娆℃彙鎵嬪畬鎴愬悗锛岃繖涓湇鍔$鐨?Socket 瀹炰緥鎵嶄細杩斿洖锛屽苟灏嗚繖涓?Socket 瀹炰緥瀵瑰簲鐨勬暟鎹粨鏋勪粠鏈畬鎴愬垪琛ㄤ腑绉诲埌宸插畬鎴愬垪琛ㄤ腑銆傛墍浠?ServerSocket 鎵€鍏宠仈鐨勫垪琛ㄤ腑姣忎釜鏁版嵁缁撴瀯锛岄兘浠h〃涓庝竴涓鎴风鐨勫缓绔嬬殑 TCP 杩炴帴銆?br>
鏁版嵁浼犺緭
浼犺緭鏁版嵁鏄垜浠缓绔嬭繛鎺ョ殑涓昏鐩殑锛屽浣曢€氳繃 Socket 浼犺緭鏁版嵁锛屼笅闈㈠皢璇︾粏浠嬬粛銆?br>
褰撹繛鎺ュ凡缁忓缓绔嬫垚鍔燂紝鏈嶅姟绔拰瀹㈡埛绔兘浼氭嫢鏈変竴涓?Socket 瀹炰緥锛屾瘡涓?Socket 瀹炰緥閮芥湁涓€涓?InputStream 鍜?OutputStream锛屾鏄€氳繃杩欎袱涓璞℃潵浜ゆ崲鏁版嵁銆傚悓鏃舵垜浠篃鐭ラ亾缃戠粶 I/O 閮芥槸浠ュ瓧鑺傛祦浼犺緭鐨勩€傚綋 Socket 瀵硅薄鍒涘缓鏃讹紝鎿嶄綔绯荤粺灏嗕細涓?InputStream 鍜?OutputStream 鍒嗗埆鍒嗛厤涓€瀹氬ぇ灏忕殑缂撳啿鍖猴紝鏁版嵁鐨勫啓鍏ュ拰璇诲彇閮芥槸閫氳繃杩欎釜缂撳瓨鍖哄畬鎴愮殑銆?/p>

鍐欏叆绔皢鏁版嵁鍐欏埌 OutputStream 瀵瑰簲鐨?SendQ 闃熷垪涓紝褰撻槦鍒楀~婊℃椂锛屾暟鎹皢琚彂閫佸埌鍙︿竴绔?InputStream 鐨?RecvQ 闃熷垪涓紝濡傛灉杩欐椂 RecvQ 宸茬粡婊′簡锛岄偅涔?OutputStream 鐨?write 鏂规硶灏嗕細闃诲鐩村埌 RecvQ 闃熷垪鏈夎冻澶熺殑绌洪棿瀹圭撼 SendQ 鍙戦€佺殑鏁版嵁銆傚€煎緱鐗瑰埆娉ㄦ剰鐨勬槸锛岃繖涓紦瀛樺尯鐨勫ぇ灏忎互鍙婂啓鍏ョ鐨勯€熷害鍜岃鍙栫鐨勯€熷害闈炲父褰卞搷杩欎釜杩炴帴鐨勬暟鎹紶杈撴晥鐜囷紝鐢变簬鍙兘浼氬彂鐢熼樆濉烇紝鎵€浠ョ綉缁?I/O 涓庣鐩?I/O 鍦ㄦ暟鎹殑鍐欏叆鍜岃鍙栬繕瑕佹湁涓€涓崗璋冪殑杩囩▼锛屽鏋滀袱杈瑰悓鏃朵紶閫佹暟鎹椂鍙兘浼氫骇鐢熸閿侊紝鍦ㄥ悗闈?NIO 閮ㄥ垎灏嗕粙缁嶉伩鍏嶈繖绉嶆儏鍐点€?/p>

NIO 鐨勫伐浣滄柟寮?/strong>

BIO 甯︽潵鐨勬寫鎴?br>BIO 鍗抽樆濉?I/O锛屼笉绠℃槸纾佺洏 I/O 杩樻槸缃戠粶 I/O锛屾暟鎹湪鍐欏叆 OutputStream 鎴栬€呬粠 InputStream 璇诲彇鏃堕兘鏈夊彲鑳戒細闃诲銆備竴鏃︽湁绾跨▼闃诲灏嗕細澶卞幓 CPU 鐨勪娇鐢ㄦ潈锛岃繖鍦ㄥ綋鍓嶇殑澶ц妯¤闂噺鍜屾湁鎬ц兘瑕佹眰鎯呭喌涓嬫槸涓嶈兘鎺ュ彈鐨勩€傝櫧鐒跺綋鍓嶇殑缃戠粶 I/O 鏈変竴浜涜В鍐冲姙娉曪紝濡備竴涓鎴风涓€涓鐞嗙嚎绋嬶紝鍑虹幇闃诲鏃跺彧鏄竴涓嚎绋嬮樆濉炶€屼笉浼氬奖鍝嶅叾瀹冪嚎绋嬪伐浣滐紝杩樻湁涓轰簡鍑忓皯绯荤粺绾跨▼鐨勫紑閿€锛岄噰鐢ㄧ嚎绋嬫睜鐨勫姙娉曟潵鍑忓皯绾跨▼鍒涘缓鍜屽洖鏀剁殑鎴愭湰锛屼絾鏄湁涓€浜涗娇鐢ㄥ満鏅粛鐒舵槸鏃犳硶瑙e喅鐨勩€傚褰撳墠涓€浜涢渶瑕佸ぇ閲?HTTP 闀胯繛鎺ョ殑鎯呭喌锛屽儚娣樺疂鐜板湪浣跨敤鐨?Web 鏃烘椇椤圭洰锛屾湇鍔$闇€瑕佸悓鏃朵繚鎸佸嚑鐧句竾鐨?HTTP 杩炴帴锛屼絾鏄苟涓嶆槸姣忔椂姣忓埢杩欎簺杩炴帴閮藉湪浼犺緭鏁版嵁锛岃繖绉嶆儏鍐典笅涓嶅彲鑳藉悓鏃跺垱寤鸿繖涔堝绾跨▼鏉ヤ繚鎸佽繛鎺ャ€?/p>

鍗充娇绾跨▼鐨勬暟閲忎笉鏄棶棰橈紝浠嶇劧鏈変竴浜涢棶棰樿繕鏄棤娉曢伩鍏嶇殑銆傚杩欑鎯呭喌锛屾垜浠兂缁欐煇浜涘鎴风鏇撮珮鐨勬湇鍔′紭鍏堢骇锛屽緢闅鹃€氳繃璁捐绾跨▼鐨勪紭鍏堢骇鏉ュ畬鎴愶紝鍙﹀涓€绉嶆儏鍐垫槸锛屾垜浠渶瑕佽姣忎釜瀹㈡埛绔殑璇锋眰鍦ㄦ湇鍔$鍙兘闇€瑕佽闂竴浜涚珵浜夎祫婧愶紝鐢变簬杩欎簺瀹㈡埛绔槸鍦ㄤ笉鍚岀嚎绋嬩腑锛屽洜姝ら渶瑕佸悓姝ワ紝鑰屽線寰€瑕佸疄鐜拌繖浜涘悓姝ユ搷浣滆杩滆繙姣旂敤鍗曠嚎绋嬪鏉傚緢澶氥€備互涓婅繖浜涙儏鍐甸兘璇存槑锛屾垜浠渶瑕佸彟澶栦竴绉嶆柊鐨?I/O 鎿嶄綔鏂瑰紡銆?br>
NIO 鐨勫伐浣滄満鍒?/strong>

鎴戜滑鍏堢湅涓€涓?NIO 娑夊強鍒扮殑鍏宠仈绫诲浘锛屽涓嬪浘銆?/p>

鍥?9.NIO 鐩稿叧绫诲浘


娣卞叆鍒嗘瀽 Java I/O 鐨勫伐浣滄満鍒

涓婂浘涓湁涓や釜鍏抽敭绫伙細Channel 鍜?Selector锛屽畠浠槸 NIO 涓袱涓牳蹇冩蹇点€傛垜浠繕鐢ㄥ墠闈㈢殑鍩庡競浜ら€氬伐鍏锋潵缁х画姣斿柣 NIO 鐨勫伐浣滄柟寮忥紝杩欓噷鐨?Channel 瑕佹瘮 Socket 鏇村姞鍏蜂綋锛屽畠鍙互姣斾綔涓烘煇绉嶅叿浣撶殑浜ら€氬伐鍏凤紝濡傛苯杞︽垨鏄珮閾佺瓑锛岃€?Selector 鍙互姣斾綔涓轰竴涓溅绔欑殑杞﹁締杩愯璋冨害绯荤粺锛屽畠灏嗚礋璐g洃鎺ф瘡杈嗚溅鐨勫綋鍓嶈繍琛岀姸鎬侊細鏄凡缁忓嚭鎴樿繕鏄湪璺笂绛夌瓑锛屼篃灏辨槸瀹冨彲浠ヨ疆璇㈡瘡涓?Channel 鐨勭姸鎬併€傝繖閲岃繕鏈変竴涓?Buffer 绫伙紝瀹冧篃姣?Stream 鏇村姞鍏蜂綋鍖栵紝鎴戜滑鍙互灏嗗畠姣斾綔涓鸿溅涓婄殑搴т綅锛孋hannel 鏄苯杞︾殑璇濆氨鏄苯杞︿笂鐨勫骇浣嶏紝楂橀搧涓婂氨鏄珮閾佷笂鐨勫骇浣嶏紝瀹冨缁堟槸涓€涓叿浣撶殑姒傚康锛屼笌 Stream 涓嶅悓銆係tream 鍙兘浠h〃鏄竴涓骇浣嶏紝鑷充簬鏄粈涔堝骇浣嶇敱浣犺嚜宸卞幓鎯宠薄锛屼篃灏辨槸浣犲湪鍘讳笂杞︿箣鍓嶅苟涓嶇煡閬擄紝杩欎釜杞︿笂鏄惁杩樻湁娌℃湁搴т綅浜嗭紝涔熶笉鐭ラ亾涓婄殑鏄粈涔堣溅锛屽洜涓轰綘骞朵笉鑳介€夋嫨锛岃繖浜涗俊鎭兘宸茬粡琚皝瑁呭湪浜嗚繍杈撳伐鍏凤紙Socket锛夐噷闈簡锛屽浣犳槸閫忔槑鐨勩€?/p>

NIO 寮曞叆浜?Channel銆丅uffer 鍜?Selector 灏辨槸鎯虫妸杩欎簺淇℃伅鍏蜂綋鍖栵紝璁╃▼搴忓憳鏈夋満浼氭帶鍒跺畠浠紝濡傦細褰撴垜浠皟鐢?write() 寰€ SendQ 鍐欐暟鎹椂锛屽綋涓€娆″啓鐨勬暟鎹秴杩?SendQ 闀垮害鏄渶瑕佹寜鐓?SendQ 鐨勯暱搴﹁繘琛屽垎鍓诧紝杩欎釜杩囩▼涓渶瑕佹湁灏嗙敤鎴风┖闂存暟鎹拰鍐呮牳鍦板潃绌洪棿杩涜鍒囨崲锛岃€岃繖涓垏鎹笉鏄綘鍙互鎺у埗鐨勩€傝€屽湪 Buffer 涓垜浠彲浠ユ帶鍒?Buffer 鐨?capacity锛屽苟涓旀槸鍚︽墿瀹逛互鍙婂浣曟墿瀹归兘鍙互鎺у埗銆?br>
鐞嗚В浜嗚繖浜涙蹇靛悗鎴戜滑鐪嬩竴涓嬶紝瀹為檯涓婂畠浠槸濡備綍宸ヤ綔鐨勶紝涓嬮潰鏄吀鍨嬬殑涓€娈?NIO 浠g爜锛?br>
娓呭崟 2. NIO 宸ヤ綔浠g爜绀轰緥

public void selector() throws IOException {
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        Selector selector = Selector.open();
        ServerSocketChannel ssc = ServerSocketChannel.open();
        ssc.configureBlocking(false);//璁剧疆涓洪潪闃诲鏂瑰紡
        ssc.socket().bind(new InetSocketAddress(8080));
        ssc.register(selector, SelectionKey.OP_ACCEPT);//娉ㄥ唽鐩戝惉鐨勪簨浠?
        while (true) {
            Set selectedKeys = selector.selectedKeys();//鍙栧緱鎵€鏈塳ey闆嗗悎
            Iterator it = selectedKeys.iterator();
            while (it.hasNext()) {
                SelectionKey key = (SelectionKey) it.next();
                if ((key.readyOps() & SelectionKey.OP_ACCEPT) == SelectionKey.OP_ACCEPT) {
                    ServerSocketChannel ssChannel = (ServerSocketChannel) key.channel();
                 SocketChannel sc = ssChannel.accept();//鎺ュ彈鍒版湇鍔$鐨勮姹?
                    sc.configureBlocking(false);
                    sc.register(selector, SelectionKey.OP_READ);
                    it.remove();
                } else if 
                ((key.readyOps() & SelectionKey.OP_READ) == SelectionKey.OP_READ) {
                    SocketChannel sc = (SocketChannel) key.channel();
                    while (true) {
                        buffer.clear();
                        int n = sc.read(buffer);//璇诲彇鏁版嵁
                        if (n <= 0) {
                            break;
                        }
                        buffer.flip();
                    }
                    it.remove();
                }
            }
        }
}

璋冪敤 Selector 鐨勯潤鎬佸伐鍘傚垱寤轰竴涓€夋嫨鍣紝鍒涘缓涓€涓湇鍔$鐨?Channel 缁戝畾鍒颁竴涓?Socket 瀵硅薄锛屽苟鎶婅繖涓€氫俊淇¢亾娉ㄥ唽鍒伴€夋嫨鍣ㄤ笂锛屾妸杩欎釜閫氫俊淇¢亾璁剧疆涓洪潪闃诲妯″紡銆傜劧鍚庡氨鍙互璋冪敤 Selector 鐨?selectedKeys 鏂规硶鏉ユ鏌ュ凡缁忔敞鍐屽湪杩欎釜閫夋嫨鍣ㄤ笂鐨勬墍鏈夐€氫俊淇¢亾鏄惁鏈夐渶瑕佺殑浜嬩欢鍙戠敓锛屽鏋滄湁鏌愪釜浜嬩欢鍙戠敓鏃讹紝灏嗕細杩斿洖鎵€鏈夌殑 SelectionKey锛岄€氳繃杩欎釜瀵硅薄 Channel 鏂规硶灏卞彲浠ュ彇寰楄繖涓€氫俊淇¢亾瀵硅薄浠庤€屽彲浠ヨ鍙栭€氫俊鐨勬暟鎹紝鑰岃繖閲岃鍙栫殑鏁版嵁鏄?Buffer锛岃繖涓?Buffer 鏄垜浠彲浠ユ帶鍒剁殑缂撳啿鍣ㄣ€?br>
鍦ㄤ笂闈㈢殑杩欐绋嬪簭涓紝鏄皢 Server 绔殑鐩戝惉杩炴帴璇锋眰鐨勪簨浠跺拰澶勭悊璇锋眰鐨勪簨浠舵斁鍦ㄤ竴涓嚎绋嬩腑锛屼絾鏄湪瀹為檯搴旂敤涓紝鎴戜滑閫氬父浼氭妸瀹冧滑鏀惧湪涓や釜绾跨▼涓紝涓€涓嚎绋嬩笓闂ㄨ礋璐g洃鍚鎴风鐨勮繛鎺ヨ姹傦紝鑰屼笖鏄樆濉炴柟寮忔墽琛岀殑锛涘彟澶栦竴涓嚎绋嬩笓闂ㄦ潵澶勭悊璇锋眰锛岃繖涓笓闂ㄥ鐞嗚姹傜殑绾跨▼鎵嶄細鐪熸閲囩敤 NIO 鐨勬柟寮忥紝鍍?Web 鏈嶅姟鍣?Tomcat 鍜?Jetty 閮芥槸杩欎釜澶勭悊鏂瑰紡锛屽叧浜?Tomcat 鍜?Jetty 鐨?NIO 澶勭悊鏂瑰紡鍙互鍙傝€冩枃绔犮€?Jetty 鐨勫伐浣滃師鐞嗗拰涓?Tomcat 鐨勬瘮杈冦€嬨€?br>
涓嬪浘鏄弿杩颁簡鍩轰簬 NIO 宸ヤ綔鏂瑰紡鐨?Socket 璇锋眰鐨勫鐞嗚繃绋嬶細

鍥?10. 鍩轰簬 NIO 鐨?Socket 璇锋眰鐨勫鐞嗚繃绋?/p>


娣卞叆鍒嗘瀽 Java I/O 鐨勫伐浣滄満鍒

涓婂浘涓殑 Selector 鍙互鍚屾椂鐩戝惉涓€缁勯€氫俊淇¢亾锛圕hannel锛変笂鐨?I/O 鐘舵€侊紝鍓嶆彁鏄繖涓?Selector 瑕佸凡缁忔敞鍐屽埌杩欎簺閫氫俊淇¢亾涓€傞€夋嫨鍣?Selector 鍙互璋冪敤 select() 鏂规硶妫€鏌ュ凡缁忔敞鍐岀殑閫氫俊淇¢亾涓婄殑鏄惁鏈?I/O 宸茬粡鍑嗗濂斤紝濡傛灉娌℃湁鑷冲皯涓€涓俊閬?I/O 鐘舵€佹湁鍙樺寲锛岄偅涔?select 鏂规硶浼氶樆濉炵瓑寰呮垨鍦ㄨ秴鏃舵椂闂村悗浼氳繑鍥?0銆備笂鍥句腑濡傛灉鏈夊涓俊閬撴湁鏁版嵁锛岄偅涔堝皢浼氬皢杩欎簺鏁版嵁鍒嗛厤鍒板搴旂殑鏁版嵁 Buffer 涓€傛墍浠ュ叧閿殑鍦版柟鏄湁涓€涓嚎绋嬫潵澶勭悊鎵€鏈夎繛鎺ョ殑鏁版嵁浜や簰锛屾瘡涓繛鎺ョ殑鏁版嵁浜や簰閮戒笉鏄樆濉炴柟寮忥紝鎵€浠ュ彲浠ュ悓鏃跺鐞嗗ぇ閲忕殑杩炴帴璇锋眰銆?br>
Buffer 鐨勫伐浣滄柟寮?/strong>

涓婇潰浠嬬粛浜?Selector 灏嗘娴嬪埌鏈夐€氫俊淇¢亾 I/O 鏈夋暟鎹紶杈撴椂锛岄€氳繃 selelct() 鍙栧緱 SocketChannel锛屽皢鏁版嵁璇诲彇鎴栧啓鍏?Buffer 缂撳啿鍖恒€備笅闈㈣璁轰竴涓?Buffer 濡備綍鎺ュ彈鍜屽啓鍑烘暟鎹紵

Buffer 鍙互绠€鍗曠殑鐞嗚В涓轰竴缁勫熀鏈暟鎹被鍨嬬殑鍏冪礌鍒楄〃锛屽畠閫氳繃鍑犱釜鍙橀噺鏉ヤ繚瀛樿繖涓暟鎹殑褰撳墠浣嶇疆鐘舵€侊紝涔熷氨鏄湁鍥涗釜绱㈠紩銆傚涓嬭〃鎵€绀猴細

绱㈠紩聽聽聽聽聽聽聽聽聽聽聽聽 璇存槑
capacity 聽聽聽聽聽 缂撳啿鍖烘暟缁勭殑鎬婚暱搴?br>position 聽聽聽聽聽 涓嬩竴涓鎿嶄綔鐨勬暟鎹厓绱犵殑浣嶇疆
limit 聽聽聽 聽聽聽聽聽聽聽聽 缂撳啿鍖烘暟缁勪腑涓嶅彲鎿嶄綔鐨勪笅涓€涓厓绱犵殑浣嶇疆锛宭imit<=capacity

mark 聽聽聽聽聽聽聽聽聽聽 鐢ㄤ簬璁板綍褰撳墠 position 鐨勫墠涓€涓綅缃垨鑰呴粯璁ゆ槸 0

鍦ㄥ疄闄呮搷浣滄暟鎹椂瀹冧滑鏈夊涓嬪叧绯诲浘锛?/p>

娣卞叆鍒嗘瀽 Java I/O 鐨勫伐浣滄満鍒

鎴戜滑閫氳繃 ByteBuffer.allocate(11) 鏂规硶鍒涘缓涓€涓?11 涓?byte 鐨勬暟缁勭紦鍐插尯锛屽垵濮嬬姸鎬佸涓婂浘鎵€绀猴紝position 鐨勪綅缃负 0锛宑apacity 鍜?limit 榛樿閮芥槸鏁扮粍闀垮害銆傚綋鎴戜滑鍐欏叆 5 涓瓧鑺傛椂浣嶇疆鍙樺寲濡備笅鍥炬墍绀猴細
娣卞叆鍒嗘瀽 Java I/O 鐨勫伐浣滄満鍒

杩欐椂鎴戜滑闇€瑕佸皢缂撳啿鍖虹殑 5 涓瓧鑺傛暟鎹啓鍏?Channel 閫氫俊淇¢亾锛屾墍浠ユ垜浠渶瑕佽皟鐢?byteBuffer.flip() 鏂规硶锛屾暟缁勭殑鐘舵€佸張鍙戠敓濡備笅鍙樺寲锛?/p>


娣卞叆鍒嗘瀽 Java I/O 鐨勫伐浣滄満鍒

杩欐椂搴曞眰鎿嶄綔绯荤粺灏卞彲浠ヤ粠缂撳啿鍖轰腑姝g‘璇诲彇杩?5 涓瓧鑺傛暟鎹彂閫佸嚭鍘讳簡銆傚湪涓嬩竴娆″啓鏁版嵁涔嬪墠鎴戜滑鍦ㄨ皟涓€涓?clear() 鏂规硶銆傜紦鍐插尯鐨勭储寮曠姸鎬佸張鍥炲埌鍒濆浣嶇疆銆?br>
杩欓噷杩樿璇存槑涓€涓?mark锛屽綋鎴戜滑璋冪敤 mark() 鏃讹紝瀹冨皢璁板綍褰撳墠 position 鐨勫墠涓€涓綅缃紝褰撴垜浠皟鐢?reset 鏃讹紝position 灏嗘仮澶?mark 璁板綍涓嬫潵鐨勫€笺€?br>
杩樻湁涓€鐐归渶瑕佽鏄庯紝閫氳繃 Channel 鑾峰彇鐨?I/O 鏁版嵁棣栧厛瑕佺粡杩囨搷浣滅郴缁熺殑 Socket 缂撳啿鍖哄啀灏嗘暟鎹鍒跺埌 Buffer 涓紝杩欎釜鐨勬搷浣滅郴缁熺紦鍐插尯灏辨槸搴曞眰鐨?TCP 鍗忚鍏宠仈鐨?RecvQ 鎴栬€?SendQ 闃熷垪锛屼粠鎿嶄綔绯荤粺缂撳啿鍖哄埌鐢ㄦ埛缂撳啿鍖哄鍒舵暟鎹瘮杈冭€楁€ц兘锛孊uffer 鎻愪緵浜嗗彟澶栦竴绉嶇洿鎺ユ搷浣滄搷浣滅郴缁熺紦鍐插尯鐨勭殑鏂瑰紡鍗?ByteBuffer.allocateDirector(size)锛岃繖涓柟娉曡繑鍥炵殑 byteBuffer 灏辨槸涓庡簳灞傚瓨鍌ㄧ┖闂村叧鑱旂殑缂撳啿鍖猴紝瀹冪殑鎿嶄綔鏂瑰紡涓?linux2.4 鍐呮牳鐨?sendfile 鎿嶄綔鏂瑰紡绫讳技銆?/p>

I/O 璋冧紭

涓嬮潰灏辩鐩?I/O 鍜岀綉缁?I/O 鐨勪竴浜涘父鐢ㄧ殑浼樺寲鎶€宸ц繘琛屾€荤粨濡備笅锛?/p>

纾佺洏 I/O 浼樺寲

鎬ц兘妫€娴?/strong>

鎴戜滑鐨勫簲鐢ㄧ▼搴忛€氬父閮介渶瑕佽闂鐩樿鍙栨暟鎹紝鑰岀鐩?I/O 閫氬父閮藉緢鑰楁椂锛屾垜浠鍒ゆ柇 I/O 鏄惁鏄竴涓摱棰堬紝鎴戜滑鏈変竴浜涘弬鏁版寚鏍囧彲浠ュ弬鑰冿細

濡傛垜浠彲浠ュ帇鍔涙祴璇曞簲鐢ㄧ▼搴忕湅绯荤粺鐨?I/O wait 鎸囨爣鏄惁姝e父锛屼緥濡傛祴璇曟満鍣ㄦ湁 4 涓?CPU锛岄偅涔堢悊鎯崇殑 I/O wait 鍙傛暟涓嶅簲璇ヨ秴杩?25%锛屽鏋滆秴杩?25% 鐨勮瘽锛孖/O 寰堝彲鑳芥垚涓哄簲鐢ㄧ▼搴忕殑鎬ц兘鐡堕銆侺inux 鎿嶄綔绯荤粺涓嬪彲浠ラ€氳繃 iostat 鍛戒护鏌ョ湅銆?/p>

閫氬父鎴戜滑鍦ㄥ垽鏂?I/O 鎬ц兘鏃惰繕浼氱湅鍙﹀涓€涓弬鏁板氨鏄?IOPS锛屾垜浠簲鐢ㄧ▼搴忛渶瑕佹渶浣庣殑 IOPS 鏄灏戯紝鑰屾垜浠殑纾佺洏鐨?IOPS 鑳戒笉鑳借揪鍒版垜浠殑瑕佹眰銆傛瘡涓鐩樼殑 IOPS 閫氬父鏄湪涓€涓寖鍥村唴锛岃繖鍜屽瓨鍌ㄥ湪纾佺洏鐨勬暟鎹潡鐨勫ぇ灏忓拰璁块棶鏂瑰紡涔熸湁鍏炽€備絾鏄富瑕佹槸鐢辩鐩樼殑杞€熷喅瀹氱殑锛岀鐩樼殑杞€熻秺楂樼鐩樼殑 IOPS 涔熻秺楂樸€?/p>

鐜板湪涓轰簡鎻愰珮纾佺洏 I/O 鐨勬€ц兘锛岄€氬父閲囩敤涓€绉嶅彨 RAID 鐨勬妧鏈紝灏辨槸灏嗕笉鍚岀殑纾佺洏缁勫悎璧锋潵鏉ユ彁楂?I/O 鎬ц兘锛岀洰鍓嶆湁澶氱 RAID 鎶€鏈紝姣忕 RAID 鎶€鏈 I/O 鎬ц兘鎻愬崌浼氭湁涓嶅悓锛屽彲浠ョ敤涓€涓?RAID 鍥犲瓙鏉ヤ唬琛紝纾佺洏鐨勮鍐欏悶鍚愰噺鍙互閫氳繃 iostat 鍛戒护鏉ヨ幏鍙栵紝浜庢槸鎴戜滑鍙互璁$畻鍑轰竴涓悊璁虹殑 IOPS 鍊硷紝璁$畻鍏紡濡備笅鎵€浠ワ細

( 纾佺洏鏁?* 姣忓潡纾佺洏鐨?IOPS)/( 纾佺洏璇荤殑鍚炲悙閲?+RAID 鍥犲瓙 * 纾佺洏鍐欑殑鍚炲悙閲?)=IOPS

杩欎釜鍏紡鐨勮缁嗕俊鎭鏌ラ槄鍙傝€冭祫鏂?Understanding Disk I/O銆?/p>

鎻愬崌 I/O 鎬ц兘

鎻愬崌纾佺洏 I/O 鎬ц兘閫氬父鐨勬柟娉曟湁锛?/p>

  1. 澧炲姞缂撳瓨锛屽噺灏戠鐩樿闂鏁?/li>
  2. 浼樺寲纾佺洏鐨勭鐞嗙郴缁燂紝璁捐鏈€浼樼殑纾佺洏璁块棶绛栫暐锛屼互鍙婄鐩樼殑瀵诲潃绛栫暐锛岃繖閲屾槸鍦ㄥ簳灞傛搷浣滅郴缁熷眰闈㈣€冭檻鐨勩€?/li>
  3. 璁捐鍚堢悊鐨勭鐩樺瓨鍌ㄦ暟鎹潡锛屼互鍙婅闂繖浜涙暟鎹潡鐨勭瓥鐣ワ紝杩欓噷鏄湪搴旂敤灞傞潰鑰冭檻鐨勩€傚鎴戜滑鍙互缁欏瓨鏀剧殑鏁版嵁璁捐绱㈠紩锛岄€氳繃瀵诲潃绱㈠紩鏉ュ姞蹇拰鍑忓皯纾佺洏鐨勮闂紝杩樻湁鍙互閲囩敤寮傛鍜岄潪闃诲鐨勬柟寮忓姞蹇鐩樼殑璁块棶鏁堢巼銆?/li>
  4. 搴旂敤鍚堢悊鐨?RAID 绛栫暐鎻愬崌纾佺洏 IO锛屾瘡绉?RAID 鐨勫尯鍒垜浠彲浠ョ敤涓嬭〃鎵€绀猴細

琛?2.RAID 绛栫暐

RAID 0锛氭暟鎹骞冲潎鍐欏埌澶氫釜纾佺洏闃靛垪涓紝鍐欐暟鎹拰璇绘暟鎹兘鏄苟琛岀殑锛屾墍浠ョ鐩樼殑 IOPS 鍙互鎻愰珮涓€鍊嶃€?br>
RAID 1锛歊AID 1 鐨勪富瑕佷綔鐢ㄦ槸鑳藉鎻愰珮鏁版嵁鐨勫畨鍏ㄦ€э紝瀹冨皢涓€浠芥暟鎹垎鍒鍒跺埌澶氫釜纾佺洏闃靛垪涓€傚苟涓嶈兘鎻愬崌 IOPS 浣嗘槸鐩稿悓鐨勬暟鎹湁澶氫釜澶囦唤銆傞€氬父鐢ㄤ簬瀵规暟鎹畨鍏ㄦ€ц緝楂樼殑鍦哄悎涓€?br>
RAID 5锛氳繖涓璁℃柟寮忔槸鍓嶄袱绉嶇殑鎶樹腑鏂瑰紡锛屽畠灏嗘暟鎹钩鍧囧啓鍒版墍鏈夌鐩橀樀鍒楁€绘暟鍑忎竴鐨勭鐩樹腑锛屽線鍙﹀涓€涓鐩樹腑鍐欏叆杩欎唤鏁版嵁鐨勫鍋舵牎楠屼俊鎭€傚鏋滃叾涓竴涓鐩樻崯鍧忥紝鍙互閫氳繃鍏跺畠纾佺洏鐨勬暟鎹拰杩欎釜鏁版嵁鐨勫鍋舵牎楠屼俊鎭潵鎭㈠杩欎唤鏁版嵁銆?br>
RAID 0+1锛氬鍚嶅瓧涓€鏍凤紝灏辨槸鏍规嵁鏁版嵁鐨勫浠芥儏鍐佃繘琛屽垎缁勶紝涓€浠芥暟鎹悓鏃跺啓鍒板涓浠界鐩樺垎缁勪腑锛屽悓鏃跺涓垎缁勪篃浼氬苟琛岃鍐欍€?/p>

缃戠粶 I/O 浼樺寲

缃戠粶 I/O 浼樺寲閫氬父鏈変竴浜涘熀鏈鐞嗗師鍒欙細

涓€涓槸鍑忓皯缃戠粶浜や簰鐨勬鏁帮細瑕佸噺灏戠綉缁滀氦浜掔殑娆℃暟閫氬父鎴戜滑鍦ㄩ渶瑕佺綉缁滀氦浜掔殑涓ょ浼氳缃紦瀛橈紝姣斿 Oracle 鐨?JDBC 椹卞姩绋嬪簭锛屽氨鎻愪緵浜嗗鏌ヨ鐨?SQL 缁撴灉鐨勭紦瀛橈紝鍦ㄥ鎴风鍜屾暟鎹簱绔兘鏈夛紝鍙互鏈夋晥鐨勫噺灏戝鏁版嵁搴撶殑璁块棶銆傚叧浜?Oracle JDBC 鐨勫唴瀛樼鐞嗗彲浠ュ弬鑰冦€?Oracle JDBC 鍐呭瓨绠$悊銆嬨€傞櫎浜嗚缃紦瀛樿繕鏈変竴涓姙娉曟槸锛屽悎骞惰闂姹傦細濡傚湪鏌ヨ鏁版嵁搴撴椂锛屾垜浠鏌?10 涓?id锛屾垜鍙互姣忔鏌ヤ竴涓?id锛屼篃鍙互涓€娆℃煡 10 涓?id銆傚啀姣斿鍦ㄨ闂竴涓〉闈㈡椂閫氳繃浼氭湁澶氫釜 js 鎴?css 鐨勬枃浠讹紝鎴戜滑鍙互灏嗗涓?js 鏂囦欢鍚堝苟鍦ㄤ竴涓?HTTP 閾炬帴涓紝姣忎釜鏂囦欢鐢ㄩ€楀彿闅斿紑锛岀劧鍚庡彂閫佸埌鍚庣 Web 鏈嶅姟鍣ㄦ牴鎹繖涓?URL 閾炬帴锛屽啀鎷嗗垎鍑哄悇涓枃浠讹紝鐒跺悗鎵撳寘鍐嶄竴骞跺彂鍥炵粰鍓嶇娴忚鍣ㄣ€傝繖浜涢兘鏄父鐢ㄧ殑鍑忓皯缃戠粶 I/O 鐨勫姙娉曘€?/p>


鍑忓皯缃戠粶浼犺緭鏁版嵁閲忕殑澶у皬锛氬噺灏戠綉缁滄暟鎹噺鐨勫姙娉曢€氬父鏄皢鏁版嵁鍘嬬缉鍚庡啀浼犺緭锛屽 HTTP 璇锋眰涓紝閫氬父 Web 鏈嶅姟鍣ㄥ皢璇锋眰鐨?Web 椤甸潰 gzip 鍘嬬缉鍚庡湪浼犺緭缁欐祻瑙堝櫒銆傝繕鏈夊氨鏄€氳繃璁捐绠€鍗曠殑鍗忚锛屽敖閲忛€氳繃璇诲彇鍗忚澶存潵鑾峰彇鏈夌敤鐨勪环鍊间俊鎭€傛瘮濡傚湪浠g悊绋嬪簭璁捐鏃讹紝鏈?4 灞備唬鐞嗗拰 7 灞備唬鐞嗛兘鏄潵灏介噺閬垮厤瑕佽鍙栨暣涓€氫俊鏁版嵁鏉ュ彇寰楅渶瑕佺殑淇℃伅銆?/p>


灏介噺鍑忓皯缂栫爜锛氶€氬父鍦ㄧ綉缁?I/O 涓暟鎹紶杈撻兘鏄互瀛楄妭褰㈠紡鐨勶紝涔熷氨鏄€氬父瑕佸簭鍒楀寲銆備絾鏄垜浠彂閫佽浼犺緭鐨勬暟鎹兘鏄瓧绗﹀舰寮忕殑锛屼粠瀛楃鍒板瓧鑺傚繀椤荤紪鐮併€備絾鏄繖涓紪鐮佽繃绋嬫槸姣旇緝鑰楁椂鐨勶紝鎵€浠ュ湪瑕佺粡杩囩綉缁?I/O 浼犺緭鏃讹紝灏介噺鐩存帴浠ュ瓧鑺傚舰寮忓彂閫併€備篃灏辨槸灏介噺鎻愬墠灏嗗瓧绗﹁浆鍖栦负瀛楄妭锛屾垨鑰呭噺灏戝瓧绗﹀埌瀛楄妭鐨勮浆鍖栬繃绋嬨€?/p>


鏍规嵁搴旂敤鍦烘櫙璁捐鍚堥€傜殑浜や簰鏂瑰紡锛氭墍璋撶殑浜や簰鍦烘櫙涓昏鍖呮嫭鍚屾涓庡紓姝ラ樆濉炰笌闈為樆濉炴柟寮忥紝涓嬮潰灏嗚缁嗕粙缁嶃€?br>
鍚屾涓庡紓姝?/strong>
鎵€璋撳悓姝ュ氨鏄竴涓换鍔$殑瀹屾垚闇€瑕佷緷璧栧彟澶栦竴涓换鍔℃椂锛屽彧鏈夌瓑寰呰渚濊禆鐨勪换鍔″畬鎴愬悗锛屼緷璧栫殑浠诲姟鎵嶈兘绠楀畬鎴愶紝杩欐槸涓€绉嶅彲闈犵殑浠诲姟搴忓垪銆傝涔堟垚鍔熼兘鎴愬姛锛屽け璐ラ兘澶辫触锛屼袱涓换鍔$殑鐘舵€佸彲浠ヤ繚鎸佷竴鑷淬€傝€屽紓姝ユ槸涓嶉渶瑕佺瓑寰呰渚濊禆鐨勪换鍔″畬鎴愶紝鍙槸閫氱煡琚緷璧栫殑浠诲姟瑕佸畬鎴愪粈涔堝伐浣滐紝渚濊禆鐨勪换鍔′篃绔嬪嵆鎵ц锛屽彧瑕佽嚜宸卞畬鎴愪簡鏁翠釜浠诲姟灏辩畻瀹屾垚浜嗐€傝嚦浜庤渚濊禆鐨勪换鍔℃渶缁堟槸鍚︾湡姝e畬鎴愶紝渚濊禆瀹冪殑浠诲姟鏃犳硶纭畾锛屾墍浠ュ畠鏄笉鍙潬鐨勪换鍔″簭鍒椼€傛垜浠彲浠ョ敤鎵撶數璇濆拰鍙戠煭淇℃潵寰堝ソ鐨勬瘮鍠诲悓姝ヤ笌寮傛鎿嶄綔銆?br>
鍦ㄨ璁″埌 IO 澶勭悊鏃堕€氬父閮戒細閬囧埌涓€涓槸鍚屾杩樻槸寮傛鐨勫鐞嗘柟寮忕殑閫夋嫨闂銆傚洜涓哄悓姝ヤ笌寮傛鐨?I/O 澶勭悊鏂瑰紡瀵硅皟鐢ㄨ€呯殑褰卞搷寰堝ぇ锛屽湪鏁版嵁搴撲骇鍝佷腑閮戒細閬囧埌杩欎釜闂銆傚洜涓?I/O 鎿嶄綔閫氬父鏄竴涓潪甯歌€楁椂鐨勬搷浣滐紝鍦ㄤ竴涓换鍔″簭鍒椾腑 I/O 閫氬父閮芥槸鎬ц兘鐡堕銆備絾鏄悓姝ヤ笌寮傛鐨勫鐞嗘柟寮忓绋嬪簭鐨勫彲闈犳€у奖鍝嶉潪甯稿ぇ锛屽悓姝ヨ兘澶熶繚璇佺▼搴忕殑鍙潬鎬э紝鑰屽紓姝ュ彲浠ユ彁鍗囩▼搴忕殑鎬ц兘锛屽繀椤诲湪鍙潬鎬у拰鎬ц兘涔嬮棿鍋氫釜骞宠 锛屾病鏈夊畬缇庣殑瑙e喅鍔炴硶銆?br>
闃诲涓庨潪闃诲
闃诲涓庨潪闃诲涓昏鏄粠 CPU 鐨勬秷鑰椾笂鏉ヨ鐨勶紝闃诲灏辨槸 CPU 鍋滀笅鏉ョ瓑寰呬竴涓參鐨勬搷浣滃畬鎴?CPU 鎵嶆帴鐫€瀹屾垚鍏跺畠鐨勪簨銆傞潪闃诲灏辨槸鍦ㄨ繖涓參鐨勬搷浣滃湪鎵ц鏃?CPU 鍘诲共鍏跺畠鍒殑浜嬶紝绛夎繖涓參鐨勬搷浣滃畬鎴愭椂锛孋PU 鍐嶆帴鐫€瀹屾垚鍚庣画鐨勬搷浣溿€傝櫧鐒惰〃闈笂鐪嬮潪闃诲鐨勬柟寮忓彲浠ユ槑鏄剧殑鎻愰珮 CPU 鐨勫埄鐢ㄧ巼锛屼絾鏄篃甯︿簡鍙﹀涓€绉嶅悗鏋滃氨鏄郴缁熺殑绾跨▼鍒囨崲澧炲姞銆傚鍔犵殑 CPU 浣跨敤鏃堕棿鑳戒笉鑳借ˉ鍋跨郴缁熺殑鍒囨崲鎴愭湰闇€瑕佸ソ濂借瘎浼般€?br>
涓ょ鐨勬柟寮忕殑缁勫悎

缁勫悎鐨勬柟寮忓彲浠ョ敱鍥涚锛屽垎鍒槸锛氬悓姝ラ樆濉炪€佸悓姝ラ潪闃诲銆佸紓姝ラ樆濉炪€佸紓姝ラ潪闃诲锛岃繖鍥涚鏂瑰紡閮藉 I/O 鎬ц兘鏈夊奖鍝嶃€備笅闈㈢粰鍑哄垎鏋愶紝骞舵湁涓€浜涘父鐢ㄧ殑璁捐鐢ㄤ緥鍙傝€冦€?/p>

琛?3. 鍥涚缁勫悎鏂瑰紡
1.鍚屾闃诲锛氭渶甯哥敤鐨勪竴绉嶇敤娉曪紝浣跨敤涔熸槸鏈€绠€鍗曠殑锛屼絾鏄?I/O 鎬ц兘涓€鑸緢宸紝CPU 澶ч儴鍒嗗湪绌洪棽鐘舵€併€?/p>


2.鍚屾闈為樆濉烇細鎻愬崌 I/O 鎬ц兘鐨勫父鐢ㄦ墜娈碉紝灏辨槸灏?I/O 鐨勯樆濉炴敼鎴愰潪闃诲鏂瑰紡锛屽挨鍏跺湪缃戠粶 I/O 鏄暱杩炴帴锛屽悓鏃朵紶杈撴暟鎹篃涓嶆槸寰堝鐨勬儏鍐典笅锛屾彁鍗囨€ц兘闈炲父鏈夋晥銆傝繖绉嶆柟寮忛€氬父鑳芥彁鍗?I/O 鎬ц兘锛屼絾鏄細澧炲姞 CPU 娑堣€楋紝瑕佽€冭檻澧炲姞鐨?I/O 鎬ц兘鑳戒笉鑳借ˉ鍋?CPU 鐨勬秷鑰楋紝涔熷氨鏄郴缁熺殑鐡堕鏄湪 I/O 杩樻槸鍦?CPU 涓娿€?/p>


3.寮傛闃诲锛氳繖绉嶆柟寮忓湪鍒嗗竷寮忔暟鎹簱涓粡甯哥敤鍒帮紝渚嬪鍦ㄧ綉涓€涓垎甯冨紡鏁版嵁搴撲腑鍐欎竴鏉¤褰曪紝閫氬父浼氭湁涓€浠芥槸鍚屾闃诲鐨勮褰曪紝鑰岃繕鏈変袱鑷充笁浠芥槸澶囦唤璁板綍浼氬啓鍒板叾瀹冩満鍣ㄤ笂锛岃繖浜涘浠借褰曢€氬父閮芥槸閲囩敤寮傛闃诲鐨勬柟寮忓啓 I/O銆?/p>

寮傛闃诲瀵圭綉缁?I/O 鑳藉鎻愬崌鏁堢巼锛屽挨鍏跺儚涓婇潰杩欑鍚屾椂鍐欏浠界浉鍚屾暟鎹殑鎯呭喌銆?/p>


4.寮傛闈為樆濉烇細杩欑缁勫悎鏂瑰紡鐢ㄨ捣鏉ユ瘮杈冨鏉傦紝鍙湁鍦ㄤ竴浜涢潪甯稿鏉傜殑鍒嗗竷寮忔儏鍐典笅浣跨敤锛屽儚闆嗙兢涔嬮棿鐨勬秷鎭悓姝ユ満鍒朵竴鑸敤杩欑 I/O 缁勫悎鏂瑰紡銆傚 Cassandra 鐨?Gossip 閫氫俊鏈哄埗灏辨槸閲囩敤寮傛闈為樆濉炵殑鏂瑰紡銆?/p>

瀹冮€傚悎鍚屾椂瑕佷紶澶氫唤鐩稿悓鐨勬暟鎹埌闆嗙兢涓笉鍚岀殑鏈哄櫒锛屽悓鏃舵暟鎹殑浼犺緭閲忚櫧鐒朵笉澶э紝浣嗘槸鍗撮潪甯搁绻併€傝繖绉嶇綉缁?I/O 鐢ㄨ繖涓柟寮忔€ц兘鑳借揪鍒版渶楂樸€?

铏界劧寮傛鍜岄潪闃诲鑳藉鎻愬崌 I/O 鐨勬€ц兘锛屼絾鏄篃浼氬甫鏉ヤ竴浜涢澶栫殑鎬ц兘鎴愭湰锛屼緥濡備細澧炲姞绾跨▼鏁伴噺浠庤€屽鍔?CPU 鐨勬秷鑰楋紝鍚屾椂涔熶細瀵艰嚧绋嬪簭璁捐鐨勫鏉傚害涓婂崌銆傚鏋滆璁$殑涓嶅悎鐞嗙殑璇濆弽鑰屼細瀵艰嚧鎬ц兘涓嬮檷銆傚湪瀹為檯璁捐鏃惰鏍规嵁搴旂敤鍦烘櫙缁煎悎璇勪及涓€涓嬨€?br>
涓嬮潰涓句竴浜涘紓姝ュ拰闃诲鐨勬搷浣滃疄渚嬶細
鍦?Cassandra 涓鏌ヨ鏁版嵁閫氬父浼氬線澶氫釜鏁版嵁鑺傜偣鍙戦€佹煡璇㈠懡浠わ紝浣嗘槸瑕佹鏌ユ瘡涓妭鐐硅繑鍥炴暟鎹殑瀹屾暣鎬э紝鎵€浠ラ渶瑕佷竴涓紓姝ユ煡璇㈠悓姝ョ粨鏋滅殑搴旂敤鍦烘櫙锛岄儴鍒嗕唬鐮佸涓嬶細

娓呭崟 3.寮傛鏌ヨ鍚屾缁撴灉

class AsyncResult implements IAsyncResult{ 
    private byte[] result_; 
    private AtomicBoolean done_ = new AtomicBoolean(false); 
    private Lock lock_ = new ReentrantLock(); 
    private Condition condition_; 
    private long startTime_; 
    public AsyncResult(){        
        condition_ = lock_.newCondition();// 鍒涘缓涓€涓攣
        startTime_ = System.currentTimeMillis(); 
    }    
 /*** 妫€鏌ラ渶瑕佺殑鏁版嵁鏄惁宸茬粡杩斿洖锛屽鏋滄病鏈夎繑鍥為樆濉?*/ 
 public byte[] get(){ 
        lock_.lock(); 
        try{ 
            if (!done_.get()){condition_.await();} 
        }catch (InterruptedException ex){ 
            throw new AssertionError(ex); 
        }finally{lock_.unlock();} 
        return result_; 
 } 
 /*** 妫€鏌ラ渶瑕佺殑鏁版嵁鏄惁宸茬粡杩斿洖 */ 
    public boolean isDone(){return done_.get();} 
 /*** 妫€鏌ュ湪鎸囧畾鐨勬椂闂村唴闇€瑕佺殑鏁版嵁鏄惁宸茬粡杩斿洖锛屽鏋滄病鏈夎繑鍥炴姏鍑鸿秴鏃跺紓甯?*/ 
    public byte[] get(long timeout, TimeUnit tu) throws TimeoutException{ 
        lock_.lock(); 
        try{            boolean bVal = true; 
            try{ 
                if ( !done_.get() ){ 
           long overall_timeout = timeout - (System.currentTimeMillis() - startTime_); 
                    if(overall_timeout > 0)// 璁剧疆绛夊緟瓒呮椂鐨勬椂闂?
                        bVal = condition_.await(overall_timeout, TimeUnit.MILLISECONDS); 
                    else bVal = false; 
                } 
            }catch (InterruptedException ex){ 
                throw new AssertionError(ex); 
            } 
            if ( !bVal && !done_.get() ){// 鎶涘嚭瓒呮椂寮傚父
                throw new TimeoutException("Operation timed out."); 
            } 
        }finally{lock_.unlock();      } 
        return result_; 
 } 
 /*** 璇ュ嚱鏁版嫳鍙﹀涓€涓嚎绋嬭缃杩斿洖鐨勬暟鎹紝骞跺敜閱掑湪闃诲鐨勭嚎绋?*/ 
    public void result(Message response){        
        try{ 
            lock_.lock(); 
            if ( !done_.get() ){                
                result_ = response.getMessageBody();// 璁剧疆杩斿洖鐨勬暟鎹?
                done_.set(true); 
                condition_.signal();// 鍞ら啋闃诲鐨勭嚎绋?
            } 
        }finally{lock_.unlock();}        
    }    
 } 

鎬荤粨
鏈枃闃愯堪鐨勫唴瀹硅緝澶氾紝浠?Java 鍩烘湰 I/O 绫诲簱缁撴瀯寮€濮嬭璧凤紝涓昏浠嬬粛浜嗙鐩?I/O 鍜岀綉缁?I/O 鐨勫熀鏈伐浣滄柟寮忥紝鏈€鍚庝粙缁嶄簡鍏充簬 I/O 璋冧紭鐨勪竴浜涙柟娉曘€?br>
鍙傝€冭祫鏂?br>
聽聽聽 鏌ョ湅鏂囩珷 銆婃繁鍏ュ垎鏋怞ava涓枃缂栫爜闂銆嬶紙developerWorks锛?011 骞?7 鏈堬級锛氳缁嗕粙缁?Java 涓紪鐮侀棶棰樺嚭鐜扮殑鏍规湰鍘熷洜锛屼綘灏嗕簡瑙e埌锛欽ava 涓粡甯搁亣鍒扮殑鍑犵缂栫爜鏍煎紡鐨勫尯鍒紱Java 涓粡甯搁渶瑕佺紪鐮佺殑鍦烘櫙锛涘嚭鐜颁腑鏂囬棶棰樼殑鍘熷洜鍒嗘瀽锛涘湪寮€鍙?Java web 绋嬪簭鏃跺彲鑳戒細瀛樺湪缂栫爜鐨勫嚑涓湴鏂癸紝涓€涓?HTTP 璇锋眰鎬庝箞鎺у埗缂栫爜鏍煎紡锛熷浣曢伩鍏嶅嚭鐜颁腑鏂囬棶棰橈紵

聽聽聽 銆奜racle JDBC鍐呭瓨绠$悊銆嬶細杩欓噷璇︾粏鍒嗘瀽 Oracle JDBC 鍐呭瓨绠$悊鐨勫鐞嗘柟寮忋€?br>
聽聽聽 銆奐etty 鐨勫伐浣滃師鐞嗗拰涓?Tomcat 鐨勬瘮杈冦€嬶細杩欓噷浠嬬粛浜?Jetty 鏄浣曚娇鐢?NIO 鎶€鏈鐞?HTTP 杩炴帴璇锋眰鐨勶紝浠ュ強涓?Tomcat 澶勭悊鏈変綍涓嶅悓涔嬪銆?br>
聽聽聽 Java I/O Performance锛歴un.com 涓婄殑鏂囩珷锛屼粙缁嶄簡涓€浜?I/O 璋冧紭鐨勫熀鏈柟娉曘€?br>
聽聽聽 Java NIO.2锛氳繖閲屼粙缁嶄簡 JDK7 閲岄潰鐨勬柊鐨?I/O 鎶€鏈紝鍙互鍙傝€冨涔犱笅銆?br>
聽聽聽 Understanding Disk I/O锛氳繖閲屼粙缁嶄簡涓€鐐瑰叧浜庣鐩?I/O 涓€浜涙娴嬪拰璋冧紭鏂规硶锛屾湰鏂囦篃寮曠敤浜嗕竴浜涚煡璇嗙偣銆?br>
鍏充簬浣滆€?br>璁镐护娉紝developerWorks 涓浗缃戠珯鏈€浣充綔鑰咃紝鐜板氨鑱屼簬娣樺疂缃戯紝鏄竴鍚?Java 寮€鍙戝伐绋嬪笀銆傚澶у瀷浜掕仈缃戞灦鏋勮璁¢鎰熷叴瓒o紝鍠滄閽荤爺寮€婧愭鏋剁殑璁捐鍘熺悊銆傛湁鏃堕棿灏嗗鍒扮殑鐭ヨ瘑鏁寸悊鎴愭枃绔狅紝涔熷枩娆㈣褰曚笅宸ヤ綔鍜岀敓娲讳腑鐨勪竴浜涙€濊€冦€備釜浜虹綉绔欐槸锛歨ttp://xulingbo.net銆?/p>