Michael C. Daconta
Öø
Kevin T.
Smith
Donald Avondolio
W. Clay Richardson
Ðì ²¨ Òë
ÕÔ ¿Æ ÉóУ
ÈËÃñÓʵç³ö°æÉç
±¾ÊéÏ׸øEdsger W. Dijkstra£¬ÕâÊǶÔËûÓÀÔ¶µÄÃ廳¡£ËûÔø¾Ëµ¹ý£º
¡°ÎÒµÄÒâ˼ÊÇ£¬Èç¹û10ÄêÒԺ󣬵±Äã͵͵µØ×öһЩËäÈ»¿ìËÙµ«²»¹»ÑϽ÷µÄÊÂÇéʱ£¬ÄãͻȻ¿´µ½Îҷ·ðÔÚÄãµÄÉíºó×¢ÊÓ×ÅÄ㣬ÁîÄãÞÑÐÄ×ÔÔð¡®Dijkstra²»»áϲ»¶ÎÒÕâÑù¸É¡¯¡£Èç¹ûÄܹ»ÕâÑù£¬ÎÒÒ²ËãÊÇûÓÐÐé¶È½ñÉúÁË¡£¡±
ÎÒÃDZØÐëÇ«¹§µØ±íʾ²»Í¬Ò⣺DijkstraµÄÓ°ÏìºÎÖ¹10Ä꣬¼´Ê¹1010ÄêÒÔºó£¬ËûÔÚÌìÌÃÀïÒ²ÄÜÐÀοµØ¿´µ½ËûµÄÓ°ÏìÒÀÈ»´æÔÚÈ˼䡣Ïà¶ÔÓÚËûÔÚ˼ÏëÉÏ´ïµ½µÄ¸ß¶È£¬Õâ¸öÆÀ¼Û¾ø·Ç¹ý·Ö¡£
±¾Êéͨ¹ý·ÖÎöºÍ̽¾¿Java±à³ÌÖеÄÎÊÌ⣬×ܽá³ö¸ßЧµÄ½â¾ö·½°¸£¬°ïÖúJava³ÌÐòÔ±¿Ë·þʵ¼Ê±à³Ì¹¤×÷Öеġ°ÏÝÚ塱¡£
È«Êé·ÖΪ3¸ö²¿·Ö£¬50¸öItems¡£µÚÒ»²¿·Ö¡°¿Í»§²ã¡±£¨22¸öItems£©º¸ÇÁËJ2MEºÍJ2SE£¬ÌÖÂÛÁËÔÚ¿ª·¢ÍøÂçºÍ¶ÀÁ¢¿Í»§Ó¦ÓóÌÐòʱ¿ÉÄÜÓöµ½µÄÏÝÚå¡£µÚ¶þ²¿·Ö¡°Web²ã¡±£¨14¸öItems£©Ì½ÌÖÁËÔËÐÐÓÚWebÈÝÆ÷ÄÚ²¿µÄ×é¼þµÄÏÝÚå¡£µÚÈý²¿·Ö¡°ÆóÒµ²ã¡±£¨14¸öItems£©Éæ¼°µ½J2EEƽ̨µÄÒ»²¿·Ö×é¼þ£¬»òÊÇÔÚÆóÒµJava Bean£¨EJB£©ÈÝÆ÷ÄÚ²¿µÄÖ´ÐС£
±¾ÊéÊʺÏÓÐÒ»¶¨¾ÑéµÄJava³ÌÐòÔ±ÔĶÁ£¬Ò²¿É×÷Ϊ¹¤×÷Öнâ¾öʵ¼ÊÎÊÌâµÄ²Î¿¼Êé¡£
¡°ÓÐʱºò£¬ÎÒÃǻᷢÏÖһЩÁîÈ˲»¿ìµÄÕæÏࡣÿµ±´Ëʱ£¬ÎÒÃDZãÏÝÓÚÁ½Äѵľ³µØ£º´Ó¿ÆÑ§µÄ½Ç¶È½²£¬ÒþÂ÷ËüÃÇÊDz»³ÏʵµÄ±íÏÖ£¬Òò´ËÎÒÃDZØÐ빫²¼ËüÃÇ¡£µ«ÊÇ£¬Ò»µ©¹«²¼ÁËËüÃÇ£¬ÎÒÃǵÈÓÚÊdz¯×Ô¼ºÁ³ÉÏ´òÁËÒ»°ÍÕÆ¡£¡±
±à³ÌÒª´ïµ½ÓÅÐãµÄ¾³½çÊǼ«ÎªÀ§Äѵġ£¶ÔÓÚ³ÌÐòÔ±ÐÂÊÖ¶øÑÔ£¬ËûÃÇÐèÒª¾«Í¨µÄÈí¼þ¹¤³Ì֪ʶÌåϵ£¨www.swebok.org£©µÄ¹æÄ£²»¶ÏÀ©Õ¹£¬ÄÚÈݲ»¶Ï±ä»¯£¬ËûÃǵÄǰÐÐ֮·ÏԵøñÍâ¼èÐÁ¡£±¾ÊéµÄ×÷Õß·¢¾õ£¬²»ÂÛÊǶԳÌÐòÔ±µÄ¹¤×÷ЧÂÊ»¹ÊǶÔÈí¼þµÄ¿É¿¿ÐÔ¶øÑÔ£¬·á¸»µÄ¾ÑéºÍÉîÈëµÄÀí½âÊÇÁ½¸ö¹Ø¼üµÄÒòËØ¡£ÖÁÉÙ£¬¾Ñé·á¸»µÄ³ÌÐòÔ±²»»áÔÚºÚ°µÖаíõÓ¡£ËûÃÇÊìÖªÄÇÀïµÄµØÐΣ¬ËûÃÇÖªµÀÄÇÀïµÄ¸ßµÍÆð·ü£¬Òò¶ø¿ÉÒԱܿªÄÇЩΣÏÕÇøÓò¡£±¾ÊéÏò¶ÁÕßչʾÁËÎÒÃǵľÑ飬¶Ô50¸ö·ÖÁ¢µÄ»°ÌâÌṩÁËÖ¸µ¼Òâ¼û£¬°ïÖúÄã±Ü¿ªÄÇЩΣÏյشø¡£
ÔÚJava Pitfalls£¨Wiley£¬2000£©[1]Ò»ÊéÖУ¬ÎÒÃÇÊ״θø³öÁËÏÝÚ壨pitfall£©µÄÕýʽ¶¨Ò壺
¡°ÏÝÚ壬ÊÇÖ¸ÄÇЩÄܹ»Õý³£±àÒ룬µ«ÔÚÖ´ÐÐʱȴ²úÉúÊÂÓëԸΥµÄ£¬ÓÐʱÉõÖÁÊÇÔÖÄÑÐÔºó¹ûµÄ³ÌÐò´úÂë¡£¡±
Õâ¸öÏà¶Ô¼ò½àµÄ¶¨Ò帲¸ÇÁ˱»ÎÒÃÇÈÏΪÊÇ¡°»ù±¾¡±µÄÏÝÚå¡£¶ÔÓÚÏÝÚåµÄ¶¨Ò廹ÓÐÐí¶àÖÖ˵·¨¡£Ò»¸ö¸üΪ¹ã·ºµÄ¶¨ÒåÊÇ£ºÈκοÉÄܵ¼Ö³ÌÐòÔ±°Ñ´óÁ¿µÄʱ¼äÀË·ÑÔÚ¿ª·¢¹¤¾ßµÄʹÓÃÉ϶ø²»ÊÇ×îÖÕÈí¼þµÄ½øÕ¹ÉϵÄÓïÑÔÌØÐÔ¡¢API»òϵͳ£¬¶¼¿ÉÒÔ³ÆÎªÏÝÚå¡£
²úÉúÏÝÚåµÄÔÒò´óÖ¿ÉÒÔ·Ö³ÉÁ½ÖÖÀàÐÍ£ºÆ½Ì¨Éè¼ÆÕßµÄʧÎóºÍ¾ÑéÇ··áµÄ³ÌÐòÔ±µÄ¹ýʧ¡£ÕâÑù·ÖÀ಻ÊÇΪÁË×·¾¿ÔðÈΣ¬¶øÊÇ´Ó¹¹½¨ÏÝÚå·ÖÀàѧµÄ½Ç¶ÈÀ´È·¶¨ÏÝÚåµÄ¸ùÔ´¡£ÎÒÃÇÔÚͼ1.1ÖÐչʾÁËÏÝÚåµÄ·ÖÀ࣬ĿµÄ¾ÍÊǸüºÃµØÀí½âÕâЩÈÃÎÒÃÇÏÝÈëÀ§¾³µÄ¶«Î÷¡£

ͼ1.1 ÏÝÚå·ÖÀàѧ
ºÍϵͳÉè¼ÆÕßÏà¹ØµÄÏÝÚåÀàÐÍÓÐÏÂÃæ¼¸ÖÖ£º
²»Ö±¹ÛµÄÓ¦ÓóÌÐò±à³Ì½Ó¿Ú£¨API£©¡£Javaƽ̨¾ßÓÐÊýǧ¸öÀàºÍÊýÍò¸ö·½·¨¡£½öÕâ¸öƽ̨µÄ¹æÄ£¾ÍÒѾÊÇÒ»¸ö¸´ÔÓµÄÏÝÚå¡£ÓÐЩÀàÉè¼ÆµÃ·Ç³£³öÉ«£¬ÈçServlet¡¢IOÁ÷£¨ÅųýЧÂÊÒòËØ£©ºÍCollection£¨¼¯ºÏ£©¡£Òź¶µÄÊÇ£¬Ðí¶àAPIÉè¼ÆµÃºÜ²»Ö±¹Û£¬ÆäÔÒòÈçÏ£º
l ´íÎóµÄ³éÏó²ã¡£Ðí¶àAPIÊǹ¹ÖþÓÚÆäËûÈí¼þ£¨Èç²Ù×÷ϵͳ»ò±¾µØ´úÂ룩µÄ²ãÃæÖ®Éϵģ¬Ä¿µÄÊÇΪÁ˶Թ¦ÄܽøÐмò»¯»ò¾ÛºÏ¡£ÔÚÉè¼ÆAPIʱ£¬Éè¼ÆÈËÔ±±ØÐëÔÚ¼òµ¥ÐԺͿØÖÆÁ£¶ÈÖ®¼ä½øÐÐȨºâ¡£Òò´Ë£¬ÔÚÉèÖóéÏó²ãʱ£¬Éè¼ÆÈËÔ±±ØÐë¸ù¾Ý¾ßÌåµÄ»·¾³ºÍÄ¿±êÓû§Öƶ¨Êʵ±µÄ²»Ê§Æ½ºâµÄ·½°¸¡£Èç¹û³éÏó²ã´ÎÌ«¸ß£¨ÈçURLConnection, Item17£©£¬Óû§¿ÉÄÜ»áÒòΪ¶Ô¸÷ÖÖÓ³Éä¹ØÏµµÄ¿ØÖÆÄÜÁ¦Ì«Èõ¶ø¸Ðµ½Ê§Íû¡£Èç¹û³éÏó²ã´ÎÌ«µÍ£¬Óû§¿ÉÄÜ»áÔÚÄÇЩ×î³£¼ûµÄ²Ù×÷ÖÐÀË·ÑÌ«¶àµÄʱ¼ä£¬´Ó¶øµ¼ÖÂЧÂʵÍÏ¡£
l ½¹µã·ÖÀëµÄ²»×ã¡£µ±Ò»¸öAPIÊÔͼʵÏÖÌ«¶àµÄ¹¦ÄÜʱ£¬Ëü³£³£»á»ìÔÓÐí¶àÒþ»ÞµÄº¬Ò壬´Ó¶øÒÔÒ»ÖÖ²»ÀíÏëµÄ·ç¸ñ´¦ÀíËüµÄ¶à¸ö½¹µã¡£Õâ·½ÃæµÄÒ»¸öÀý×ÓÊÇJAXR API£¬ËüÊÔͼ½«²»Í¬µÄÐÅϢģÐÍUDDIºÍebXML×éºÏÔÚÒ»Æð£¨Item47£©¡£
l ÆäËûȱÏÝ¡£Ì«¶àµÄ·½·¨µ÷ÓÃÐòÁкÍÒÀÀµ¹ØÏµÓпÉÄܵ¼Ö²»ÕýÈ·µÄ²Ù×÷˳Ðò¡£µÍÁÓµÄÃüÃûºÍÈõÀàÐͲÎÊý£¨object¶ø²»ÊÇijÖÖ¾ßÌåµÄÀàÐÍ£©ÓпÉÄܽ«³ÌÐòÔ±±ÆÉϾøÂ·¡£
ÓïÑԵĸ´ÔÓÐÔ¡£ºÍËüµÄǰ±²ÓïÑÔÏà±È£¬JavaÓïÑÔÓÐÁËÐí¶à¸Ä½ø£¬µ«ËüÈÔÈ»ÉîÏÝÓÚ¸÷ÖÖÕÛÖÔºÍÌØÐÔµÄäöÎÐÖ®ÖС£Ëü×î¸É¾»µÄÓïÑÔÌØÐÔÊÇËüÑϸñµÄÃæÏò¶ÔÏóÐÔ¡¢×Ô¶¯ÄÚ´æ¹ÜÀíºÍ½Ó¿Ú¡£µ«ËüµÄÓÐЩÓïÑÔÌØÐÔ£¨ÈçÏ̺߳Íͬ²½¡¢»ù±¾ÀàÐͺͶÔÏóÖ®¼äµÄ¶ÔÁ¢ÒÔ¼°Òì³£µÄÓÐЧʹÓõȣ©¹ýÓÚ¸´ÔÓÁË¡£
ƽ̨ÁìÓòµÄʵÏÖ·½Ê½Ç·¼Ñ¡£Õâ·½Ãæ×î³£±»ÈËÃÇËùÌá¼°µÄ¾ÍÊÇЧÂÊÎÊÌâ¡£Õâ·½ÃæµÄÒ»¸öµäÐÍÀý×ÓÊÇ£ºÓÉÓÚЧÂʵÄÔÒò£¬ÓïÑÔÉè¼ÆÕßÔÚNIO³ÌÐò°üÖÐÖØÐ±àдÁËÊäÈë/Êä³ö¹¤¾ß¡£³ýÁËЧÂÊÖ®Í⣬»¹ÓÐһЩAPIÆÆ»µÁËJavaÓïÑÔ¡°Ò»´Î±àд¡¢µ½´¦ÔËÐУ¨WORA£©¡±µÄ±£Ö¤£¬ÈçFile.renameTo()·½·¨£¨Item 20£©ºÍRuntime.exec()·½·¨£¨Item 1£©¡£»¹ÓÐһЩAPI²¢²»ÍêÕû£¬µ«³ÌÐòԱȴÒÔΪËüÌṩÁËÍêÕûµÄ¹¦ÄÜ¡£ÕâЩÎÊÌâÊÇ¿ÉÒÔÐÞÕýµÄ£¬ËüÃÇͨ³£ÔÚJava Development Kit£¨JDK£©µÄа汾Öнâ¾ö¡£
ºÍ³ÌÐòÔ±ÓйصÄÏÝÚåÀàÐÍÓÐÏÂÃæ¼¸ÖÖ£º
֪ʶµÄØÑ·¦¡£¾Ñé¿ÉÒÔÌáÉý³ÌÐòÔ±µÄ֪ʶÉî¶È¡£Ñ§Ï°Ò»¸öϵͳµÄµ×²ã¸ÅÄî¡¢Ï໥×÷ÓÃÒÔ¼°Ï¸Î¢Ö®´¦ÐèҪʱ¼ä¡£Õâ³£³£±íÏÖÔÚµ±´æÔÚÒ»¸ö¸üºÃµÄÌæ´ú·½°¸Ê±£¬Æ«Æ«Ñ¡ÔñÁËÒ»¸ö²»ÀíÏëµÄʵÏÖ·½°¸£¨ÈçAppletºÍWeb Start£¬Item 26£©¡¢¶ÔÒ»¸öAPIÄÚ²¿¹¤×÷¹ý³ÌµÄÀí½âÓÐÎó£¨ÈçServletʵÀý±äÁ¿µÄ½á¹û£¬Item 31£©ÒÔ¼°µ±ÊµÏÖ·½°¸ÎÞ·¨´ïµ½ÄãÔ¤ÆÚµÄÐÐΪʱ¸Ðµ½Õ𾪣¨ÔÚͼ1.1ÖÐÓÃ×迹²»Æ¥ÅäÀ´±íʾ£©¡£ÕâÖÖ×迹²»Æ¥Åä¿ÉÄÜ·¢ÉúÔÚ¶àÖØ²¢·¢½á¹û¼¯ÖУ¨Item 41£©¡£
Æ«¼û¡£Èç¹ûûÓжàÄêµÄ¾Ñ飬³ÌÐòÔ±¿ÉÄÜ»á¹ýÓÚÒÐÖØÒÔǰµÄ¾Ñ飬Õâ¿ÉÄܵ¼ÖÂËûÆ«ÏòÓÚij¸öÌØ¶¨µÄ·½Ïò¡£Õâ·½ÃæµÄÀý×ÓÊDz»ÀûÓÃÄÇЩÄܹ»ÓÃÓÚ×Ô¶¯¿ª·¢¹ý³ÌµÄ¹¤¾ßÈçAnt£¨Item 11£©ºÍJUnit£¨Item 12£©¡£ÁíÍâÒ»¸öÀý×ÓÊǼá³ÖʹÓÃÔÏȵÄAPI£¬¶ÔÓÃÓÚ¼¯ºÏ£¨Item 21£©ºÍÕýÔò±í´ïʽ£¨Item 30£©µÄÐÂAPIÊÓ¶ø²»¼û¡£×îºó£¬»¹ÓÐÒ»ÖÖÆ«¼û¾ÍÊǰÑÔÏȵÄϰ¹ß´øµ½Ò»¸öеıà³Ì»·¾³ÖУ¬ÈçJ2ME±à³Ì£¨Item 22£©¡£
ÎÞЧµÄ¼ÙÉè¡£³ÌÐòÔ±¿ÉÄÜ»á¸ù¾ÝÎÞЧµÄ¼ÙÉè×÷³ö²»ÕýÈ·µÄ¾ö¶¨£¬ÀýÈ磬Ëû¿ÉÄÜ»áÒÔΪ×îÖ±½ÓµÄ½â¾ö·½°¸¾ÍÊÇ×îºÃµÄ½â¾ö·½°¸¡£ÕâÖÖÇé¿ö³£³£ÔÚʹÓÃJSP£¨Item24£©ºÍJ2EE£¨Item22£©Éè¼Æ´óÐÍϵͳʱ³öÏÖ¡£
ÏÝÚå¿ÉÄÜ»áÁî³ÌÐòÔ±²úÉúÇ¿ÁҵĴìÕ۸С£ÎÒÃÇÊ×ÏȾÀúÁËÕâЩ´ìÕÛ¡£ÎÒÃǵÄÄ¿±ê¾ÍÊǰïÖú¶ÁÕß±ÜÃâһЩÎÒÃÇÔø¾Í´¿à²»¿°µÄÔâÓö¡£¼ÈÈ»ÎÒÃÇÏÖÔÚÒѾ֪µÀÁËʲôÊÇÏÝÚ壬½ÓÏÂÀ´Çë¿´Ò»ÏÂÎÒÃÇ·ÖÎöÏÝÚåµÄ·½·¨¡£
ÿ¸öItemÓÉ3¸ö²»Í¬µÄ²¿·Ö×é³É£º
Ö¢×´»òÎÊÌâ¡£ÏÔʾÏÝÚåËùÔì³ÉµÄºó¹û¡£ÎÒÃÇÓÃÒ»¸öÃû½Ð¡°BadXXX.java¡±µÄ³ÌÐòÀ´ËµÃ÷Õâ¸öÎÊÌ⣬ÆäÖС°XXX¡±±íʾÎÊÌâËù´æÔÚµÄÏÝÚåÀàÐÍ¡£
ÎÊÌâµÄ¸ùÔ´¡£ÕâÊǽÒʾÏÝÚå×îÖØÒªµÄÒ»¸ö²¿·Ö¡£ÔÚ´Ë£¬ÎÒÃÇÉîÈëµ×²ã£¬½âÊÍÁË¿ÉÄܵ¼Ö³ÌÐòÔ±°íõÓµÄÏêϸÄÚ²¿¹¤×÷¹ý³Ì¡¢ÎÞЧµÄ¼ÙÉè»òÕßAPIȱÏÝ¡£Í¨³£ÕâÖÖ½âÊͽ«Ê¹ÓÃÒ»ÕÅͼÀ´Ç¿»¯¶ÁÕßµÄÈÏʶ¡£
½â¾ö·½°¸£¨solution£©»ò½â¾ö°ì·¨£¨workaround£©¡£×îºóÒ»²¿·ÖÊÇչʾÎÊÌâµÄ½â¾ö·½·¨¡£ÕâÊÇÓÃÒ»¸öÃû½Ð¡°GoodXXX.java¡±³ÌÐòʵÏֵģ¬ËüÊÇ¡°BadXXX.java¡±µÄ¶ÔÓ¦³ÌÐò¡£Õâ¸öÎÊÌâ½â¾ö³ÌÐòͨ³£»¹½«¸ø³öÔËÐнá¹û£¬»òÕßÊÇÒ»ÕÅ±í£¬»òÕßÊÇÒ»ÕÅͼ£¬Ö¤Ã÷ÎÊÌâȷʵÒѾ½â¾ö¡£
ÕâÖÖ·ÖÎöÏÝÚåµÄ·½·¨±»Ö¤Ã÷ÊÇÒ»ÖÖÓÐЧµÄ·½·¨£¬ËüºÜºÃµØÕ¹Ê¾ÁËÕâЩ±à³Ì°µ½¸µÄËùÔÚ¡£
±¾Êé¼Ì³ÐÁËJava PitfallsµÄÐí¶àÓÅÐãÌØÐÔ£¬²¢ÔÚÈý¸ö·½Ãæ×÷Á˸Ľø£º
¸ü¹ãµÄ¸²¸Ç¡£Java Pitfalls°Ñ×¢ÒâÁ¦¼¯ÖÐÓÚlang¡¢util¡¢ioºÍGUI ³ÌÐò°üÖУ¬±¾ÊéÔò¸²¸ÇÁËJ2ME¡¢J2SEºÍJ2EEƽ̨¡£
еÄÌØÐÔ¡£±¾Ê麸ÇÁ˴󲿷ÖÐÂÌØÐÔ£¬ÈçÕýÔò±í´ïʽ¡¢NIO¡¢¶ÏÑÔ¡¢JAXR¡¢JAXM¡¢JAX-RPCµÈÐí¶àÐÂÌØÐÔ¡£
¸ü¼ÑµÄ¸²¸Ç¡£×÷Õ߸üΪ׼ȷºÍÍêÕûµØ×ñÑÁË¡°·ÖÎöÏÝÚ塱µÄÄ£ÐÍ£¬¶ÔÏÝÚåµÄÃèÊö¸üΪÖÜÈ«¡¢·ÖÎö¸üΪÏ꾡¡£
×ÜÖ®£¬×÷ÕßŬÁ¦Ê¹±¾ÊéÔÚ¸÷¸ö·½Ãæ¶¼³¬Ô½Java Pitfalls¡£ÎÒÃÇÕæ³ÏµØÏ£ÍûÎÒÃÇÄܹ»ÊµÏÖÎÒÃǵÄÄ¿±ê£¬²¢¹ÄÀø¹ã´ó¶ÁÕߵİÑÒâ¼û·´À¡¸øÎÒÃÇ¡£
ºÍJava PitfallsÒ»Ñù£¬±¾ÊéÒ²ÓÐ50¸öItem¡£µ«ºÍJava Pitfalls²»Í¬£¬±¾ÊéÖ»»®·ÖΪÈý¸ö²¿·Ö£¬·Ö±ð¶ÔÓ¦ÓÚÈý²ãÌåϵ½á¹¹¡£
µÚÒ»²¿·Ö£º¿Í»§²ã£¨The Client Tier£©¡£Õⲿ·Öº¸ÇÁËJ2MEºÍJ2SE£¬Ì½Ë÷ÁËÔÚ¿ª·¢ÍøÂçºÍ¶ÀÁ¢¿Í»§Ó¦ÓóÌÐòʱ¿ÉÄÜÓöµ½µÄÏÝÚå¡£Õⲿ·ÖÌÖÂ۵ϰÌâ°üÀ¨Æ«ºÃ£¨Preference£©¡¢Ó¦ÓóÌÐò²¿Êð¡¢ÈÕÖ¾¡¢IOЧÂʵȡ£Õⲿ·Ö¹²°üÀ¨22¸öÏÝÚå¡£
µÚ¶þ²¿·Ö£ºWeb²ã£¨The Web Tier£©¡£Õⲿ·ÖÑо¿ÔËÐÐÓÚWebÈÝÆ÷ÄÚ²¿µÄ×é¼þµÄÏÝÚ壬ÈçServletºÍJSPÒ³Ãæ¡£ÕâЩӦÓóÌÐò²úÉú¶¯Ì¬WebÒ³Ãæ»òÕßÓëApplet¡¢JNLP»ò¶ÀÁ¢µÄ¿Í»§½øÐн»»¥¡£Õⲿ·Öº¸ÇµÄ»°ÌâÓÐJSPÉè¼Æ¡¢»º´æ¼¼Êõ£¨Caching£©¡¢Servlet¹ýÂËÆ÷£¨Servlet Filter£©¡¢Êý¾Ý¿âÁ¬½Ó£¨Database Connection£©¡¢±íµ¥ÑéÖ¤£¨Form Validation£©µÈ¡£Õⲿ·Ö¹²°üÀ¨14¸öÏÝÚå¡£
µÚÈý²¿·Ö£ºÆóÒµ²ã£¨The Enterprise Tier£©¡£Õⲿ·ÖÎÒÃÇËù¹Û²ìµÄ×é¼þÊÇJ2EEƽ̨µÄÒ»²¿·Ö£¬»òÕßÊÇÔÚÆóÒµJava Bean£¨EJB£©ÈÝÆ÷µÄÄÚ²¿Ö´ÐУ¬Èç»á»°Bean¡¢ÊµÌåBeanºÍÏûÏ¢Çý¶¯Bean¡£ÕâЩ×é¼þÓëÆäËûÆóҵϵͳ£¨Enterprise System£©¡¢ÒÅÁôϵͳ£¨Legacy System£©ºÍWeb²ã½øÐн»»¥£¬»òÕßÖ±½ÓÓë¿Í»§½øÐн»»¥¡£ÓÉÓÚWeb·þÎñÔÚÆóÒµ²ãÖаçÑÝÁ˹ؼü½ÇÉ«£¬ËùÒÔÓÐЩÓëWeb ·þÎñAPI£¨JAXRºÍJAX-RPC£©Ïà¹ØµÄÏÝÚåÒ²ÔÚÕâÒ»²¿·Ö½øÐÐÃèÊö¡£Õⲿ·ÖµÄÆäËû»°ÌâÓÐJ2EEÉè¼Æ´íÎ󡢻ỰBean¡¢JavaÊý¾Ý¶ÔÏó£¨JDO£¬Java Data Object£©¡¢°²È«£¨Security£©¡¢ÊÂÎñ£¨Transaction£©µÈ¡£Õⲿ·Ö¹²°üÀ¨14¸öÏÝÚå¡£
Äã¿ÉÒÔ°´ÕÕÈýÖÖ·½Ê½Ê¹Óñ¾Ê飺×÷ÎªÄ³Ð©ÌØ¶¨ÎÊÌâµÄ²Î¿¼Êֲᡢ×÷ΪÎÊÌâËùÌáʾµÄ»°ÌâµÄ½Ì²Ä¡¢×÷ΪÄãËùÔÚ×éÖ¯µÄ¼¼ÊõÖ¸µ¼³ÌÐòµÄ×ÅÊֵ㡣ÈÃÎÒÃÇ·Ö±ðÏêϸÌÖÂÛ¡£
×÷Ϊ²Î¿¼ÊֲᡣÄã¿ÉÒÔ¸ù¾ÝĿ¼£¬Ñо¿ÄãËùÃæÁÙµÄÎÊÌâµÄ¾ßÌå½â¾ö·½°¸¡£¾ø´ó¶àÊý¶ÁÕß°´ÕÕÕâÖÖ·½Ê½Ê¹Óñ¾Êé¡£ÓÐЩ¶ÁÕß·´À¡ËûÃǰѵÚ1±¾Ê飨Java Pitfalls£©×÷Ϊ¼¼ÊõͼÊé¹ÝµÄ¹«¹²×ÊԴʹÓá£
×÷Ϊ½Ì²Ä¡£Äã´ÓÍ·µ½Î²ÔĶÁ±¾Ê飬ѧϰÿ¸öÏÝÚåµÄ¸ùÔ´¡£ÓÃÕâÖÖ·½Ê½ÔĶÁ±¾ÊéµÄÁíÒ»ÖÖ·½·¨ÊÇä¯ÀÀĿ¼»òÕýÎÄ£¬È»ºóÔĶÁÄã¸ÐÐËȤµÄÏÝÚå¡£×îºó£¬Äã¿ÉÒÔÔÚһЩ·ÇÕýʽµÄÄÚ²¿Á·±ø»î¶¯»ò¼¼Êõ½»Á÷»áÒéÉϰÑÿ¸öÏÝÚå×÷ΪСÐͽ̲ÄʹÓá£
×÷Ϊָµ¼³ÌÐòµÄÒ»²¿·Ö¡£Äã¿ÉÒ԰ѱ¾Êé×÷ΪÄãËùÔÚ×éÖ¯µÄ¼¼ÊõÖ¸µ¼³ÌÐòµÄÆðµã¡£±¾ÊéÊÇÔÚÆ½µÈÖ¸µ¼µÄÔÔòϱàдµÄ¡£¡°Ö¸µ¼Õß¡±µÄ´Êµä¶¨ÒåÊÇ¡°´ÏÃ÷ÇÒÖµµÃÐÅÀµµÄ¹ËÎÊ¡±¡£Õâ³£³£Ê¹ÈËÃÇÎóÒÔΪָµ¼Õß±ØÐëÄêÁä¸ü³¤¡¢¾Ñé¸ü·á¸»¡£ÎÒ·´¶ÔÕâ¸ö¶¨Ò壬ÒòΪ·ûºÏÕâ¸ö¶¨ÒåµÄÓÅÐãÖ¸µ¼ÕßÌ«ÉÙÁË¡£´Ó±¾ÖÊÉÏ˵£¬Ö¸µ¼ÊÇ̽Ë÷ÕæÀíµÄij¸ö·½Ãæ¡£Òò´Ë£¬³ÉΪһÃûÖ¸µ¼ÕߵĹؼüËØÖÊÊÇÄã±ØÐëÔÚÒ»¸öÁìÓòÓÐÉîÈëµÄÀí½â£¬²¢ÇÒÔ¸ÒâÈñðÈ˹²ÏíÄãµÄ֪ʶ¡£ÈκÎÈ˶¼¿ÉÒÔ²ÎÓëÕâ¸ö¹ý³Ì£¬ÎÒ¹ÄÀøÄã¼ÓÈ뵽ƽµÈÖ¸µ¼µÄÐÐÁÐÖС£´ó¼ÒÒ»Æð¹¤×÷£¬ÎÒÏàÐÅÎÒÃÇÄܹ»½â¾öÈí¼þÖÊÁ¿µÄΣ»ú¡£
±¾ÊéµÄÅäÌ×ÍøÕ¾£¨http://www.wiley.com/legacy/compbooks/daconta/ mjp/£©°üº¬4¸ö¹Ø¼üÄÚÈÝ£º
l Ô´´úÂë¡£±¾ÊéËùÓгÌÐòÇåµ¥µÄÔ´´úÂëÒÔѹËõÎĵµµÄÐÎʽÌṩ¡£
l ¿±Îó±í¡£¶ÁÕß»ò×÷Õß·¢ÏÖµÄÈκδíÎó½«ÁÐÈëµ½¶ÔÓ¦µÄÐÞÕýÎı¾ÖС£
l ÑùÕ¡£ÉÐδ¹ºÂò±¾Ê飬µ«¶ÔËüµÄ·ç¸ñºÍÄÚÈݸÐÐËȤµÄÈËÃÇ¿ÉÒÔË÷È¡±¾ÊéµÄÑùÕ¡¢Ä¿Â¼±íºÍË÷Òý¡£
l ÁªÏµµØÖ·¡£×÷ÕßµÄÓʼþµØÖ·ÒÔ¼°Ò»Ð©FAQµÄ´ð°¸¡£
±¾ÊéÊÇÓɳÌÐòԱΪ³ÌÐòÔ±¶ø±àд£¨Programmer for Programmer£©µÄ¡£ÎÒÃÇ»¶ÓÕû¸ö¼ÆËã»úÉçÇøµÄËùÓÐÆÀÂÛ¡¢½¨ÒéºÍÎÊÌâ¡£¶ÁÕߵķ´À¡Ê¹ÎÒÃǵÄд×÷¸üÓмÛÖµ£¬¶øÇÒÓÐÖúÓÚÌá¸ßÎÒÃǵŤ×÷ÖÊÁ¿¡£ÎÒ¸ÐлËùÓл¨Ê±¼äÓëÎÒÃǽӴ¥£¬±¨¸æ´íÎó¡¢Ìá³ö½¨ÉèÐÔÒâ¼û»ò±í´ïÔÞÉ͵ÄÈËÃÇ¡£
ÎÒµÄÓʼþµØÖ·ÊÇ£ºmike@daconta.net¡£ÄãÒ²¿ÉÒÔͨ¹ýÏÂÃæµÄͨÐŵØÖ·ÓëÎÒÁªÏµ£º
Michael C. Daconta
C/o Robert Elliott
Wiley Publishing, Inc.
111 River Street
Hoboken, NJ 07030
ÖÂÕæ³ÏµÄ×£¸££¡
Michael Daconta
Ò»ÑÇÀûÉ£ÄÇÖÝSierra Vista
×¢Ò⣺
¶Ô´úÂëµÄ˵Ã÷£ºÔÚÐí¶à´úÂëÇåµ¥ÖУ¬Äã¿ÉÒÔ·¢ÏÖijЩÐеÄ×îÓÒ¶ËÓÐÒ»¸ö
·ûºÅ£¬±íʾһÐеĿռäÎÞ·¨Ð´ÏÂÕû¸ö´úÂëÐеÄËùÓÐ×Ö·û£¬´Ë´¦±íʾתÐУ¬ÏÂÒ»ÐеÄÄÚÈÝÊôÓÚÉÏÒ»ÐеÄÁ¬Ðø¡£
µÚÒ»²¿·Ö ¿Í»§²ã
Item 1£ºµ±Runtime.exec()ÔËÐгö´íʱ
Item 2£ºNIOµÄЧÂʺÍÏÝÚå
Item 3£ºÎÒÄþÔ¸²»Ê¹ÓÃÊôÐÔ
Item 4£ºµ±ÐÅÏ¢Òþ²ØµÃÌ«¶àʱ
Item 5£º±ÜÃâjava.util.loggingÖеÄÁ£¶ÈÏÝÚå
Item 6£ºµ±±ê×¼APIµÄʵÏÖ·¢Éú³åͻʱ
Item 7£º¶ÏÑÔ¾ø·Ç¶àÓà
Item 8£º²éÕÒDOMµÄ´íÎó·½·¨
Item 9£º±£´æÒ»¸öDOMµÄÀ§¾³
Item 10£ºÊó±ê°´Å¥µÄ¿ÉÒÆÖ²ÐÔ
Item 11£ºApache AntºÍÉúÃüÖÜÆÚ¹ÜÀí
Item 12£ºJUnit£ºµ¥Ôª²âÊÔʹÊÂÇé±äµÃ¼òµ¥
Item 13£ºÖ´ÐеÄʧ°Ü
Item 14£ºÄãÊÕ¼¯ÁËʲô
Item 15£º±ÜÃâSingletonÏÝÚå
Item 16£ºµ±setSize()²»ÄÜÈçԸʱ
Item 17£ºµ±POSTµ½Ò»¸öURLÎÞ·¨ÈçԸʱ
Item 18£ºÓÐЧµÄ×Ö·û´®±ê¼Ç»¯
Item 19£ºJLayered PaneÏÝÚå
Item 20£ºFile.renameToΪʲôʧ°Ü
Item 21£ºÊ¹Óõü´úÌæ´úö¾Ù
Item 22£ºJ2MEµÄЧÂʺÍÏÝÚå
µÚ¶þ²¿·Ö Web²ã
Item 23£ºÕä¹óµÄ»º´æ
Item 24£ºJSPÉè¼Æ´íÎó
Item 25: µ±Servlet HttpSession·¢Éú³åͻʱ
Item 26£ºµ±Applet×ßÏòʧ°Üʱ
Item 27£ºÊÂÎñÐÔLDAP¡ª²»Òª½øÐÐÌá½»
Item 28£ºÓë¹ýÂËÆ÷ÓйصÄÎÊÌâ
Item 29£º¹ØÓÚJSP¸´ÓúÍÄÚÈÝ·¢²¼µÄһЩָµ¼
Item 30£ºÊ¹ÓÃÕýÔò±í´ïʽ½øÐд°ÌåÑéÖ¤
Item 31£ºServletÖеÄʵÀý±äÁ¿
Item 32£ºÊ¹ÓÃServlet´´½¨Êý¾Ý¿âÁ¬½ÓµÄÉè¼ÆÈ±ÏÝ
Item 33£ºÊÔͼÔÚServletÖÐʹÓÃÁ½ÖÖÊä³ö»úÖÆ
Item 34£ºÉñÃØµÄÎļþÐÒé
Item 35£º´ÓServlet¶ÁÈ¡Îļþ
Item 36£ºÌ«¶àµÄÌá½»
µÚÈý²¿·Ö ÆóÒµ²ã
Item 37£ºJ2EEÌåϵ½á¹¹µÄ¿¼ÂÇ
Item 38£ºÏû³ýÍøÂçÆ¿¾±ÏÝÚåµÄÉè¼Æ²ßÂÔ
Item 39£ºÎÒ½«Ê¹Óñ¾µØ½Ó¿Ú
Item 40£ºÍ¼ÏñµÄÀ§ÈÅ
Item 41£º¶àÖØ²¢·¢½á¹û¼¯µÄÎÊÌâ
Item 42£ºÎªEJBÉú³ÉÖ÷¼ü
Item 43£ºÓÐ״̬µÄÎÞ״̬»á»°Bean
Item 44£ºÎ´×¼±¸µÄPreparedStatement
Item 45£ºÌ½Ë÷×ÊÔ´³Ø
Item 46£ºJDO ºÍÊý¾Ý³Ö¾Ã»¯
Item 47£ºWSDLλÓں䦣¿ÔÚUDDIÖÐʹÓÃJAXRµÄÏÝÚå
Item 48£ºJAX-RPCÓ¦ÓóÌÐò¿Í»§´æÔÚµÄЧÂÊÏÝÚå
Item 49£ºÈÃÄãµÄBeanÔ¶ÀëÎÒµÄÎļþϵͳ
Item 50£ºµ±ÊÂÎñ³ö´íʱÈçºÎ±£³ÖÓÐ״̬»á»°EJBµÄÒ»ÖÂÐÔ״̬
Ë÷Òý.............................................................................................................................. 411
¡°ÏÖÔÚ£¬Èç¹ûÎÒÃǰѱà³ÌÓïÑÔÖ÷Òªµ±×÷ÊÇÒ»ÖÖ°ÑÎÊÌâÊäÈëµ½»úÆ÷µÄÊֶΣ¬ÄÇô±à³ÌÓïÑÔµÄÖÊÁ¿¾ÍÈ¡¾öÓÚËü¡®³ä·ÖÀûÓûúÆ÷¡¯µÄ³Ì¶È¡£¡±
Edsger W. Dijkstra£¬
¡°Éè¼ÆÓë»úÆ÷Î޹صıà³ÌÓïÑÔ¡±
ʹÓÃJava¿ª·¢ÒÔ¿Í»§¶ËΪÖ÷µÄÓ¦ÓóÌÐòÔø¾³öÏÖ¹ýһЩÒýÈËעĿµÄʧ°ÜÏîÄ¿¡£CorelÓÃJava¿ª·¢ÁËÒ»¸ö°ì¹«Ì×¼þ£¬µ«ÔÚ·¢²¼ÁËÒ»¸öÔçÆÚµÄbeta°æÖ®ºó¾Í·ÅÆúÁ˸ÃÏîÄ¿¡£NetscapeÔø³¢ÊÔ¿ª·¢Ò»¸ö´¿Java°æ±¾µÄWebä¯ÀÀÆ÷£¨³ÆÎª¡°Javagator¡±£©£¬µ«Õâ¸ö¹¤³Ì»¹Ã»Óз¢²¼ÈκδúÂë±ãÐû¸æÈ¡Ïû¡£ËäÈ»ÕâЩÊÂÇé·¢ÉúÔÚ¿Í»§¶ËJavaµÄÔçÆÚ½×¶Î£¬´ó¸ÅÊÇÔÚ1997¡«1998ÄêʱÆÚ£¬µ«¶ÔÓÚ¿Í»§¶ËJava¶øÑÔ£¬ÎÞÒÉÒѾ×÷³öÁËÒ»¸öÁîÈ˾ÚÉ¥µÄ½áÂÛ¡£Òò´Ë£¬ÈËÃǶÔJavaµÄÐËȤÖð½¥×ªÏòÁË·þÎñÆ÷¶Ë¡£µ«ÊÇ£¬¼´Ê¹ÊÇÔÚ·þÎñÆ÷¶ËJavaµÄÒõӰ֮ϣ¬¿Í»§¶ËJavaÈÔÈ»ÔÚÂýÂýµØ¸Ä½ø¡£Ëæ×Åÿ¸öа汾µÄ·¢²¼£¬Javaƽ̨³öÏÖÁ˸ü·á¸»µÄÓû§½Ó¿Ú¡¢¸ü¿ìµÄÐéÄâ»ú¡¢Á£¶È¸ü¾«Ï¸µÄ°²È«Ä£ÐÍÒÔ¼°¸ü·½±ãµÄÍøÂ粿Êð¡£Òò´Ë£¬½èÓÃMicrosoft³£ÓõÄÒ»ÖÖ˵·¨£¬¿Í»§¶ËJavaÒ»Ö±ÔÚÕýÊÓ×ÅËüµÄȱµã£¬²¢Ëæ×Åÿ¸öа汾µÄ·¢²¼Ö𽥸Ľø¡£½ñÌ죬ÎÒÃÇÒѾ¿´µ½ÁËÐí¶àÓÃJava¿ª·¢µÄÒýÈËעĿ²¢Çҷdz£³É¹¦µÄÉÌÒµÓ¦ÓóÌÐò£¬ÈçThinkFree Office¡¢BorlandµÄJbuilder¡¢TIBCOµÄTurbo XML±à¼Æ÷ºÍTogetherSoftµÄTogether Control Center UML½¨Ä£¹¤¾ß¡£Òò´Ë£¬ÓÃJava¿ª·¢·á¸»µÄ¿Í»§¶ËÓ¦ÓóÌÐòÊÇÍêÈ«¿ÉÄܵġ£±¾ÊéµÄµÚÒ»²¿·Ö¾ÍÊǰïÖúÄãÔÚÕâ·½ÃæÓÐËù½¨Ê÷¡£
±¾ÊéµÄµÚÒ»²¿·Ö̽ÌÖÁ˿ͻ§¶Ë¿ª·¢µÄ3¸öͨÓÃÁìÓòÖдæÔÚµÄÏÝÚ壺ЧÂÊ¡¢²»Ö±¹ÛµÄÓ¦ÓóÌÐò±à³Ì½Ó¿Ú£¨API£©ºÍ¸üºÃµÄÌæ´ú·½°¸¡£ÕâÀï¸ø³öÁËÿ¸öÁìÓòµÄÏÝÚåµÄһЩҪµã¡£
ЧÂʳ¤ÆÚÒÔÀ´Ò»Ö±Êǿͻ§¶ËJavaΪÈËÚ¸²¡Ö®´¦¡£ÎÒÃǵÄǰһ±¾Ê飬Java Pitfalls£º Time-Saviing Solutions and Workarounds to Improve Programs£¬½²ÊöÁËÐí¶àÓйØÐ§ÂʵÄÏÝÚå¡£Ðí¶àÆäËûÊé¼®ÒÔ¼°Ðí¶àÍøÕ¾µÄÄ¿±ê¶¼ÊÇÖÂÁ¦ÓÚÌá¸ßJavaµÄЧÂÊ¡£Õⲿ·ÖÓÐÁ½¸öºÍЧÂÊÓйصÄÏÝÚ壺
l NIOµÄЧÂʺÍÏÝÚ壨Item 2£©¡£Õâ¸öItemÑо¿ÁËÐÂIO³ÌÐò°üÔÚIOЧÂÊÉϵĸĽø£¬ËüÑо¿ÁËÎļþͨµÀ£¨File Channel£©¡¢ByteBufferºÍ·Ç×èÈûÐÔ·þÎñÆ÷IO£¨non-blocking server IO£©¡£
l J2MEµÄЧÂʺÍÏÝÚ壨Item 22£©¡£ÔÚÕâ¸öItemÀÎÒ°ÑÒ»¸öSwingÓ¦ÓóÌÐòÒÆÖ²µ½J2MEƽ̨£¬²¢Õ¹Ê¾ÁËÆäÖеÄAPIÏÝÚåÒÔ¼°³¬¹ý20¸öµÄÕë¶ÔÕâЩСÐÍÉ豸ӦÓóÌÐòµÄÓÅ»¯´ëÊ©¡£
²»Ö±¹ÛµÄAPI¿ÉÄÜ»áÈÃÄãÀË·ÑÊý¸öСʱÈÔȻһÎÞËù»ñ£¬±¾ÊéµÚÒ»²¿·ÖµÄ´ó²¿·ÖÏÝÚåÊôÓÚÕâÒ»Àà¡£ÎÒÃǽ«¶ÔAPI½øÐÐ×Ðϸ·ÖÎö£¬Ñо¿Èí¼þµÄÄÚ²¿¹¤×÷¹ý³Ì£¬²¢ÌṩÕâЩÎÊÌâµÄ½â¾ö·½·¨¡£½â¾ö·½·¨ÓÐÊ±Éæ¼°µ½ÕýÈ·µÄ²Ù×÷ÐòÁУ¬²»Í¬µÄÀàµÄʹÓ㬻òÕß·ÅÆú±ê×¼API£¬Ñ°Ç󿪷ÅÔ´´úÂëµÄÌæ´ú·½°¸¡£
l µ±Runtime.exec()ÔËÐгö´íʱ£¨Item 1£©¡£Õâ¸öÏÝÚåÊÇÒ»¸öµäÐ͵ÄÓû§ÆÚÍûÖµºÍÒ»¸ö¹¦Äܲ»Í걸µÄAPIÖ®¼ä²»Æ¥ÅäµÄÀý×Ó¡£
l ÔÚjava.util.loggingÖбÜÃâÁ£¶ÈÏÝÚ壨Item 5£©¡£ÐµÄjava.util.logging API´æÔÚһЩÒþ±ÎµÄ¸´ÔÓÐÔºÍÏ໥¹ØÏµ£¬ËüÃǽ«»áÓ°Ï챨¸æÁ£¶ÈµÄ²ã´Î¡£Äã±ØÐëÀí½âloggerºÍhandlerÖ®¼äµÄ¹ØÏµ£¬ÒÔ±ãÓÐЧµØÊ¹ÓÃÕâ¸öAPI¡£
l ²éÕÒDOMµÄ´íÎó·½·¨£¨Item 8£©¡£ÔÚJDK 1.4ÖУ¬Javaƽ̨ʹÓÃjavax.xml³ÌÐò°üÌṩÁ˶ÔXMLµÄ±¾µØÖ§³Ö¡£²»ÐÒµÄÊÇ£¬Îĵµ¶ÔÏóÄ£ÐÍ£¨DOM£¬ Document Object Model£©×îÖ±¹ÛµÄ±íʾÐÎʽȴ²»ÊÇÕýÈ·µÄ±íʾÐÎʽ¡£Õâ¸öItemÉîÈëµØÌ½Ë÷ÁËÆäÖеÄÔµÓÉ¡£
l ±£´æDOMµÄÀ§¾³£¨Item 9£©¡£JAXPÒýÈëÁËһЩ±ê×¼µÄ·½·¨´´½¨ºÍ²Ù×ÝXML DOMÊ÷£¬µ«ËüÔÚ¶ÔËüÃǽøÐг־û¯·½ÃæµÄÄÜÁ¦½ÏÈõ¡ª¡ªÕâÆÈʹ¿ª·¢ÈËԱʹÓÃÒÀÀµ±àÒëÆ÷µÄ·½·¨¡£Õâ¸öItemÌÖÂÛÁËÕâ·½ÃæµÄÌôÕ½¡£
l Ö´ÐеÄʧ°Ü£¨Item 13£©¡£Java Archive»òJARÊÇJava×é¼þ¶þ½øÖÆ·¢²¼µÄÖ÷ÒªÐÎʽ¡£Òź¶µÄÊÇ£¬ÔÚÕâЩÎļþµÄ¹¤×÷ÔÀíÒÔ¼°Ö´Ðз½Ê½·½Ãæ´æÔںܴóµÄ»ìÏý¡£Õâ¸öItem̽Ë÷ÁËÕâЩÎÊÌâ²¢¶ÔʹÓÃJARÎļþµÄ×î¼Ñ·½Ê½ÌṩÁ˽âÊÍ¡£
l µ±POSTµ½Ò»¸öURLÎÞ·¨ÈçԸʱ£¨Item 17£©¡£java.net APIÖеÄURLºÍURLConnectionÀàÊÇÔÚÒ»¸öÏ൱¸ßµÄ³éÏó²ã´ÎÉè¼ÆµÄ£¬ËüÃǺÜÈÝÒ×ÒýÆð»ìÏý¡£Õâ¸öItemչʾÁËһЩʹÓÃAPIµÄ²»ÕýÈ··½·¨£¬½ÒʾÁËÕâЩȱÏݱ³ºóµÄÔÒò£¬²¢ÌṩÁËÕâ¸öÎÊÌâµÄÒ»¸ö½â¾ö·½°¸ÒÔ¼°Ò»¸ö¿ª·ÅÔ´´úÂëÌæ´ú·½°¸¡£
Ëæ×ÅÆ½Ì¨µÄÖð½¥ÀÏ»¯ÒÔ¼°²»µÃ²»ÑØÓÃÇ·¼ÑµÄ·½°¸ÒÔά³ÖÏòºó¼æÈÝ£¬´æÔÚ±ê×¼Ö®ÍâµÄ¸üºÃÌæ´ú·½°¸Õâ¸öÎÊÌâ¿ÉÒÔ˵ÊÇÈÕ½¥Í¹ÏÖ¡£³ýÁËÆ½Ì¨ÖÐеÄAPIÖ®Í⣬¿ª·ÅÔ´´úÂëÌæ´ú·½°¸ÔÚÐí¶à·þÎñÁìÓò¶¼Ö¤Ã÷ÁË×Ô¼ºÊÇ×î¼Ñ·½°¸¡£
l ÎÒÄþÔ¸²»Ê¹ÓÃÊôÐÔ£¨Item 3£©¡£Õâ¸öItemչʾÁËPropertiesÀàµÄһЩÈõµã£¬²¢ËµÃ÷ÁËΪʲô˵java.util.prefs³ÌÐò°üÌṩÁËÒ»¸ö¸üºÃµÄ½â¾ö·½°¸¡£
l µ±ÐÅÏ¢Òþ²ØµÃÌ«¶àʱ£¨Item 4£©¡£¶Ô³éÏóÊÂÎï¶øÑÔ£¬¿ª·¢ÈËÔ±³£³£Óöµ½µÄÒ»¸öÎÊÌâÊÇËü¿ÉÄÜÏò¿ª·¢ÈËÔ±Òþ²ØÒ»Ð©ÖØÒªµÄÐÅÏ¢¡£Òì³£¾ÍÊÇÒ»¸öµäÐ͵ÄÀý×Ó¡£Õâ¸öItemչʾÁËÔÚеÄJDK 1.4ÖУ¬Á´Ê½Òì³£¹¤¾ßÊÇÈçºÎ½â¾öÕâ¸öÎÊÌâµÄ¡£
l µ±±ê×¼APIµÄʵÏÖ·¢Éú³åͻʱ£¨Item 6£©£ºÔÚXML³ÉΪJDK 1.4µÄÒ»²¿·ÖÖ®ºó£¬ËæÖ®Á¢¼´²úÉúÁËÒ»¸öÎÊÌ⣬¾ÍÊÇXML±ê×¼ºÍJDK°æ±¾Ö®¼äµÄ²»Í¬²½¡£±¾½Ú½«½éÉÜJDK 1.4ÊÇÈçºÎ¶ÔÕâЩÒѾÈϿɵıê×¼µÄ¸üÐÂÌṩ֧³ÖµÄ¡£
l ¶ÏÑÔ¾ø·Ç¶àÓࣨItem 7£©¡£´ÓÐÂÌØÐÔµÄÒýÈëµ½´ó²¿·Ö³ÌÐòÔ±²ÉÄÉÕâ¸öÌØÐÔͨ³£ÓÐÒ»¸öʱ¼äÉϵÄÑÓ³Ù¡£¶ÔÓÚÏñ¶ÏÑÔÕâÖֹؼüµÄ¿É¿¿ÐÔ·½ÃæµÄ¸Ä½ø£¬ÕâÖÖ²ÉÄÉÑÓ³ÙÊÇÒ»¸öÑÏÖØµÄÎÊÌâ¡£Õâ¸öItem½«Ö¸µ¼ÄãÈçºÎʹÓÃÕâ¸öÖØÒªµÄ¹¤¾ß¡£
l Apache AntºÍÉúÃüÖÜÆÚ¹ÜÀí£¨Lifecycle Management£©£¨Item 11£©¡£ËäÈ»µÚÒ»²¿·ÖµÄ¾ø´ó¶àÊýÏÝÚå³öÏÖÔÚÓïÑÔºÍAPI²ã´Î£¬µ«Õâ¸öÏÝÚåµÄÊÓÒ°¸üΪ¹ãÀ«£¬ËüѰÕÒÒ»ÖÖÈí¼þÉúÃüÖÜÆÚ¹ÜÀíµÄ¸üºÃÌæ´ú·½°¸¡£¶ÔÓÚÍŶӿª·¢¶øÑÔ£¬ºöÊÓÀàËÆAntÕâÑùµÄ´´½¨¹¤¾ß¿ÉÒÔ˵ÊÇÒ»¸öÑÏÖØµÄÏÝÚå¡£
l JUnit£ºµ¥Ôª²âÊÔʹÊÂÎï±äµÃ¼òµ¥£¨Item 12£©¡£ºÍAnt´´½¨¹¤¾ßÒ»Ñù£¬JUnitÒ²ÊÇÒ»¸ö·Ç³£ÖØÒªµÄ¹¤¾ß¡£Í¨¹ýµ¥Ôª²âÊÔ£¬Ëü¿ÉÒÔÈ·±£´úÂëµÄÖÊÁ¿¡£Õâ¸öItemչʾÁËÈçºÎÓÐЧµØÊ¹ÓÃJUnit£¬²¢½âÊÍÁËΪʲôºöÂÔËüÊÇÒ»¼þÔã¸âµÄÊ¡£
l ʹÓÃIterationÌæ´úEnumeration£¨Item 21£©¡£Collection API±»Ö¤Ã÷ÊǸßЧµÄÇÒºÜÊÜ»¶Ó¡£Õâ¸öItem½ÒʾÁËEnumerationµÄʵÏÖËù´æÔÚµÄÒ»¸öÈõµã£¬²¢¶ÔÆäÄÚ²¿Ï¸½Ú½øÐÐÁËÑо¿£¬ÕÒ³öÁËÎÊÌâµÄ¸ùÔ´£¬Õ¹Ê¾ÁËIterationÊÇÈçºÎ½â¾öÕâ¸öÎÊÌâµÄ¡£
±¾ÊéµÄµÚÒ»²¿·Ö°üÀ¨22¸öÏÝÚ壬¸²¸ÇÁËÐí¶àÐèÒª±ÜÃâµÄ¿Í»§¶ËÏÝÚ塣ʹÓÃÕâЩ½â¾ö·½·¨ºÍ¼¼ÇÉʹÄãÄܹ»´´½¨½¡×³µÄ¿Í»§¶ËÓ¦ÓóÌÐò£¬¡°¸üºÃµØÀûÓûúÆ÷¡±¡£Õⲿ·ÖÊ£ÓàµÄÏÝÚ廹ÓУº
l Êó±ê°´Å¥µÄ¿ÉÒÆÖ²ÐÔ£¨Item 10£©¡£JavaÊÇ¿ª·¢¿çƽ̨ӦÓóÌÐòµÄÓÅÐãÑ¡Ôñ¡£²»ÐÒµÄÊÇ£¬²¢²»ÊÇËùÓÐµÄÆ½Ì¨¶¼ÊÇÏàͬµÄ£¬ÓÈÆäÊÇÉæ¼°×î³£¼ûµÄÊäÈëÉ豸¡ª¡ªÊó±êʱ¡£Õâ¸öItemչʾÁËÔÚ²»Í¬µÄÊäÈëÉ豸֮¼ä½øÐй¤×÷ËùÃæÁÙµÄÌôÕ½¡£
l ÄãÊÕ¼¯ÁËʲô£¨Item 14£©¡£ÔÚ´¦ÀíCollection APIʱ£¬³éÏó¹ý¶ÈÕâ¸öÎÊÌâ±äµÃ¸ñÍâ¼âÈñ¡£Õâ¸öItemչʾÁËһЩ¼¯ºÏµÄÔªËØÀàÐÍδ֪µÄÀý×Ó£¬²¢ÌÖÂÛÁ˽â¾öÕâ¸öÎÊÌâµÄ×îвßÂÔ¡£
l ±ÜÃâSingletonÏÝÚ壨Item 15£©¡£Singleton£¨µ¥¼þ£©Ä£Ê½ÊÇÒ»Öֹ㷺ʹÓõÄJava¿ª·¢Ä£Ê½¡£²»ÐÒµÄÊÇ£¬ÔÚÈçºÎʹÓÃSingleton·½Ã棬¿ª·¢ÈËÔ±³£³£»á³öÏÖÐí¶à´íÎó¡£Õâ¸öItem˵Ã÷ÁËÕâЩ´íÎ󣬲¢½¨ÒéÁËһЩ½â¾ö°ì·¨¡£
l µ±setSize()ÎÞ·¨ÈçԸʱ£¨Item 16£©¡£¿ª·¢ÈËÔ±£¨ÓÈÆäÊÇÄÇЩÐÂÊÖ£©³£³£»áʹÓÃһЩ·½·¨£¬µ«ËûÃǶÔÓë´ËÏà¹ØÁªµÄAPIȴûÓÐÒ»¸öÈ«ÃæµÄÀí½â¡£Õâ·½ÃæÒ»¸öºÜºÃµÄÀý×Ó¾ÍÊÇsetSize()·½·¨µÄʹÓã¬Ëü¿ÉÄܻᵼÖÂÒâÏë²»µ½µÄ½á¹û¡£Õâ¸öItem²»½öÑо¿ÁËsetSize()·½·¨µÄ´íÎóÓ÷¨£¬¶øÇÒÌÖÂÛÁ˲¼¾Ö¹ÜÀíÆ÷£¨Layout Manager£©µÄ¸ÅÄî¡£
l ÓÐЧµÄ×Ö·û´®±ê¼Ç»¯£¨Item 18£©¡£StringTokenizerÀàµÄ²Ù×÷³£³£±»ÈËÎó½â¡£Óöà×Ö·û×÷Ϊ¶¨½ç·ûµÄ×Ö·û´®ÓÐʱ»á³öÏÖһЩÓÐȤµÄÎÊÌâ¡£Õâ¸öItem¶ÔÕâЩÎÊÌâ½øÐÐÁËÑо¿£¬²¢½âÊÍÁËÈçºÎ±ÜÃâÕâЩÎÊÌâ¡£
l JLayered PaneÏÝÚ壨Item 19£©¡£Õâ¸öItemÑо¿ÁËÓëʹÓÃSwingµÄLayered PaneÓйصÄÎÊÌ⣬ÓÈÆäÊÇÔÚËüÉÏÃæÊ¹Óò¼¾Ö¹ÜÀíÆ÷ÓйصÄÄÇЩÎÊÌâ¡£
l µ±File.renameTo()ÔËÐгö´íʱ£¨Item 20£©¡£ÔÚJavaÖУ¬ÎļþµÄÏ໥×÷ÓÿÉÄܵ¼ÖÂÒâÏë²»µ½µÄ½á¹û£¬ÓÈÆäÊÇÔÚ¿çÎļþϵͳ»ò¿çƽ̨µÄÇé¿öÏ¡£Õâ¸öItem̽ÌÖÁËÕâЩÒâÏë²»µ½µÄ½á¹û£¬²¢ÌṩÁËÕâЩÎÊÌâµÄ½â¾ö·½°¸¡£
java.lang.RuntimeÀàÓÐÒ»¸ö¾²Ì¬·½·¨³ÆÎªgetRuntime()£¬ËüÓÃÓÚ»ñÈ¡µ±Ç°µÄJavaÔËÐÐʱ»·¾³¡£Èç¹ûÄãÏë»ñµÃÒ»¸öRuntime¶ÔÏóµÄÒýÓã¬ÕâÊÇΩһµÄ·½·¨¡£ÓÐÁËÕâ¸öÒýÓÃÖ®ºó£¬Äã¿ÉÒÔµ÷ÓÃRuntimeÀàµÄexec()·½·¨À´ÔËÐÐÍⲿ³ÌÐò¡£Æô¶¯ä¯ÀÀÆ÷ÏÔʾijЩÀàÐ͵ÄHTMLÐÎʽµÄ°ïÖúÒ³ÃæÍùÍù¾ÍÐèÒªÕâÑù×ö¡£exec()·½·¨¹²ÓÐ4¸öÖØÔØ°æ±¾£¬ËüÃǵÄÔÐÍÈçÏ£º
l public Process exec(String command)£»
l public Process exec(String [] cmdArray)£»
l public Process exec(String command£¬ String [] envp)£»
l public Process exec(String [] cmdArray£¬ String [] envp)£»
ËùÓÐÕâЩ·½·¨±³ºóµÄ»ù±¾Ë¼Â·ÊÇ£º°ÑÒ»¸öÃüÁ¿ÉÄÜ»¹ÓÐÒ»×é²ÎÊý£©´«µÝ¸øÒ»¸öÒò²Ù×÷ϵͳ¶øÒìµÄº¯Êýµ÷Ó㬽«Ò»¸öProcessÀàµÄÒýÓ÷µ»Ø¸øJavaÐéÄâ»ú£¨VM£©£¬´Ó¶ø´´½¨Ò»¸öÒò²Ù×÷ϵͳ¶øÒìµÄ½ø³Ì£¨Ò»¸öÔËÐÐÖеijÌÐò£©¡£ProcessÀàÊÇÒ»¸ö³éÏóÀ࣬ÕâÊÇÒòΪÿ¸ö²Ù×÷ϵͳ¶¼ÓÐÒ»¸öÌØ¶¨µÄProcessÀàµÄ×ÓÀà¡£ÕâЩ·½·¨ÓÐ3ÖÖ¿ÉÄܵÄÊäÈë²ÎÊý£ºµ¥¸öString²ÎÊý£¬Ëüͬʱ±íʾÐèÒªÖ´ÐеijÌÐòºÍ¸Ã³ÌÐòµÄËùÓвÎÊý£»Ò»¸öStringÊý×飬Ëü½«³ÌÐò¼°Æä²ÎÊýÇø·Ö¿ªÀ´±íʾ£»Ò»¸ö»·¾³±äÁ¿Êý×飬»·¾³±äÁ¿²ÎÊý¸ù¾Ýname=valueÕâÑùµÄ¸ñʽ½øÐд«µÝ¡£×¢Ò⣬Èç¹ûÄãʹÓõÄexec()·½·¨Ê¹ÓõÄÊǼȱíʾ³ÌÐòÓÖ±íʾÆä²ÎÊýµÄµ¥¸öString²ÎÊý£¬³ÌÐò¶ÔÕâ¸öString²ÎÊý½øÐнâÎöʱʹÓÿհ××÷Ϊ·Ö¸ô·û£¬ÕâÊÇͨ¹ýStringTokenizerÀàʵÏֵġ£
ÏÖÔÚ³£¼ûµÄ¶ÔÒ»¸öAPIµÄÊ״βâÊÔ¾ÍÊÇÓÃËü×îÏÔ¶øÒ×¼ûµÄ·½·¨½øÐбàÂë¡£ÀýÈ磬ΪÁËÖ´ÐÐÒ»¸öJVMÍⲿµÄ½ø³Ì£¬ÎÒÃÇʹÓÃexec()·½·¨¡£ÎªÁ˹۲ìÍⲿ½ø³ÌµÄ·µ»ØÖµ£¬ÎÒÃÇʹÓÃProcessÀàµÄexitValue()·½·¨¡£ÔÚÎÒÃǵĵÚ1¸öÀý×ÓÖУ¬ÎÒÃÇÊÔͼִÐÐJava±àÒë³ÌÐò£¨javac.exe£©¡£³ÌÐòÇåµ¥1.1¾Í¸ºÔðÖ´ÐÐÕâÏîÈÎÎñ¡£
³ÌÐòÇåµ¥ 1.1 BadExecJavac.java
ÔËÐÐBadExecJavac³ÌÐò²úÉúÏÂÃæµÄÊä³ö£º
Õâ¸ö³ÌÐòÎÞ·¨ÔËÐУ¬ÒòΪÈç¹ûÍⲿ½ø³ÌÉÐδÍê³É£¬exitValue()·½·¨½«Å׳öÒ»¸öIllegalThreadStateExceptionÒì³££¬ÎĵµÖоÍÊÇÕâÑùÃèÊöµÄ¡£µ«ÕâȷʵÏÔµÃÆæ¹Ö£¬ÈËÃÇÈ̲»×¡ÒªÎÊ£ºÎªÊ²Ã´²»ÈÃÕâ¸ö·½·¨¼ÌÐøµÈ´ý£¬Ö±µ½Ëü¿ÉÒÔ¸øÎÒÃÇÒ»¸öÓÐЧµÄ´ð°¸ÄØ£¿ÔÙ´Î×ÐϸÉóÊÓProcessÀàËùÌṩµÄ·½·¨Ö®ºó£¬ÎÒÃÇ¿ÉÒÔ·¢ÏÖwaitFor()·½·¨¾ÍÊÇÓÃÓÚÖ´ÐÐÕâÏîÈÎÎñµÄ¡£ÊÂʵÉÏ£¬waitFor()·½·¨·µ»ØÒ»¸öÍ˳öÖµ£¬ÕâÒâζ×ÅÄã²»»áͬʱʹÓÃÕâÁ½¸ö·½·¨¡£ÄãҪôѡÔñwaitFor()£¬ÒªÃ´Ñ¡ÔñexitValue()¡£ÄãΩһ¿ÉÄÜʹÓÃexitValue()·½·¨Ìæ´úwaitFor()·½·¨µÄÔÒòÊÇÄ㲻ϣÍû³ÌÐòÒòΪµÈ´ýÒ»¸ö¿ÉÄÜÓÀÔ¶Ò²²»»áÍê³ÉµÄÍⲿ½ø³Ì¶ø×èÈû¡£´Ó¸öÈ˵ĽǶȽ²£¬ÎÒÇãÏòÓÚÈÃexitValue()·½·¨¾ßÓÐÒ»¸öÃûΪwaitForµÄ²¼¶ûÐͲÎÊý£¬ÓÃÓÚÈ·¶¨µ±Ç°Ïß³ÌÊÇ·ñÓ¦¸Ã½øÐеȴý¡£ÎÒÈÏΪʹÓÃÒ»¸ö²¼¶ûÐͲÎÊýµÄ·½°¸¸üºÃһЩ£¬ÒòΪexitValue()Õâ¸öÃû×ÖÓÃÓÚÕâ¸ö·½·¨¸üΪǡµ±Ò»Ð©¡£ÎÒÃÇûÓбØÒªÈÃÁ½¸ö²»Í¬µÄ·½·¨ÔÚ²»Í¬µÄÌõ¼þÏÂÖ´ÐÐÏàͬµÄ¹¦ÄÜ¡£ÕâÖÖ¼òµ¥µÄ¡°Ìõ¼þ¡±Çø·Öͨ¹ýʹÓÃÒ»¸öÊäÈë²ÎÊý¾ÍÍêÈ«¿ÉÒԴﵽĿµÄ¡£
ËùÒÔ£¬ÓëRuntime.exec()·½·¨Ïà¹ØµÄµÚ1¸öÏÝÚå¾ÍÊÇҪСÐÄIllegalThreadStateExceptionÒì³££¬Äã¿ÉÒÔ²¶×½Õâ¸öÒì³££¬Ò²¿ÉÒԵȴý½ø³ÌÍê³É¡£ÏÖÔÚ£¬ÈÃÎÒÃǶÔÉÏÃæÕâ¸ö³ÌÐò½øÐÐÐÞÕý£¬Ñ¡ÔñµÈ´ý½ø³ÌÍê³É¡£ÔÚ³ÌÐòÇåµ¥1.2ÖУ¬³ÌÐòÈÔÈ»³¢ÊÔÖ´ÐÐjavac.exe³ÌÐò£¬²¢½øÐеȴý£¬Ö±µ½Õâ¸öÍⲿ½ø³ÌÍê³É¡£
³ÌÐòÇåµ¥ 1.2 BadExecJavac2.java
Òź¶µÄÊÇ£¬ÔËÐÐBadExecJavac2³ÌÐò²»»á²úÉúÈκÎÊä³ö¡£Õâ¸ö³ÌÐò½«»á¹ÒÆð£¬ÓÀÔ¶²»»áÍê³É¡£ÎªÊ²Ã´javac½ø³ÌÓÀÔ¶²»»áÍê³ÉÄØ£¿javadocÎĵµÌṩÁ˴𰸣º¡°ÓÉÓÚÓÐЩ±¾µØÆ½Ì¨Îª±ê×¼ÊäÈëºÍÊä³öÁ÷ËùÌṩµÄ»º³åÇø´óСÓÐÏÞ£¬Èç¹û²»Äܼ°Ê±Ð´Èë×Ó½ø³ÌµÄÊäÈëÁ÷»òÕß¶ÁÈ¡×Ó½ø³ÌµÄÊä³öÁ÷£¬¿ÉÄܵ¼ÖÂ×Ó½ø³Ì×èÈû£¬ÉõÖÁÏÝÈëËÀËø£¨deadlock£©¡±¡£ÄÇô£¬ÕâÊÇ·ñÊdzÌÐòԱûÓС°RTFM[3]¡±¶øµ¼ÖµÄÒ»ÖÖÇé¿öÄØ£¿´ÓijÖֽǶȽ²£¬È·ÊµÈç´Ë¡£ÔÚÕâ¸öÀý×ÓÖУ¬ÔĶÁÊֲὫʹÄã½øÍËÁ½ÄÑ¡£ÊÖ²á¸æËßÄãÐèÒª¶ÔÍⲿ½ø³ÌµÄÁ÷½øÐд¦Àí£¬µ«Ëü²¢Ã»ÓиæËßÄã¸ÃÔõô×ö¡£³ýÁËRTFMÖ®Í⣬µ±ÄãÔÚÐÂÎÅ×éÑо¿Õâ¸öAPI³£¼ûµÄÎÊÌâºÍ´íÎóʱ£¬ºÜ¿ÉÄܺöÊÓÒ»¸öʵ¼ÊÉϺÜÖØÒªµÄÒòËØ¡£Runtime.exec()ºÍProcessÀàËùÌṩµÄAPI¿´ÉÏÈ¥¼«Îª¼òµ¥£¬µ«Æäʵ°µ²ØÐþ»ú£¬ÒòΪÕâЩAPIµÄ¼òµ¥£¨»òÕß˵ÊÇÏÔ¼û£©Ó¦ÓúÜÈÝÒ×·¢Éú´íÎó¡£
ÔÚ´Ë£¬APIÉè¼ÆÕߵĽÌѵÊǼòµ¥µÄAPIÓ¦¸ÃÓÃÓÚ¼òµ¥µÄ²Ù×÷¡£ÄÇЩÇ÷ÓÚ¸´ÔÓ»òÕß¾ßÓÐÌØ¶¨Æ½Ì¨ÒÀÀµÐԵIJÙ×÷Ó¦¸Ã׼ȷµØ·´Ó³ËüÃǵĸÅÄîÓò¡£¶ÔÊÂÎïµÄ³éÏó×öµÃ¹ýÍ·ÆäʵҲ²»ºÃ£¬ÕýËùν¹ýÓ̲»¼°Âï¡£Ò»¸ö¸üºÃµÄÓÃÓÚ´¦ÀíÕâЩ²Ù×÷µÄAPIÀý×ÓÊÇJConfig³ÌÐò¿â£¨http£º//www.tolstoy.com/samizdat/jconfig.html£©¡£Òò´Ë£¬ÏÖÔÚÈÃÎÒÃǰ´ÕÕÎĵµµÄÒªÇó¶Ôjavac½ø³ÌµÄÊä³ö½øÐд¦Àí¡£µ±Äã²»ÓÃÈκβÎÊýÔËÐÐjavac³ÌÐòʱ£¬Ëü½«Õ¹Ê¾Ò»×éÓ÷¨ËµÃ÷£¬ÃèÊö³ÌÐòµÄÓ÷¨ÒÔ¼°ËùÓпÉÓõijÌÐòÑ¡ÏîµÄº¬Òå¡£Èç¹ûÄãÖªµÀÁËÕâЩÐÅÏ¢½«ËÍÍùstderrÁ÷£¬¾ÍºÜÈÝÒ×±àдһ¸ö³ÌÐòÔڵȴý½ø³ÌÍ˳ö֮ǰºÄ¾¡Õâ¸öÁ÷¡£³ÌÐòÇåµ¥1.3¾ÍÊÇÖ´ÐÐÕâÏ×÷µÄ¡£ËäÈ»ÕâÖÖ·½·¨¿ÉÒԴﵽĿµÄ£¬µ«Õâ²¢²»ÊÇÒ»ÖÖÓÅÐãµÄͨÓýâ¾ö·½°¸¡£ÕâÒ²ÊdzÌÐòÇåµ¥1.3Ϊʲô±»ÃüÃûΪMediocreExecJavacµÄÔÒò¡£ËüÖ»ÊǸöÒ»°ã£¨mediocre£©µÄ½â¾ö·½°¸£¬Ò»¸ö¸üºÃµÄ½â¾ö·½°¸ÊǼÈÇå¿Õ±ê×¼´íÎóÁ÷ÓÖÇå¿Õ±ê×¼Êä³öÁ÷£¬×îºÃµÄ½â¾ö·½°¸ÔòÊÇͬ²½Çå¿ÕÕâÁ½¸öÁ÷£¨Õâ¸öÁô´ýÒÔºó˵Ã÷£©¡£
³ÌÐòÇåµ¥ 1.3 MediocreExecJavac.java

ÔËÐÐMediocreExecJavac³ÌÐò½«µÃµ½ÏÂÃæµÄÊä³ö£º
ÈçÉÏËùʾ£¬MediocreExecJavac³ÌÐò¿ÉÒÔÔËÐУ¬²¢ÇÒ²úÉúÍ˳öÖµ2¡£ÔÚÕý³£Çé¿öÏ£¬Í˳öÖµ0Òâζ×ųɹ¦£¬·Ç0ÖµÒâζ×Å´íÎó¡£Òź¶µÄÊÇ£¬ÕâЩÍ˳öÖµµÄº¬ÒåÒò²Ù×÷ϵͳ¶øÒì¡£ÔÚWin32ÖУ¬ÖµÎª2µÄ´íÎó´úÂë±íʾ¡°ÎļþδÕÒµ½¡±¡£ÕâÊǺϺõµÀÀíµÄ£¬ÒòΪjavacÆÚÍûÎÒÃÇÔÚ³ÌÐòÃûµÄºóÃæÊäÈëÐèÒª±àÒëµÄÔ´´úÂëÎļþ¡£ËùÒÔ£¬Ê¹ÓÃRuntime.exec()·½·¨Ó¦¸Ã±ÜÃâµÄµÚ2¸öÏÝÚåÊÇ£ºÈç¹ûÄãËùÔËÐеÄÍⲿ³ÌÐò½«µÃµ½Êä³ö»òÕßÆÚ´ýÊäÈ룬ÄãÓ¦¸ÃÈ·±£ÔÚÄãµÄ½ø³ÌÖжÔÊäÈëºÍÊä³öÁ÷½øÐд¦Àí¡£
ÈÃÎÒÃǻص½Windowsϵͳ£¬Ðí¶à³ÌÐòÔ±ÐÂÊÖÔÚÊÔͼʹÓÃRuntime.exec()·½·¨´¦Àí·Ç¿ÉÖ´ÐÐÃüÁîÈçdirºÍcopyʱ»á¸Ðµ½ÎªÄÑ¡£Òò´Ë£¬ÎÒÃǰÑexec()·½·¨µÄ²ÎÊý´Ó¡°javac¡±»»³É¡°dir¡±£¬ÈçÏÂËùʾ£º
Process proc = rt.exec(¡°dir¡±)£»
ÎÒÃÇ´´½¨Ò»¸öÃû½ÐBadExecWinDirµÄ³ÌÐò£¬³ýÁËÉÏÃæÕâÐдúÂëÍ⣬ËüºÍMediocreExecjavacÏàͬ¡£ÔËÐÐÕâ¸ö³ÌÐò²úÉúÏÂÃæµÄÊä³ö£º
Ç°ÃæÎÒÒѾ˵¹ý£¬´íÎóÖµ2±íʾÎļþδÕÒµ½£¬Ò²¾ÍÊÇ˵ÃûΪdir.exeµÄ¿ÉÖ´ÐÐÎļþδÄÜÕÒµ½¡£ÕâÊÇÒòΪdirÃüÁîÊÇWindowsÃüÁî½âÊÍÆ÷µÄÒ»²¿·Ö£¬Ëü²¢²»ÊÇÒ»¸öµ¥¶ÀµÄ¿ÉÖ´ÐгÌÐò¡£ÎªÁËÔËÐÐWindowsÃüÁî½âÊÍÆ÷£¬¸ù¾ÝÄãËùʹÓõÄWindows²Ù×÷ϵͳ£¬Äã»òÕßÖ´ÐÐcommand.com£¬»òÕßÖ´ÐÐcmd.exe¡£³ÌÐòÇåµ¥1.4ÔËÐÐWindowsÃüÁî½âÊÍÆ÷µÄÒ»·Ý¿½±´£¬È»ºóÖ´ÐÐÓû§ÌṩµÄÃüÁÈçdir£©¡£
³ÌÐòÇåµ¥1.4 GoodWindowsExec.java
![]()

ÓÃdirÃüÁî×÷Ϊ²ÎÊýÔËÐÐGoodWindowsExec³ÌÐò²úÉúÏÂÁÐÊä³ö£º


ÓÃÈκιØÁªµÄÎĵµÀàÐÍÔËÐÐGoodWindowsExec³ÌÐò½«Æô¶¯Óë¸ÃÎĵµÀàÐÍÏà¹ØÁªµÄÓ¦ÓóÌÐò¡£ÀýÈ磬ΪÁËÆô¶¯Microsoft WordÏÔʾһ¸öWordÎĵµ£¨À©Õ¹ÃûΪ.doc£©£¬Äã¿ÉÒÔʹÓÃÏÂÃæµÄÊäÈ룺
>java org.javapitfalls.item1.GoodWindowsExec ¡°yourdoc.doc¡±
×¢ÒâGoodWindowsExecʹÓÃos.nameϵͳÊôÐÔÅжÏÄãÕýÔÚÔËÐеÄWindows²Ù×÷ϵͳµÄÀàÐÍ£¬²¢¾Ý´ËʹÓÃÕýÈ·µÄÃüÁî½âÊÍÆ÷¡£Ö´ÐÐÃüÁî½âÊͳÌÐòÖ®ºó£¬ÎÒÃÇʹÓÃStreamGobblerÀà´¦Àí±ê×¼´íÎóºÍ±ê×¼ÊäÈëÁ÷¡£StreamGobblerÀàÔÚÒ»¸öµ¥¶ÀµÄÏß³ÌÀïÇå¿ÕÈκÎ×÷Ϊ²ÎÊý´«µÝ¸øËüµÄÁ÷¡£µ±Õâ¸öÀà°Ñ¸Õ¸Õ¶ÁÈ¡µÄÊäÈëÐдòÓ¡µ½¿ØÖÆÌ¨£¨console£©Ê±£¬ËüʹÓÃÒ»¸ö¼òµ¥µÄStringÀàÐͱíʾËüÕýÔÚÇå¿ÕµÄÊÇÄĸöÁ÷¡£ËùÒÔ£¬ÎÒÃÇÐèÒª±ÜÃâµÄµÚ3¸öÏÝÚåÊÇŪÇåÄãÕýÔÚÖ´ÐеÄÊÇÒ»¸ö¶ÀÁ¢µÄ¿ÉÖ´ÐгÌÐò»¹ÊÇÒ»¸ö¾¹ý½âÊ͵ÄÃüÁî¡£ÔÚ±¾½ÚµÄ×îºó£¬ÎÒ½«Õ¹Ê¾Ò»¸ö¼òµ¥µÄÃüÁîÐй¤¾ß£¬Ëü¿ÉÒÔ°ïÖúÄãÅжÏÄãËùÔËÐеÄÊÇÄÄÖÖÀàÐ͵ijÌÐò¡£
ÖµµÃ×¢ÒâµÄÊÇÔÚProcessÀàÖУ¬ÓÃÓÚÈ¡µÃ½ø³ÌÊä³öÁ÷µÄ·½·¨³ÆÎªgetInputStream()¡£ÎÒÃÇÕâÀïÌáµ½Êä³öÁ÷£¬ÊÇÒòΪվÔÚJava³ÌÐòµÄ½Ç¶È¶ø²»ÊÇÍⲿ½ø³ÌµÄ½Ç¶È¡£ËùÒÔ£¬Íⲿ½ø³ÌµÄÊä³ö¾ÍÊÇJava³ÌÐòµÄÊäÈë¡£´ÓÕâ¸ö½Ç¶ÈÀ´¿´£¬Íⲿ½ø³ÌÖеÄÊäÈëÁ÷ÔÚJava³ÌÐòÖбã³ÉÁËÊä³öÁ÷¡£
ºÍRuntime.exec()·½·¨ÓйصÄ×îºóÒ»¸öÏÝÚå¾ÍÊDz»ÒªÒÔΪexec()Äܹ»½ÓÊÜÃüÁîÐУ¨»òshell£©ËùÄܽÓÊܵÄËùÓÐString²ÎÊý¡£Õâ¸öÏÝÚå²¢²»ÑÏÖØ£¬¶øÇÒ²¢²»ÊÇËùÓÐµÄÆ½Ì¨¶¼´æÔÚÕâ¸öÎÊÌâ¡£Õâ¸öÏÝÚåµÄ×îÖ÷ÒªÓÕÒòÊÇÓû§ÔÚʹÓÃexec()·½·¨Ê±ÊÔͼÈÃËüÏñÃüÁîÐÐÒ»Ñù½ÓÊܵ¥¸öString²ÎÊý¡£Õâ¸ö»ìÏýºÜ¿ÉÄÜÊÇÓÉÓÚexec()·½·¨µÄ²ÎÊýÃûÊÇcommandËùÖ¡£³ÌÐòÔ±¿ÉÄÜ»á´íÎ󵨰Ñcommand²ÎÊýºÍÈκÎÄã¿ÉÒÔÔÚÃüÁîÐÐÖÐÊäÈëµÄ¶«Î÷ÁªÏµÆðÀ´£¬¶ø²¢Ã»ÓÐÒâʶµ½command²ÎÊýÓ¦¸ÃÊÇÒ»¸ö³ÌÐòÃûºÍ¸Ã³ÌÐòµÄ²ÎÊý¡£ÀýÈ磬Óû§ÊÔͼִÐÐÒ»¸ö³ÌÐò£¬²¢ÔÚexec()·½·¨ÖжԳÌÐòµÄÊä³ö½øÐÐÖØ¶¨Ïò¡£³ÌÐòÇåµ¥1.5ÊÔͼִÐÐÕâÏîÈÎÎñ¡£
³ÌÐòÇåµ¥1.5 BadWinRedirect.java


ÔËÐÐBadWinRedirect³ÌÐò²úÉúÏÂÁÐÊä³ö£º

BadWinRedirect³ÌÐòÊÔͼ°ÑÒ»¸ö¼òµ¥µÄJava°æecho³ÌÐòµÄÊä³öÖØ¶¨Ïòµ½Îļþtest.txt¡£È»¶ø£¬µ±ÎÒÃǶÔÊä³ö½á¹û½øÐмì²é£¬¹Û²ìtest.txtÎļþÊÇ·ñÒѱ»´´½¨Ê±£¬½á¹û·¢ÏÖËü²¢²»´æÔÚ¡£jecho³ÌÐò¼òµ¥µØ½ÓÊÜËüµÄÃüÁîÐвÎÊý²¢°ÑËüÃÇдÈëµ½±ê×¼Êä³öÁ÷¡£jecho³ÌÐòµÄÔ´´úÂë¿ÉÒÔÔÚWebÕ¾µãÕÒµ½¡£Óû§ÒÔΪÄã¿ÉÒÔÏñÔÚÒ»¸öDOSÃüÁîÐÐÖÐÄÇÑù°Ñ±ê×¼Êä³öÖØ¶¨Ïòµ½Ò»¸öÎļþ¡£Òź¶µÄÊÇ£¬´ËʱÄã²»ÄÜÓÃÕâÖÖ·½·¨¶ÔÊä³öÁ÷½øÐÐÖØ¶¨Ïò¡£ÔÚÕâÀÄã²»ÒªÒÔΪexec()·½·¨µÄÐÐΪºÍshell½âÊÍÆ÷ÊÇÏàͬµÄ£¬ÊÂʵÉÏËüÃÇÊDz»Ò»ÑùµÄ¡£exec()·½·¨Ö´ÐÐÒ»¸ö¿ÉÖ´ÐгÌÐò£¨³ÌÐò»ò½Å±¾£©¡£Èç¹ûÄãÏ£Íû¶ÔÁ÷½øÐд¦Àí£¬¶ÔËü½øÐÐÖØ¶¨Ïò»òÕßͨ¹ý¹ÜµÀ£¨pipe£©ÊäË͵½ÆäËû³ÌÐò£¬Äã±ØÐëʹÓÃjava.io ³ÌÐò°ü°´ÕÕÒ»¶¨µÄ²Ù×÷˳ÐòÖ´ÐÐÕâÏîÈÎÎñ¡£³ÌÐòÇåµ¥1.6ÕýÈ·µØ°Ñjecho½ø³ÌµÄ±ê×¼Êä³öÁ÷ÖØ¶¨Ïòµ½Ò»¸öÎļþ¡£
³ÌÐòÇåµ¥1.6 GoodWinRedirect.java




ÔËÐÐGoodWinRedirect³ÌÐò²úÉúÈçÏÂÊä³ö£º

ÔËÐÐGoodWinRedirect³ÌÐòÖ®ºó£¬ÎÒÃÇ·¢ÏÖtest.txtÎļþÒѾ´æÔÚ¡£Õâ¸öÏÝÚåµÄ½â¾ö·½°¸ÊÇͨ¹ý°ÑÍⲿ½ø³Ì±ê×¼Êä³öÁ÷µÄ´¦Àí´ÓRuntime.exec()·½·¨ÖзÖÀë³öÀ´£¬¼òµ¥µØ¶ÔÖØ¶¨Ïò½øÐд¦Àí¡£ÎÒÃÇ´´½¨Ò»¸ö¶ÀÁ¢µÄOutputStreamÁ÷£¬¶ÁÈëÎļþÃû×÷ÎªÖØ¶¨ÏòµÄÄ¿±ê£¬´ò¿ªÎļþ£¬½«ÎÒÃÇ´ÓÄǸöÑÜÉúµÄÍⲿ½ø³ÌµÄ±ê×¼Êä³öËù»ñµÃµÄÊä³öдÈëµ½Õâ¸öÎļþÖС£ÔÚ³ÌÐòÇåµ¥1.7ÖУ¬Õâ¸öÈÎÎñÊÇͨ¹ýΪÎÒÃǵÄStreamGobblerÀàÌí¼ÓÒ»¸öÐµĹ¹Ôì·½·¨ÊµÏֵġ£Õâ¸öÐµĹ¹Ôì·½·¨½ÓÊÜ3¸ö²ÎÊý£º(1)ÐèÒªÇå¿ÕµÄÊäÈëÁ÷£¬(2)Ò»¸öStringÀàÐ͵IJÎÊý£¬ÓÃÓÚ±íʾÎÒÃÇÕýÔÚÇå¿ÕµÄÁ÷£¬(3)ÊäÈëÖØ¶¨ÏòËùÖÁµÄÊä³öÁ÷¡£Õâ¸öа汾µÄStreamGobblerÀಢ²»»áÆÆ»µÒÔǰʹÓÃËüµÄ´úÂ룬ÒòΪÎÒÃDz¢Ã»ÓжÔÔÓеĹ«ÓÃAPI½øÐÐÐ޸ģ¨Ö»ÊǶÔËü½øÐÐÀ©Õ¹¶øÒÑ£©¡£JavaWorldÎÄÕµÄһλ¶ÁÕßGeorge Neervoort×¢Òâµ½£¬GoodWinRedirect³ÌÐò¿ÉÒÔ×÷³öµÄÒ»¸öÖØÒª¸Ä½ø¾ÍÊÇÈ·±£Á÷ÒѾÍê³ÉÁË´Ó½ø³Ì¶ÁÈ¡µÄÊäÈë¡£ÕâÊDZØÒªµÄ£¬ÒòΪ½ø³ÌÓпÉÄÜÔÚÏß³ÌÍê³É֮ǰ¾Í½áÊø¡£ÏÂÃæÊÇËû¶ÔÕâ¸öÎÊÌâµÄ½â¾ö·½°¸£¨¸ÐлGeorge£©
![]()
¼ÈÈ»Runtime.exec()·½·¨µÄ²ÎÊýÈ¡¾öÓÚ²Ù×÷ϵͳ£¬ÎÒÃÇÓ¦¸ÃʹÓõÄÕýÈ·ÃüÁîÒ²Òò²Ù×÷ϵͳ¶øÒì¡£ËùÒÔ£¬ÔÚ×îÖÕÈ·¶¨Runtime.exec()·½·¨µÄ²ÎÊý֮ǰ£¬Äܹ»ÔÚ±àд´úÂëǰ¿ìËÙ²âÊÔһϲÎÊýÊǺÜÓмÛÖµµÄ¡£³ÌÐòÇåµ¥1.7ÊÇÒ»¸ö¼òµ¥µÄÃüÁîÐй¤¾ß£¬ÔÊÐíÄãÍê³ÉÕâÏ×÷¡£
³ÌÐòÇåµ¥1.7 TestExec.java

![]()

ÔËÐÐTestExec³ÌÐò£¬Æô¶¯Netscapeä¯ÀÀÆ÷²¢ÔØÈëJava°ïÖúÎĵµ£¬½«²úÉúÏÂÁÐÊä³ö£º

ÈçÉÏËùʾ£¬ÎÒÃǵĵÚ1´Î²âÊÔʧ°Ü£¬´íÎó´úÂëΪ193¡£ÔÚWin32ÖУ¬ÖµÎª193µÄ´íÎó´úÂë±íʾ¡°²»ÊÇÒ»¸öÓÐЧµÄWin32Ó¦ÓóÌÐò¡±¡£Ëü¸æËßÎÒÃÇÎÞ·¨ÕÒµ½ÄǸö¹ØÁªµÄÓ¦ÓóÌÐò£¨ÈçNetscape£©£¬Ã»ÓÐÕâ¸ö¹ØÁªµÄÓ¦ÓóÌÐò£¬½ø³ÌÎÞ·¨ÔËÐÐÒ»¸öHTMLÎļþ¡£Òò´Ë£¬ÎÒÃÇ¿ÉÒÔÔٴνøÐвâÊÔ£¬Õâ´Î¸ø³öÁËNetscapeµÄÍêÕû·¾¶£¨»òÕßÎÒÃÇ¿ÉÒÔ°ÑNetscapeÌí¼Óµ½ÎÒÃǵÄPATH»·¾³±äÁ¿ÖУ©¡£Õâ´Î£¬ÔËÐÐTestExec³ÌÐò²úÉúÈçÏÂÊä³ö£º
![]()
ÐÐÁË£¡Netscapeä¯ÀÀÆ÷Æô¶¯£¬²¢ÇÒÔØÈëÁËJava°ïÖúÎĵµ¡£
Ò»¸öÓÐÓõÄÁ·Ï°ÊǶÔTestExec³ÌÐò½øÐÐÐ޸ģ¬°Ñ±ê×¼ÊäÈëºÍ±ê×¼´íÎóÖØ¶¨Ïòµ½Ò»¸öÎļþ¡£µ±ÄãÔÚWindows95»òWindows98ÉÏÖ´ÐÐjavac±àÒë³ÌÐòʱ£¬ÕâÖÖ·½·¨¿ÉÒÔ½â¾ö´íÎóÐÅÏ¢Òç³öÓÐÏÞµÄÃüÁîÐлº³åÇøÕâ¸öÎÊÌ⡣ΪÁ˰ѱê×¼Êä³öºÍ±ê×¼´íÎó²¶×½µ½Ò»¸öÎļþÖУ¬ÏÂÃæÁгöÁËһЩ¹Ø¼üµÄ´úÂëÐУº
![]()

TestExec³ÌÐòµÄÁíÒ»¸ö¿É¹©¸Ä½øÖ®´¦ÊÇÉèÖÃÒ»¸öÃüÁîÐпª¹Ø£¬ÔÊÐí´Ó±ê×¼ÊäÈë½ÓÊÜÊäÈë¡£Õâ¸öÊäÈëËæºóʹÓÃProcess.getOutputStream()·½·¨´«µÝ¸øÄǸöÑÜÉúµÄÍⲿ³ÌÐò¡£±¾½Ú̽ÌÖÁ˺ÍʹÓÃRuntime.exec()·½·¨ÓйصöÎÊÌ⣬²¢ÌṩÁËһЩ½â¾ö·½°¸£¬ÐÖúÄãÖ´ÐÐÍⲿӦÓóÌÐò¡£
NIO ³ÌÐò°üÔÚÊäÈë/Êä³ö£¨IO£©µÄЧÂÊ·½ÃæÂõ³öÁËÒ»´ó²½£¬²¢ÇÒÔö¼ÓÁËÐí¶àÐÂÌØÐÔ¡£µ«ÊÇ£¬ÕâЩÌá¸ß²¢·ÇÍêȫûÓдú¼Û£¬Ëü²»½ö½øÒ»²½Ôö¼ÓÁËIOµÄ¸´ÔÓÐÔ£¬¶øÇÒÒþ²ØÁËһЩDZÔÚµÄÏÝÚå¡£ÔÚÕâ¸öItemÖУ¬ÎÒÃǽ«Ñо¿Õâ¸öгÌÐò°üµÄһЩÓŵãºÍȱµã¡£ÔÚÑо¿¾ßÌåµÄÌØÐÔ֮ǰ£¬ÈÃÎÒÃÇÏÈÕ¾ÔڽϸߵÄÊÓµãÉÏ£¬¶ÔNIO ³ÌÐò°üÒÔ¼°ËüµÄÌØÐÔ×÷Ò»·¬ä¯ÀÀ¡£ÔÚNIO ³ÌÐò°üÖУ¬¹²ÓÐ4¸öÖ÷ÒªµÄ³éÏó¸ÅÄî¡£
ͨµÀ£¨Channel£©¡£Í¨µÀ±íʾÓëÄܹ»Ö´ÐÐIO²Ù×÷µÄʵÌåÖ®¼äµÄÒ»¸öÁ¬½Ó£¬ÕâÀàʵÌåÓÐÎļþºÍÌ×½Ó×Ö£¨socket£©µÈ¡£Í¨µÀÊǸù¾ÝËüËùÁ¬½ÓµÄʵÌåµÄÀàÐÍ·ÖÀàµÄ£¬ÈçFileChannel»òSocketChannel¡£ÎªÁËÌá¸ßIO²Ù×÷µÄËÙ¶È£¬Í¨µÀºÍ»º³åÇøÁªºÏ¹¤×÷£¬½øÐжÁÈ¡»òдÈë¡£ÓÐЩͨµÀÒÔ½Ó¿ÚµÄÐÎʽ³öÏÖ£¬·Ö±ð°çÑݲ»Í¬µÄ½ÇÉ«£¬ÈçGatheringByteChannel»òScatteringByteChannel£¬ËüÃÇ¿ÉÒÔ´Ó¶àÖÖÐòÁеĻº³åÇø½øÐжÁÈ¡»òдÈë¡£×îºó£¬Äã¿ÉÒÔͨ¹ýFileInputStream¡¢FileOutputStream¡¢ServerSocket¡¢SocketºÍRandomAccessFileÀà»ñȡһ¸öͨµÀ¡£Òź¶µÄÊÇ£¬ÔÚÒѾʮ·ÖÓµ¼·µÄIOÁìÓò£¨stream¡¢pipe¡¢reader¡¢writer£©ÀïÔÙÌí¼ÓÕâЩиÅÄ¶Ô¾ø´ó¶àÊý³ÌÐòÔ±¶øÑÔÊǼ«ÈÝÒ×ÒýÆð»ìÏýµÄ¡£Í¬Ê±£¬ÕâЩ¸ÅÄîÏ໥֮¼ä´æÔÚÖØµþ£¬ËüÃǵÄAPIÖ®¼äÒ²»á»¥ÏàÓ°Ïì¡£×ÜÖ®£¬ÎªÊýÖÚ¶àµÄIOÀàËùµ¼Öµĸ´ÔÓÐÔÒÔ¼°ËüÃÇÔÚ¹¦ÄÜÉϵÄÖØµþ£¬ÊÇÕâ¸öÁìÓò×î´óµÄÒ»¸öÏÝÚå¡£
»º³åÇø£¨Buffer£©¡£»º³åÇøÊÇÒ»ÖÖ·ºÐÍÊý¾ÝÈÝÆ÷£¬Ëü¿ÉÒÔ¶Ôµ¥ÖÖÊý¾ÝÀàÐ͵ÄËæ»ú·ÃÎʽøÐвÙ×Ý¡£ËüÃÇÓëCharset»òChannelÀ༯³ÉÔÚÒ»Æð¡£Ã¿¸ö»º³åÇø°üÀ¨Ò»¸ö±êÖ¾£¨mark£©¡¢Î»Öã¨position£©¡¢ÏÞÖÆ£¨limit£©ºÍÈÝÁ¿£¨capacity£©Öµ£¨ÒÔ¼°ÓÃÓÚ²Ù×ݵĶÔÓ¦·½·¨£©¡£ÆäÖÐλÖÿÉÒÔÉèÖÃΪ»º³åÇøÖеÄÈκεص㡣»º³åÇø¸ù¾Ýģʽȷ¶¨ËüµÄ¹¤×÷·½Ê½£¨¶ÁÈ¡»òдÈ룩£¬Èç¹ûÎÒÃÇÐèÒªÐ޸Ļº³åÇøµÄ¹¤×÷·½Ê½£¬±ØÐë¶ÔÕâ¸öģʽ½øÐС°·×ª¡±¡£
×Ö·û¼¯£¨Charset£©¡£×Ö·û¼¯¾ÍÊÇ×Ö½ÚºÍ16λµÄUnicode×Ö·ûÖ®¼äµÄÃû³ÆÓ³Éä¡£ÕâЩ×Ö·û¼¯µÄÃû×ÖÔÚIANA×Ö·û¼¯×¢²á±í£¨http£º//www.iana.org/assignments/character-sets£©ÖÐÁгö¡£
Ñ¡ÔñÆ÷£¨Selector£©¡£SelectorÀàÓÃÓÚ½«Ò»¸öSelectableChannel¶ÔÏó¶à·»¯£¨multiplex£©¡£SelectableChannelÖ»ÓÐÒ»¸ö×ÓÀ࣬³ÆÎªAbstractSelectableChannel¡£AbstractSelectableChannelÀàÓÐ5¸öÖ±½ÓµÄ×ÓÀࣺDatagramChannel¡¢Pipe.SinkChannel¡¢Pipe.SourceChannel¡¢ServerSocketChannelºÍSocketChannel¡£ÔÚÍøÂçͨÐÅÖУ¬¶à·Æ÷£¨multiplexer£©¾ÍÊÇÒ»ÖÖÄܹ»ÔÚÒ»ÌõÏß·ÉÏ·¢Ëͼ¸¸öÐźŵÄÉ豸¡£SelectorÀà¹ÜÀíÒ»×é°üÀ¨Ò»¸ö»ò¶à¸ö¡°¿ÉÑ¡Ôñ¡±µÄͨµÀ£¬²¢Ìṩµ¥¸ö·ÃÎʵã´ÓÕâЩͨµÀÖеÄÈκÎÒ»¸ö½øÐÐÊäÈë¡£
±í2.1ÁгöÁËNIO ³ÌÐò°üÖÐËùÓйؼüµÄÀàºÍ½Ó¿Ú¡£
±í2.1 ¹Ø¼üµÄNIOÀàºÍ½Ó¿Ú
|
³Ì Ðò °ü |
Àà/½Ó¿Ú |
Ãè Êö |
|
java.nio |
Buffer |
ÓÃÓÚÁÙʱÊý¾Ý´æ´¢ºÍ²Ù×ݵÄËæ»ú·ÃÎÊÊý¾ÝÈÝÆ÷ |
|
java.nio |
ByteBuffer£¬ CharBuffer£¬ DoubleBuffer£¬ FloatBuffer£¬ IntBuffer£¬ LongBuffer£¬ ShortBuffer |
´æ´¢Ìض¨Êý¾ÝÀàÐ͵Ļº³åÇø£¬ËüµÄÃû×ÖÌáʾÁËËüËù´æ´¢µÄÊý¾ÝÀàÐÍ |
|
java.nio |
MappedByteBuffer |
ByteBufferµÄÒ»ÖÖ£¬ËüµÄÄÚÈÝÊÇÒ»¸öÎļþµÄÄÚ´æÓ³ÉäÇøÓò¡£ËüÊÇͨ¹ýFileChannel.map()·½·¨´´½¨µÄ |
|
java.nio |
ByteOrder |
Ò»ÖÖÀàÐͰ²È«µÄ×Ö½Ú˳Ðòö¾Ù£ºLITTLE_ENDIAN»òBIG_ENDIAN |
|
java.nio.channels |
Channel |
Õâ¸ö½Ó¿Ú±íʾһ¸ö´ò¿ª»ò¹Ø±ÕµÄÓëIOÉ豸µÄÁ¬½Ó |
|
java.nio.channels |
Channels |
Õâ¸öÀà°üº¬ÁËһЩÓëͨµÀ²Ù×÷ÓйصÄʵÓ÷½·¨ |
|
java.nio.channels |
FileChannel£¬ Pipe£¬ DatagramChannel£¬ SocketChannel£¬ ServerSocketChannel £¬ SelectableChannel |
±íʾ¾ßÌåµÄͨµÀÀàÐÍ£¬·Ö±ðÓëÌØ¶¨µÄÉ豸һÆð¹¤×÷£¬ÈçÎļþºÍÌ×½Ó×Ö¡£DatagramChannelÊÇÒ»ÖÖÓëDatagramSockets£¨Ê¹ÓÃÓû§Êý¾Ý±¨ÐÒé¼´UDP£©Ò»Æð¹¤×÷µÄͨµÀ¡£¹ÜµÀÓÃÓÚÖ´ÐÐÏß³ÌÖ®¼äµÄͨÐÅ |
|
java.nio.channels |
FileLock |
Õâ¸öÀà±íʾһ¸öÎļþij¸öÇøÓòµÄÒ»¸öËø¡£ÕâÖÖÀàÐ͵ĶÔÏó¿ÉÒÔͨ¹ýFileChannelÀàµÄlock()»òtryLock()·½·¨´´½¨ |
|
java.nio.channels |
Selector£¬ SelectionKey |
ÈçǰËùÊö£¬SelectorÊÇÒ»¸öÀ࣬ËüÓÃÓÚ½«Ò»¸ö»ò¶à¸öSelectableChannels¶ÔÏó¶à·»¯¡£SelectionKeyÓÃÓÚÔÚ¼àÌý£¨»òÑ¡Ôñ£©Ò»¸öÌØ¶¨µÄSelectableChannel¶ÔÏóʱָ¶¨Ò»Ð©¾ßÌåµÄ²Ù×÷ |
|
java.nio.charset |
Charset |
ÕâÊǸö³éÏóÀ࣬ËüÌṩÁË16λµÄUnicode×Ö½ÚºÍ×Ö·ûÐòÁÐÖ®¼äµÄÓ³Éä¡£±ê×¼×Ö·û¼¯ÊÇUS-ASCII£¨7λµÄASCII£©¡¢ISO£8859£1£¨ISO¡¡Latin£©¡¢UTF£8¡¢UTF£16BE£¨Ê¹ÓÃBIG_ENDIAN£©¡¢UTF£16LE£¨Ê¹ÓÃLITTLE_ENDIAN£©¡¢UTF£16£¨Ê¹ÓÃÒ»¸ö×Ö½Ú˳Ðò±êÖ¾£© |
|
java.nio.charset |
CharsetEncoder£¬ CharsetDecoder |
CharsetEncoderÊÇÒ»¸öÒýÇæ£¬Ëü°ÑÒ»×é16λµÄUnicode×Ö·û±àÂ루»òת»»£©ÎªÒ»¸ö¾ßÌåµÄÓɾßÌå×Ö·û¼¯Ö¸¶¨µÄ×Ö½ÚÐòÁС£CharsetDecoderÖ´ÐÐÏà·´µÄ²Ù×÷ |
Ðø±í
|
³Ì Ðò °ü |
Àà/½Ó¿Ú |
Ãè Êö |
|
java.nio.charset |
CoderResult |
Õâ¸öÀ౨¸æÒ»¸ö±àÂëÆ÷»ò½âÂëÆ÷µÄ״̬¡£±¨¸æÏÂÃæ5ÖÖ״̬֮һ£º´íÎó¡¢ÐÎʽ´íÎó¡¢ÏÂÒç¡¢ÉÏÒçºÍÎÞ·¨Ó³Éä |
|
java.nio.charset |
CodingActionError |
Õâ¸öÀàÊÇÒ»¸öÀàÐͰ²È«µÄö¾Ù£¬ÓÃÓÚÖ¸¶¨±àÂëÆ÷»ò½âÂëÆ÷Ó¦¸ÃÈçºÎ´¦Àí´íÎó¡£Ëü¿ÉÒÔ±»ÉèÖÃΪIGNORE¡¢REPLACE»òREPORT |
Òź¶µÄÊÇ£¬ÎÒÃÇÎÞ·¨Õ¹Ê¾NIO ³ÌÐò°üµÄËùÓй¦ÄÜ¡£Õâ¶ù£¬ÎÒÃǽöÑо¿3¸öÀý×Ó£ºÒ»¸ö¹æ·¶µÄÎļþ¸´ÖÆ¡¢Ð¡¶Ë˳Ðò×Ö½Ú²Ù×÷ºÍ·Ç×èÈûÐÔ·þÎñÆ÷IO¡£
ÎÒÃǵĵÚ1¸öÀý×ÓÊÇÒ»¸ö¹æ·¶µÄÎļþ¸´ÖƲÙ×÷¡£ÊµÏÖÕâÀà¸´ÖÆµÄÀÏ·½·¨ÊÇÉèÖÃÒ»¸öÑ»·£¬²»¶ÏµØÔÚÒ»¸ö³¤¶È¹Ì¶¨µÄ×Ö½Ú»º³åÇøÖнøÐжÁÈ¡ºÍдÈ룬ֱÖÁºÄ¾¡ÎļþÖеÄËùÓÐ×Ö½Ú¡£³ÌÐòÇåµ¥2.1չʾÁËÕâ¸ö·½·¨¡£
³ÌÐòÇåµ¥2.1¡¡SlowFileCopy.java


ÔÚ³ÌÐòÇåµ¥2.1µÄµÚ26ÐУ¬ÎÒÃǰѻº³åÇøµÄ³¤¶ÈÉèÖÃΪ4KB¡£ÏÔÈ»£¬¸ù¾Ý¼òµ¥µÄ¿Õ¼ä/ʱ¼äµÄȨºâ£¬¶ÔÓÚ´óÐÍÎļþ£¬ÎÒÃÇ¿ÉÒÔͨ¹ýÀ©´ó»º³åÇøµÄ³¤¶ÈÀ´Ìá¸ßËÙ¶È¡£ÔÚÒ»¸ö27MBµÄÎļþÉÏÔËÐгÌÐòÇåµ¥2.1²úÉúÏÂÃæµÄ½á¹û£º

³ÌÐòÇåµ¥2.1µÄµÚ30ºÍ31ÐÐÊdzÌÐòÖÐÑ»·µÄ¹Ø¼