﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-java fans-文章分类-java学习</title><link>http://www.blogjava.net/jlin/category/12890.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 16 Jun 2016 21:24:10 GMT</lastBuildDate><pubDate>Thu, 16 Jun 2016 21:24:10 GMT</pubDate><ttl>60</ttl><item><title>Spring的事务管理入门：编程式事务管理(TransactionTemplate)</title><link>http://www.blogjava.net/jlin/articles/430921.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Thu, 16 Jun 2016 01:55:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/articles/430921.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/430921.html</wfw:comment><comments>http://www.blogjava.net/jlin/articles/430921.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/430921.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/430921.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Spring可以支持编程式事务和声明式事务。Spring使用事务管理器，每个不同平台的事务管理器都实现了接口：PlatformTransactionManager此接口是事务管理的核心，提供了三个需要实现的函数：[java]&nbsp;view plain&nbsp;copy&nbsp;print?commit(TransactionStatus&nbsp;status)&nbsp;;&nbsp;...&nbsp;&nbsp;<a href='http://www.blogjava.net/jlin/articles/430921.html'>阅读全文</a><img src ="http://www.blogjava.net/jlin/aggbug/430921.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2016-06-16 09:55 <a href="http://www.blogjava.net/jlin/articles/430921.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>effective java-second edition </title><link>http://www.blogjava.net/jlin/articles/398316.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Tue, 23 Apr 2013 16:34:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/articles/398316.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/398316.html</wfw:comment><comments>http://www.blogjava.net/jlin/articles/398316.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/398316.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/398316.html</trackback:ping><description><![CDATA[effective java-second edition <a href="/Files/jlin/Effective_Java_2nd_Edition.pdf">/Files/jlin/Effective_Java_2nd_Edition.pdf</a><img src ="http://www.blogjava.net/jlin/aggbug/398316.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2013-04-24 00:34 <a href="http://www.blogjava.net/jlin/articles/398316.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解决哈希（HASH）冲突的主要方法（转）</title><link>http://www.blogjava.net/jlin/articles/397724.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Thu, 11 Apr 2013 16:14:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/articles/397724.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/397724.html</wfw:comment><comments>http://www.blogjava.net/jlin/articles/397724.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/397724.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/397724.html</trackback:ping><description><![CDATA[虽然我们不希望发生冲突，但实际上发生冲突的可能性仍是存在的。当关键字值域远大于哈希表的长度，而且事先并不知道关键字的具体取值时。冲突就难免会发 生。另外，当关键字的实际取值大于哈希表的长度时，而且表中已装满了记录，如果插入一个新记录，不仅发生冲突，而且还会发生溢出。因此，处理冲突和溢出是 哈希技术中的两个重要问题。<br /><strong>1、开放定址法</strong><br />&nbsp;&nbsp;&nbsp; 　用开放定址法解决冲突的做法是：当冲突发生时，使用某种探查(亦称探测)技术在散列表中形成一个探查(测)序列。沿此序列逐个单元地查找，直到找到给定 的关键字，或者碰到一个开放的地址(即该地址单元为空)为止（若要插入，在探查到开放的地址，则可将待插入的新结点存人该地址单元）。查找时探查到开放的 地址则表明表中无待查的关键字，即查找失败。<br />注意：<br />&#9312;用开放定址法建立散列表时，建表前须将表中所有单元(更严格地说，是指单元中存储的关键字)置空。<br />&#9313;空单元的表示与具体的应用相关。<br />&nbsp;&nbsp;&nbsp; 　按照形成探查序列的方法不同，可将开放定址法区分为线性探查法、线性补偿探测法、随机探测等。<br />（1）线性探查法(Linear Probing)<br /><strong>该方法的基本思想是：</strong><br />&nbsp;&nbsp;&nbsp; 将散列表T[0..m-1]看成是一个循环向量，若初始探查的地址为d(即h(key)=d)，则最长的探查序列为：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d，d+l，d+2，&#8230;，m-1，0，1，&#8230;，d-1<br />&nbsp;&nbsp;&nbsp; 　即:探查时从地址d开始，首先探查T[d]，然后依次探查T[d+1]，&#8230;，直到T[m-1]，此后又循环到T[0]，T[1]，&#8230;，直到探查到T[d-1]为止。<br /><strong>探查过程终止于三种情况：</strong><br />&nbsp;&nbsp;&nbsp; 　(1)若当前探查的单元为空，则表示查找失败（若是插入则将key写入其中）；<br />&nbsp;&nbsp;&nbsp; (2)若当前探查的单元中含有key，则查找成功，但对于插入意味着失败；<br />&nbsp;&nbsp;&nbsp; 　(3)若探查到T[d-1]时仍未发现空单元也未找到key，则无论是查找还是插入均意味着失败(此时表满)。<br /><strong>利用开放地址法的一般形式，线性探查法的探查序列为：</strong><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; h<sub>i</sub>=(h(key)+i)％m 0&#8804;i&#8804;m-1 //即d<sub>i</sub>=i<br /><strong>用线性探测法处理冲突，思路清晰，算法简单，但存在下列缺点：</strong><br />&#9312; 处理溢出需另编程序。一般可另外设立一个溢出表，专门用来存放上述哈希表中放不下的记录。此溢出表最简单的结构是顺序表，查找方法可用顺序查找。<br />&#9313; 按上述算法建立起来的哈希表，删除工作非常困难。假如要从哈希表 HT 中删除一个记录，按理应将这个记录所在位置置为空，但我们不能这样做，而只能标上已被删除的标记，否则，将会影响以后的查找。<br />&#9314; 线性探测法很容易产生堆聚现象。所谓堆聚现象，就是存入哈希表的记录在表中连成一片。按照线性探测法处理冲突，如果生成哈希地址的连续序列愈长 ( 即不同关键字值的哈希地址相邻在一起愈长 ) ，则当新的记录加入该表时，与这个序列发生冲突的可能性愈大。因此，哈希地址的较长连续序列比较短连续序列生长得快，这就意味着，一旦出现堆聚 ( 伴随着冲突 ) ，就将引起进一步的堆聚。<br />（2）线性补偿探测法 <br /><strong>线性补偿探测法的基本思想是：</strong><br />将线性探测的步长从 1 改为 Q ，即将上述算法中的 j ＝ (j ＋ 1) % m 改为： j ＝ (j ＋ Q) % m ，而且要求 Q 与 m 是互质的，以便能探测到哈希表中的所有单元。<br />【例】 PDP-11 小型计算机中的汇编程序所用的符合表，就采用此方法来解决冲突，所用表长 m ＝ 1321 ，选用 Q ＝ 25 。<br /><br />（3）随机探测 <br /><strong>随机探测的基本思想是：</strong><br />将线性探测的步长从常数改为随机数，即令： j ＝ (j ＋ RN) % m ，其中 RN 是一个随机数。在实际程序中应预先用随机数发生器产生一个随机序列，将此序列作为依次探测的步长。这样就能使不同的关键字具有不同的探测次序，从而可以避 免或减少堆聚。基于与线性探测法相同的理由，在线性补偿探测法和随机探测法中，删除一个记录后也要打上删除标记。<br /><br /><strong>2、拉链法</strong><br />（1）拉链法解决冲突的方法<br />&nbsp;&nbsp;&nbsp; 　拉链法解决冲突的做法是：将所有关键字为同义词的结点链接在同一个单链表中。若选定的散列表长度为m，则可将散列表定义为一个由m个头指针组成的指针数 组T[0..m-1]。凡是散列地址为i的结点，均插入到以T[i]为头指针的单链表中。T中各分量的初值均应为空指针。在拉链法中，装填因子&#945;可以大于 1，但一般均取&#945;&#8804;1。<br />【例】设有 m ＝ 5 ， H(K) ＝ K mod 5 ，关键字值序例 5 ， 21 ， 17 ， 9 ， 15 ， 36 ， 41 ， 24 ，按外链地址法所建立的哈希表如下图所示：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://sjjg.js.zwu.edu.cn/SFXX/sanlie/tupian/8.17.jpg" width="332" height="129"  alt="" /> <br />（2）拉链法的优点<br /><strong>与开放定址法相比，拉链法有如下几个优点：</strong><br />&#9312;拉链法处理冲突简单，且无堆积现象，即非同义词决不会发生冲突，因此平均查找长度较短；<br />&#9313;由于拉链法中各链表上的结点空间是动态申请的，故它更适合于造表前无法确定表长的情况；<br />&#9314;开放定址法为减少冲突，要求装填因子&#945;较小，故当结点规模较大时会浪费很多空间。而拉链法中可取&#945;&#8805;1，且结点较大时，拉链法中增加的指针域可忽略不计，因此节省空间；<br />&#9315;在用拉链法构造的散列表中，删除结点的操作易于实现。只要简单地删去链表上相应的结点即可。而对开放地址法构造的散列表，删除结点不能简单地将被删结 点的空间置为空，否则将截断在它之后填人散列表的同义词结点的查找路径。这是因为各种开放地址法中，空地址单元(即开放地址)都是查找失败的条件。因此在 用开放地址法处理冲突的散列表上执行删除操作，只能在被删结点上做删除标记，而不能真正删除结点。<br /><br />（3）拉链法的缺点<br />&nbsp;&nbsp;&nbsp; 　拉链法的缺点是：指针需要额外的空间，故当结点规模较小时，开放定址法较为节省空间，而若将节省的指针空间用来扩大散列表的规模，可使装填因子变小，这又减少了开放定址法中的冲突，从而提高平均查找速度。 <img src ="http://www.blogjava.net/jlin/aggbug/397724.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2013-04-12 00:14 <a href="http://www.blogjava.net/jlin/articles/397724.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入Java集合学习系列：HashMap的实现原理（转）</title><link>http://www.blogjava.net/jlin/articles/397723.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Thu, 11 Apr 2013 16:13:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/articles/397723.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/397723.html</wfw:comment><comments>http://www.blogjava.net/jlin/articles/397723.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/397723.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/397723.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp; 1.&nbsp;&nbsp;&nbsp; HashMap&nbsp;概述：&nbsp;&nbsp;&nbsp;HashMap&nbsp;是基于哈希表的&nbsp;Map&nbsp;接口的非同步实现。此实现提供所有可选的映射操作，并允许使用&nbsp;null&nbsp;值和&nbsp;null&nbsp;键。此类不保证映射的顺序，特别是它不保证该顺序恒久不变。...&nbsp;&nbsp;<a href='http://www.blogjava.net/jlin/articles/397723.html'>阅读全文</a><img src ="http://www.blogjava.net/jlin/aggbug/397723.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2013-04-12 00:13 <a href="http://www.blogjava.net/jlin/articles/397723.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 反射机制深入研究(转)</title><link>http://www.blogjava.net/jlin/articles/397205.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Sun, 31 Mar 2013 13:42:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/articles/397205.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/397205.html</wfw:comment><comments>http://www.blogjava.net/jlin/articles/397205.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/397205.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/397205.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Java 反射机制深入研究 2007-09-19 13:10:56标签：Java Reflection 反射 版权声明：原创作品，如需转载，请与作者联系。否则将追究法律责任。 Java反射机制深入研究&nbsp;Java 反射是Java语言的一个很重要的特征，它使得Java具体了&#8220;动态性&#8221;。&nbsp;在Java运行时环境中，对于任意一个类，...&nbsp;&nbsp;<a href='http://www.blogjava.net/jlin/articles/397205.html'>阅读全文</a><img src ="http://www.blogjava.net/jlin/aggbug/397205.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2013-03-31 21:42 <a href="http://www.blogjava.net/jlin/articles/397205.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java解析XML汇总（DOM/SAX/JDOM/DOM4j/XPath）（转）</title><link>http://www.blogjava.net/jlin/articles/396935.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Sun, 24 Mar 2013 15:05:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/articles/396935.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/396935.html</wfw:comment><comments>http://www.blogjava.net/jlin/articles/396935.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/396935.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/396935.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 【目录】一、【基础知识&#8212;&#8212;扫盲】二、【DOM、SAX、JDOM、DOM4j简单使用介绍】三、【性能测试】四、【对比】五、【小插曲XPath】六、【补充】关键字：Java解析xml、解析xml四种方法、DOM、SAX、JDOM、DOM4j、XPath【引言】目前在Java中用于解析XML的技术很多，主流的有DOM、SAX、JDOM、DOM4...&nbsp;&nbsp;<a href='http://www.blogjava.net/jlin/articles/396935.html'>阅读全文</a><img src ="http://www.blogjava.net/jlin/aggbug/396935.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2013-03-24 23:05 <a href="http://www.blogjava.net/jlin/articles/396935.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常见编码列表</title><link>http://www.blogjava.net/jlin/articles/370150.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Thu, 16 Feb 2012 15:48:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/articles/370150.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/370150.html</wfw:comment><comments>http://www.blogjava.net/jlin/articles/370150.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/370150.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/370150.html</trackback:ping><description><![CDATA[<p>常见编码列表：<br /><code>8859_1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ISO 8859-1<br />8859_2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ISO 8859-2<br />8859_3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ISO 8859-3<br />8859_4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ISO 8859-4<br />8859_5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ISO 8859-5<br />8859_6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ISO 8859-6<br />8859_7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ISO 8859-7<br />8859_8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ISO 8859-8<br />8859_9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ISO 8859-9<br />Big5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; Big5 码，繁体中文<br />CNS11643&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CNS 11643，繁体中文<br />Cp037&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 美国、加拿大（两种语言，法语）、荷兰、葡萄牙、巴西、澳大利亚<br />Cp1006&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; IBM AIX 巴基斯坦（乌尔都语）<br />Cp1025&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; IBM 多语种西里尔语：保加利亚、波斯尼亚&nbsp;、黑塞哥维那、马其顿 (FYR)<br />Cp1026&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IBM Latin-5，土耳其<br />Cp1046&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IBM Open Edition US EBCDIC<br />Cp1097&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IBM 伊朗（波斯语）/波斯<br />Cp1098&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IBM 伊朗（波斯语）/波斯 (PC)<br />Cp1112&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IBM 拉脱维亚，立陶宛 <br />Cp1122&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IBM 爱沙尼亚<br />Cp1123&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IBM 乌克兰<br />Cp1124&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IBM AIX 乌克兰<br />Cp1125&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IBM 乌克兰 (PC)<br />Cp1250&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Windows 东欧<br />Cp1251&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Windows 斯拉夫语<br />Cp1252&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Windows Latin-1<br />Cp1253&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Windows 希腊<br />Cp1254&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Windows 土耳其<br />Cp1255&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Windows 希伯莱<br />Cp1256&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Windows 阿拉伯<br />Cp1257&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Windows 波罗的语<br />Cp1258&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Windows 越南语<br />Cp1381&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IBM OS/2, DOS 中华人民共和国 (PRC)<br />Cp1383&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IBM AIX 中华人民共和国 (PRC)<br />Cp273&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IBM 奥地利、德国<br />Cp277&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IBM 丹麦、挪威<br />Cp278&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IBM 芬兰、瑞典<br />Cp280&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IBM 意大利<br />Cp284&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IBM 加泰罗尼亚语/西班牙、拉丁美洲西班牙语<br />Cp285&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IBM 英国、爱尔兰 <br />Cp297&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IBM 法国<br />Cp33722&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; IBM-eucJP - 日语 (5050 的超集)<br />Cp420&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;IBM 阿拉伯<br />Cp424&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IBM 希伯莱<br />Cp437&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MS-DOS 美国、澳大利亚、新西兰、南非<br />Cp500&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EBCDIC 500V1<br />Cp737&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PC 希腊<br />Cp775&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PC 波罗的语<br />Cp838&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IBM 泰国扩展 SBCS<br />Cp850&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MS-DOS Latin-1<br />Cp852&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MS-DOS Latin-2<br />Cp855&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IBM 斯拉夫语<br />Cp857&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IBM 土耳其语<br />Cp860&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MS-DOS 葡萄牙语<br />Cp861&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MS-DOS 冰岛语<br />Cp862&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PC 希伯莱<br />Cp863&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MS-DOS 加拿大法语<br />Cp864&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PC 阿拉伯语<br />Cp865&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MS-DOS 日尔曼语<br />Cp866&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MS-DOS 俄语<br />Cp868&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MS-DOS 巴基斯坦语<br />Cp869&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IBM 现代希腊语<br />Cp870&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IBM 多语种 Latin-2<br />Cp871&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IBM 冰岛语<br />Cp874&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IBM 泰国语<br />Cp875&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IBM 希腊语<br />Cp918&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IBM 巴基斯坦（乌尔都语）<br />Cp921&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IBM 拉脱维亚、立陶宛(AIX, DOS)<br />Cp922&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IBM 爱沙尼亚 (AIX, DOS)<br />Cp930&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 与 4370 UDC 混合的日语，5026 的超集<br />Cp933&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 与 1880 UDC 混合的韩文，5029 的超集<br />Cp935&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 与 1880 UDC 混合的简体中文主机，5031 的超集 <br />Cp937&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 与 6204 UDC 混合的繁体中文，5033 的超集<br />Cp939&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 与 4370 UDC 混合的日语拉丁字母，5035 的超集<br />Cp942&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 日语 (OS/2)，932 的超集 <br />Cp948&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OS/2 中文（台湾），938 超集<br />Cp949&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PC 韩文<br />Cp950&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PC 中文（香港、台湾）<br />Cp964&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AIX 中文（台湾）<br />Cp970&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AIX 韩文<br />EUCJIS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JIS, EUC 编码、日语<br />GB2312&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;GB2312, EUC 编码、简体中文<br />GBK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GBK, 简体中文<br />ISO2022CN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ISO 2022 CN, 中文<br />ISO2022CN_CNS&nbsp;&nbsp;&nbsp; ISO-2022-CN 形式的 CNS 11643，繁体中文 <br />ISO2022CN_GB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ISO-2022-CN 形式的 GB 2312，简体中文<br />ISO2022KR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ISO 2022 KR, 韩文<br />JIS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JIS, 日语<br />JIS0208&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JIS 0208, 日语<br />KOI8_R&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KOI8-R, 俄语<br />KSC5601&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KS C 5601, 韩文<br />MS874&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Windows 泰国语<br />MacArabic&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Macintosh 阿拉伯语<br />MacCentralEurope Macintosh Latin-2<br />MacCroatian&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Macintosh 克罗地亚语<br />MacCyrillic&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Macintosh 斯拉夫语<br />MacDingbat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Macintosh Dingbat<br />MacGreek&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Macintosh 希腊语<br />MacHebrew&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Macintosh 希伯莱语<br />MacIceland&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Macintosh 冰岛语<br />MacRoman&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Macintosh 罗马语<br />MacRomania&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Macintosh 罗马尼亚语<br />MacSymbol&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Macintosh 符号<br />MacThai&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Macintosh 泰国语<br />MacTurkish&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Macintosh 土耳其语<br />MacUkraine&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Macintosh 乌克兰语<br />SJIS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Shift-JIS, 日语<br />UTF8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UTF-8</code></p><br /><br /><br /><img src ="http://www.blogjava.net/jlin/aggbug/370150.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2012-02-16 23:48 <a href="http://www.blogjava.net/jlin/articles/370150.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java字符串应用之字符串编码转换 (转)</title><link>http://www.blogjava.net/jlin/articles/370143.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Thu, 16 Feb 2012 12:48:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/articles/370143.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/370143.html</wfw:comment><comments>http://www.blogjava.net/jlin/articles/370143.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/370143.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/370143.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 无论是对程序的本地化还是国际化，都会涉及到字符编码的转换的问题。尤其在web应用中常常需要处理中文字符，这时就需要进行字符串的编码转换，将字符串编码转换为GBK或者GB2312。 一、关键技术点：&nbsp;&nbsp;&nbsp; 1、当前流行的字符编码格式有：US-ASCII、ISO-8859-1、UTF-8、UTF-16BE、UTF-16LE、UTF-16、GBK、GB2312等，其中G...&nbsp;&nbsp;<a href='http://www.blogjava.net/jlin/articles/370143.html'>阅读全文</a><img src ="http://www.blogjava.net/jlin/aggbug/370143.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2012-02-16 20:48 <a href="http://www.blogjava.net/jlin/articles/370143.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Code Conventions</title><link>http://www.blogjava.net/jlin/articles/357534.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Mon, 29 Aug 2011 15:52:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/articles/357534.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/357534.html</wfw:comment><comments>http://www.blogjava.net/jlin/articles/357534.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/357534.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/357534.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Java Code ConventionsSeptember 12, 1997iiPleaseRecycleCopyright Information 1997, Sun Microsystems, Inc. All rights reserved.2550 Garcia Avenue, Mountain View, California 94043-1100 U.S...&nbsp;&nbsp;<a href='http://www.blogjava.net/jlin/articles/357534.html'>阅读全文</a><img src ="http://www.blogjava.net/jlin/aggbug/357534.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2011-08-29 23:52 <a href="http://www.blogjava.net/jlin/articles/357534.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java对象拷贝</title><link>http://www.blogjava.net/jlin/articles/344218.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Sun, 13 Feb 2011 15:38:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/articles/344218.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/344218.html</wfw:comment><comments>http://www.blogjava.net/jlin/articles/344218.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/344218.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/344218.html</trackback:ping><description><![CDATA[<p>package com.lin.test;</p>
<p>import java.lang.reflect.Field;<br />
import java.lang.reflect.Method;</p>
<p>public class ObjectClone {</p>
<p>&nbsp;public static void main(String[] args) throws Exception,<br />
&nbsp;&nbsp;&nbsp;IllegalAccessException, Exception {</p>
<p>&nbsp;&nbsp;Person jack = new Person("jack", 24, "hangzhou");<br />
&nbsp;&nbsp;Person brown = new Person("brown", 54, "hangzhou");<br />
&nbsp;&nbsp;jack.setFather(brown);<br />
&nbsp;&nbsp;brown.setArray(new String[]{"lin","feng"});<br />
&nbsp;&nbsp;String[] arr = { "lin", "fu" };<br />
&nbsp;&nbsp;jack.setArray(arr);<br />
&nbsp;&nbsp;Person lily = new Person();<br />
&nbsp;&nbsp;copyProperties(lily,jack);<br />
&nbsp;&nbsp; jack.getFather().setAddress("shanghai");<br />
&nbsp;&nbsp;jack.setAddress("test");</p>
<p>&nbsp;&nbsp;System.out.println("jack" + jack.toString());<br />
&nbsp;&nbsp;System.out.println("lily" + lily.toString());</p>
<p>&nbsp;&nbsp;System.out.println("jack.father:" + jack.getFather());<br />
&nbsp;&nbsp;System.out.println("lily.father:" + lily.getFather());</p>
<p>&nbsp;}</p>
<p>&nbsp;public static&nbsp; void copyProperties(Object destObj,Object srcObj) throws Exception {<br />
&nbsp;&nbsp;// 取得拷贝对象的所有域<br />
&nbsp;&nbsp;Field[] fieldsBase = srcObj.getClass().getDeclaredFields();<br />
&nbsp;&nbsp;Field.setAccessible(fieldsBase, true);<br />
&nbsp;&nbsp;// 取得目标对象的所有域<br />
&nbsp;&nbsp;Field[] fieldsObj = destObj.getClass().getDeclaredFields();<br />
&nbsp;&nbsp;Field.setAccessible(fieldsObj, true);<br />
&nbsp;&nbsp;for (int i = 0; i &lt; fieldsObj.length; i++) {<br />
&nbsp;&nbsp;&nbsp;// 取得域名称<br />
&nbsp;&nbsp;&nbsp;Field fieldObj = fieldsObj[i];<br />
&nbsp;&nbsp;&nbsp;for (int j = 0; j &lt; fieldsBase.length; j++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;Field fieldBase = fieldsBase[j];<br />
&nbsp;&nbsp;&nbsp;&nbsp;// 比较两域名称是否一致<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (fieldObj.getName().equals(fieldBase.getName())) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 取得域名称并将第一个字母大小<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String fieldName = fieldObj.getName();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String firstChar = fieldName.substring(0, 1).toUpperCase();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fieldName = firstChar + fieldName.substring(1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 取得目标对象中的set方法<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method methodObj = destObj.getClass().getMethod(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"set" + fieldName,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new Class[] { fieldObj.getType() });<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 取得参照对象中的get方法<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method methodGet = srcObj.getClass().getMethod(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"get" + fieldName, null);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 执行参照对象的get方法并取得返回值<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object resultObj = methodGet.invoke(srcObj, null);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 执行目标对象的set方法并进行设值<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methodObj.invoke(destObj, new Object[] { resultObj });<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;}</p>
<p>&nbsp;// 深层克隆，主要利用一个递归调用<br />
&nbsp;public static Object cloneExt(Object obj) throws Exception {<br />
&nbsp;&nbsp;// getDeclaredFields得到object内定义的所有field<br />
&nbsp;&nbsp;Field[] fields = obj.getClass().getDeclaredFields();<br />
&nbsp;&nbsp;// 利用newInstance方法，生成一个空的Object<br />
&nbsp;&nbsp;Object newObj = obj.getClass().newInstance();<br />
&nbsp;&nbsp;for (int i = 0, j = fields.length; i &lt; j; i++) {<br />
&nbsp;&nbsp;&nbsp;String propertyName = fields[i].getName();<br />
&nbsp;&nbsp;&nbsp;// field的值<br />
&nbsp;&nbsp;&nbsp;Object propertyValue = getProperty(obj, propertyName);<br />
&nbsp;&nbsp;&nbsp;// field的类型<br />
&nbsp;&nbsp;&nbsp;String propertyType = fields[i].getType().getName();<br />
&nbsp;&nbsp;&nbsp;if (propertyValue != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;// 如果field不是8种基本类型，或者String，则直接赋值<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (propertyType.endsWith("String")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|| "char".equals(propertyType)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|| "int".equals(propertyType)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|| "boolean".equals(propertyType)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|| "byte".equals(propertyType)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|| "short".equals(propertyType)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|| "double".equals(propertyType)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|| "long".equals(propertyType)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|| "float".equals(propertyType)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|| "void".equals(propertyType)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setProperty(newObj, propertyName, propertyValue);<br />
&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 如果field类型是其他Object，则递归克隆一下<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object newPropObj = cloneExt(propertyValue);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setProperty(newObj, propertyName, newPropObj);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return newObj;<br />
&nbsp;}</p>
<p>&nbsp;// 浅层克隆<br />
&nbsp;public static Object clone(Object obj) throws Exception {<br />
&nbsp;&nbsp;Field[] fields = obj.getClass().getDeclaredFields();<br />
&nbsp;&nbsp;Object newObj = obj.getClass().newInstance();<br />
&nbsp;&nbsp;for (int i = 0, j = fields.length; i &lt; j; i++) {<br />
&nbsp;&nbsp;&nbsp;String propertyName = fields[i].getName();<br />
&nbsp;&nbsp;&nbsp;Object propertyValue = getProperty(obj, propertyName);<br />
&nbsp;&nbsp;&nbsp;setProperty(newObj, propertyName, propertyValue);<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return newObj;<br />
&nbsp;}</p>
<p>&nbsp;// 反射调用setter方法，进行赋值<br />
&nbsp;private static Object setProperty(Object bean, String propertyName,<br />
&nbsp;&nbsp;&nbsp;Object value) {<br />
&nbsp;&nbsp;Class clazz = bean.getClass();<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;Field field = clazz.getDeclaredField(propertyName);<br />
&nbsp;&nbsp;&nbsp;Method method = clazz.getDeclaredMethod(getSetterName(field<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getName()), new Class[] { field.getType() });<br />
&nbsp;&nbsp;&nbsp;return method.invoke(bean, new Object[] { value });<br />
&nbsp;&nbsp;} catch (Exception e) {<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return null;<br />
&nbsp;}</p>
<p>&nbsp;// 反射调用getter方法，得到field的值<br />
&nbsp;private static Object getProperty(Object bean, String propertyName) {<br />
&nbsp;&nbsp;Class clazz = bean.getClass();<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;Field field = clazz.getDeclaredField(propertyName);<br />
&nbsp;&nbsp;&nbsp;Method method = clazz.getDeclaredMethod(getGetterName(field<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getName()), new Class[] {});<br />
&nbsp;&nbsp;&nbsp;return method.invoke(bean, new Object[] {});<br />
&nbsp;&nbsp;} catch (Exception e) {<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return null;<br />
&nbsp;}</p>
<p>&nbsp;// 根据field名，得到getter方法名<br />
&nbsp;private static String getGetterName(String propertyName) {<br />
&nbsp;&nbsp;String method = "get" + propertyName.substring(0, 1).toUpperCase()<br />
&nbsp;&nbsp;&nbsp;&nbsp;+ propertyName.substring(1);<br />
&nbsp;&nbsp;return method;<br />
&nbsp;}</p>
<p>&nbsp;// 根据field名，得到setter方法名<br />
&nbsp;private static String getSetterName(String propertyName) {<br />
&nbsp;&nbsp;String method = "set" + propertyName.substring(0, 1).toUpperCase()<br />
&nbsp;&nbsp;&nbsp;&nbsp;+ propertyName.substring(1);<br />
&nbsp;&nbsp;return method;<br />
&nbsp;}<br />
}</p>
<p>class Person {</p>
<p>&nbsp;private String name;</p>
<p>&nbsp;private int age;</p>
<p>&nbsp;private String address;</p>
<p>&nbsp;// 用于测试深层克隆<br />
&nbsp;private Person father;</p>
<p>&nbsp;private String array[] = null;</p>
<p>&nbsp;public Person() {</p>
<p>&nbsp;}</p>
<p>&nbsp;public Person(String name, int age, String address) {<br />
&nbsp;&nbsp;this.name = name;<br />
&nbsp;&nbsp;this.address = address;<br />
&nbsp;&nbsp;this.age = age;<br />
&nbsp;}</p>
<p>&nbsp;public Person(String name, int age, String address, Person father) {<br />
&nbsp;&nbsp;this.name = name;<br />
&nbsp;&nbsp;this.address = address;<br />
&nbsp;&nbsp;this.age = age;<br />
&nbsp;&nbsp;this.father = father;<br />
&nbsp;}</p>
<p>&nbsp;// 所有的getter方法和setter方法要求都是public，且具有一定的命名规则<br />
&nbsp;public String getAddress() {<br />
&nbsp;&nbsp;return address;<br />
&nbsp;}</p>
<p>&nbsp;public void setAddress(String address) {<br />
&nbsp;&nbsp;this.address = address;<br />
&nbsp;}</p>
<p>&nbsp;public int getAge() {<br />
&nbsp;&nbsp;return age;<br />
&nbsp;}</p>
<p>&nbsp;public void setAge(int age) {<br />
&nbsp;&nbsp;this.age = age;<br />
&nbsp;}</p>
<p>&nbsp;public String getName() {<br />
&nbsp;&nbsp;return name;<br />
&nbsp;}</p>
<p>&nbsp;public void setName(String name) {<br />
&nbsp;&nbsp;this.name = name;<br />
&nbsp;}</p>
<p>&nbsp;public Person getFather() {<br />
&nbsp;&nbsp;return father;<br />
&nbsp;}</p>
<p>&nbsp;public void setFather(Person father) {<br />
&nbsp;&nbsp;this.father = father;<br />
&nbsp;}</p>
<p>&nbsp;public String toString() {<br />
&nbsp;&nbsp;String sum = "";<br />
&nbsp;&nbsp;for (String s : array) {<br />
&nbsp;&nbsp;&nbsp;sum += " " + s;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return "{Name=" + name + ",Age=" + age + ",Address=" + address + sum<br />
&nbsp;&nbsp;&nbsp;&nbsp;+ "}";<br />
&nbsp;}</p>
<p>&nbsp;public String[] getArray() {<br />
&nbsp;&nbsp;return array;<br />
&nbsp;}</p>
<p>&nbsp;public void setArray(String[] array) {<br />
&nbsp;&nbsp;this.array = array;<br />
&nbsp;}<br />
}<br />
</p>
<img src ="http://www.blogjava.net/jlin/aggbug/344218.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2011-02-13 23:38 <a href="http://www.blogjava.net/jlin/articles/344218.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用JAVA来实现“生产者―消费者”问题</title><link>http://www.blogjava.net/jlin/articles/334678.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Tue, 12 Oct 2010 09:06:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/articles/334678.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/334678.html</wfw:comment><comments>http://www.blogjava.net/jlin/articles/334678.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/334678.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/334678.html</trackback:ping><description><![CDATA[生产者和消费者问题是从操作系统中的许多实际同步问题中抽象出来的具有&nbsp; <br />
代表性的问题。它反映了操作系统中典型的同步例子。&nbsp; <br />
　　生产者进程(进程由多个线程组成)生产信息，例如它可以是计算进程。消费&nbsp; <br />
者进程使用信息，它可以是输出打印进程。由于生产者和消费者彼此独立，且运&nbsp; <br />
行速度不确定，所以很可能出现生产者已产生了信息而消费者却没有来得及接受&nbsp; <br />
信息这种情况。为此，需要引入由一个或者若干个存储单元组成的临时存储区，&nbsp; <br />
以便存放生产者所产生的信息，平滑进程间由于速度不确定所带来的问题。这个&nbsp; <br />
临时存储区叫做缓冲区，通常用一维数组来表示。&nbsp; <br />
　　由一个或若干个存储单元组成的缓冲区叫作&#8220;有穷缓冲区&#8221;。下面我们来分&nbsp; <br />
析一下有穷缓冲的生产者和消费者的例子。&nbsp; <br />
　　假设有多个生产者和多个消费者，它们共享一个具有n个存储单元的有穷缓冲&nbsp; <br />
区Buffer(0&#8230;&#8230;n-1)，这是一个环形队列。其队尾指针Rear指向当前信息应存放&nbsp; <br />
的位置(Buffer[Rear])，队首指针Front指向当前取出信息的位置(Buffer[front&nbsp; <br />
])。生产者进程总是把信息存放在Buffer[Rear]中，消费者进程则总是从Buffer&nbsp; <br />
[Rear]中取出信息。如果想使生产者进程和消费者进程协调合作，则必须使它们&nbsp; <br />
遵循如下规则:&nbsp; <br />
　　1)&nbsp;只要缓冲区有存储单元，生产者都可往其中存放信息；当缓冲区已满时，&nbsp; <br />
若任意生产者提出写要求，则都必须等待；&nbsp; <br />
　　2)&nbsp;只要缓冲区中有消息可取，消费者都可从缓冲区中取出消息；当缓冲区为&nbsp; <br />
空时，若任意消费者想取出信息，则必须等待；&nbsp; <br />
　　3)&nbsp;生产者们和消费者们不能同时读、写缓冲区。&nbsp; <br />
　　用JAVA&nbsp;实现&#8220;生产者－消费者&#8221;问题的代码如下:&nbsp; <br />
　　class&nbsp;MonitorTest{&nbsp; <br />
　　static&nbsp;int&nbsp;produce_speed=200;&nbsp; <br />
　　static&nbsp;int&nbsp;consume_speed=200;&nbsp; <br />
　　public&nbsp;static&nbsp;void&nbsp;main&nbsp;(String&nbsp;[]&nbsp;args){&nbsp; <br />
　　&nbsp;if(args.length&gt;0)&nbsp; <br />
　　&nbsp;produce_speed=Integer.parseInt(args[0]);&nbsp; <br />
　　&nbsp;if(args.length&gt;1)&nbsp; <br />
　　&nbsp;consume_speed=Integer.parseInt(args[1]);&nbsp; <br />
　　&nbsp;Monitor&nbsp;monitor=new&nbsp;Monitor();&nbsp; <br />
　　&nbsp;new&nbsp;Producer(monitor,produce_speed);&nbsp; <br />
　　&nbsp;new&nbsp;Consumer(monitor,consume_speed);&nbsp; <br />
　　&nbsp;try{&nbsp; <br />
　　&nbsp;Thread.sleep(4000);&nbsp; <br />
　　&nbsp;}catch(InterruptedException&nbsp;e){}&nbsp; <br />
　　&nbsp;System.exit(0);&nbsp; <br />
　　&nbsp;}&nbsp; <br />
　　}&nbsp; <br />
<br />
　　class&nbsp;Monitor&nbsp;{&nbsp; <br />
　　&nbsp;int&nbsp;Buffer_Length=10;&nbsp; <br />
　　&nbsp;int[]&nbsp;Buffer=new&nbsp;int[Buffer_Length];&nbsp; <br />
　　&nbsp;int&nbsp;Item;&nbsp; <br />
　　&nbsp;int&nbsp;Count=0,Rear=0,Front=0;&nbsp; <br />
　　&nbsp;//get&nbsp;buffer&nbsp; <br />
　　&nbsp;synchronized&nbsp;int&nbsp;get(){&nbsp; <br />
　　&nbsp;if(Count&nbsp;==0)&nbsp; <br />
　　&nbsp;try{&nbsp; <br />
　　&nbsp;wait();&nbsp; <br />
　　&nbsp;}catch(InterruptedException&nbsp;e){}&nbsp; <br />
　　&nbsp;Item=Buffer[Front];&nbsp; <br />
　　&nbsp;Count--;&nbsp; <br />
　　&nbsp;Front=(Front+1)%Buffer_Length;&nbsp; <br />
　　&nbsp;System.out.println("Got:"+Item);&nbsp; <br />
　　&nbsp;notify();&nbsp; <br />
　　&nbsp;return&nbsp;Item;&nbsp; <br />
　　}&nbsp; <br />
　　//set&nbsp;buffer&nbsp; <br />
　　synchronized&nbsp;void&nbsp;set(int&nbsp;value){&nbsp; <br />
　　if(Count==Buffer_Length)&nbsp; <br />
　　&nbsp;try{&nbsp; <br />
　　&nbsp;wait();&nbsp; <br />
　　&nbsp;}catch(InterruptedException&nbsp;e){}&nbsp; <br />
　　&nbsp;Buffer[Rear]=value;&nbsp; <br />
　　&nbsp;Count++;&nbsp; <br />
　　&nbsp;Rear=(Rear+1)%Buffer_Length;&nbsp; <br />
　　&nbsp;System.out.println("Set:"+value);&nbsp; <br />
　　&nbsp;notify();&nbsp; <br />
　　&nbsp;}&nbsp; <br />
　　}&nbsp; <br />
<br />
　　class&nbsp;Producer&nbsp;implements&nbsp;Runnable{&nbsp; <br />
　　&nbsp;Monitor&nbsp;monitor;&nbsp; <br />
　　&nbsp;int&nbsp;speed;&nbsp; <br />
　　&nbsp;Producer(Monitor&nbsp;monitor,int&nbsp;speed){&nbsp; <br />
　　&nbsp;This.monitor=monitor;&nbsp; <br />
　　&nbsp;This.speed=speed;&nbsp; <br />
　　&nbsp;new&nbsp;Thread(this,"Producer").start();&nbsp; <br />
　　&nbsp;}&nbsp; <br />
　　&nbsp;public&nbsp;void&nbsp;run(){&nbsp; <br />
　　&nbsp;int&nbsp;i=0;&nbsp; <br />
　　&nbsp;while(true){&nbsp; <br />
　　&nbsp;monitor.set(i++);&nbsp; <br />
　　&nbsp;try{&nbsp; <br />
　　&nbsp;Thread.sleep((int)(Math.random()*speed));&nbsp; <br />
　　&nbsp;}catch(InterruptedException&nbsp;e){}&nbsp; <br />
　　&nbsp;}&nbsp; <br />
　　&nbsp;}&nbsp; <br />
　　}&nbsp; <br />
<br />
　　class&nbsp;Consumer&nbsp;implements&nbsp;Runnable{&nbsp; <br />
　　&nbsp;Monitor&nbsp;monitor;&nbsp; <br />
　　&nbsp;int&nbsp;speed;&nbsp; <br />
　　&nbsp;Consumer(Monitor&nbsp;monitor,int&nbsp;speed){&nbsp; <br />
　　&nbsp;This.monitor=monitor;&nbsp; <br />
　　&nbsp;This.speed=speed;&nbsp; <br />
　　&nbsp;new&nbsp;Thread(this,"Consumer").start();&nbsp; <br />
　　&nbsp;}&nbsp; <br />
　　&nbsp;public&nbsp;void&nbsp;run(){&nbsp; <br />
　　&nbsp;while(true){&nbsp; <br />
　　&nbsp;monitor.get();&nbsp; <br />
　　&nbsp;try{&nbsp; <br />
　　&nbsp;Thread.sleep((int)&nbsp;(Math.random()*speed));&nbsp; <br />
　　&nbsp;}catch(InterruptedException&nbsp;e){}&nbsp; <br />
　　&nbsp;}&nbsp; <br />
　　&nbsp;}&nbsp; <br />
　　}&nbsp; <br />
--------------------------------------------------------------------------------------------------------------------------------<br />
Java example 实现的一中生产者和消费者的，代码如下：<br />
<p>import java.util.Random;</p>
<p>public class Consumer implements Runnable {<br />
&nbsp;&nbsp;&nbsp; private Drop drop;</p>
<p>&nbsp;&nbsp;&nbsp; public Consumer(Drop drop) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.drop = drop;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public void run() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Random random = new Random();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (String message = drop.take(); ! message.equals("DONE");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message = drop.take()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.format("MESSAGE RECEIVED: %s%n", message);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread.sleep(random.nextInt(5000));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (InterruptedException e) {}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p>import java.util.Random;</p>
<p>public class Producer implements Runnable {<br />
&nbsp;&nbsp;&nbsp; private Drop drop;</p>
<p>&nbsp;&nbsp;&nbsp; public Producer(Drop drop) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.drop = drop;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public void run() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String importantInfo[] = {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Mares eat oats",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Does eat oats",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Little lambs eat ivy",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "A kid will eat ivy too"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Random random = new Random();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; importantInfo.length; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; drop.put(importantInfo[i]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread.sleep(random.nextInt(5000));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (InterruptedException e) {}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; drop.put("DONE");<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p>public class Drop {<br />
&nbsp;&nbsp;&nbsp; //Message sent from producer to consumer.<br />
&nbsp;&nbsp;&nbsp; private String message;<br />
&nbsp;&nbsp;&nbsp; //True if consumer should wait for producer to send message, false<br />
&nbsp;&nbsp;&nbsp; //if producer should wait for consumer to retrieve message.<br />
&nbsp;&nbsp;&nbsp; private boolean empty = true;</p>
<p>&nbsp;&nbsp;&nbsp; public synchronized String take() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Wait until message is available.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (empty) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wait();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (InterruptedException e) {}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Toggle status.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; empty = true;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Notify producer that status has changed.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; notifyAll();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return message;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public synchronized void put(String message) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Wait until message has been retrieved.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (!empty) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wait();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (InterruptedException e) {}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Toggle status.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; empty = false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Store message.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.message = message;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Notify consumer that status has changed.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; notifyAll();<br />
&nbsp;&nbsp;&nbsp; }<br />
}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
public class ProducerConsumerExample {<br />
&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Drop drop = new Drop();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (new Thread(new Producer(drop))).start();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (new Thread(new Consumer(drop))).start();<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<img src ="http://www.blogjava.net/jlin/aggbug/334678.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2010-10-12 17:06 <a href="http://www.blogjava.net/jlin/articles/334678.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HashMap遍历的两种方式</title><link>http://www.blogjava.net/jlin/articles/331259.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Mon, 06 Sep 2010 15:33:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/articles/331259.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/331259.html</wfw:comment><comments>http://www.blogjava.net/jlin/articles/331259.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/331259.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/331259.html</trackback:ping><description><![CDATA[<span style="color: red">第一种:</span> <br />
Map map = new HashMap(); <br />
Iterator iter = map.entrySet().iterator(); <br />
while (iter.hasNext()) { <br />
&nbsp;&nbsp;&nbsp; Map.Entry entry = (Map.Entry) iter.next(); <br />
&nbsp;&nbsp;&nbsp; Object key = entry.getKey(); <br />
&nbsp;&nbsp;&nbsp; Object val = entry.getValue(); <br />
} <br />
效率高,以后一定要使用此种方式！ <br />
<span style="color: red">第二种:</span> <br />
Map map = new HashMap(); <br />
Iterator iter = map.keySet().iterator(); <br />
while (iter.hasNext()) { <br />
&nbsp;&nbsp;&nbsp; Object key = iter.next(); <br />
&nbsp;&nbsp;&nbsp; Object val = map.get(key); <br />
} <br />
效率低,以后尽量少使用！ <br />
<br />
<span style="color: red">例：</span> <br />
HashMap的遍历有两种常用的方法，那就是使用keyset及entryset来进行遍历，但两者的遍历速度是有差别的，下面请看实例： <br />
<br />
public class HashMapTest { <br />
public static void main(String[] args) ...{ <br />
&nbsp; HashMap hashmap = new HashMap(); <br />
&nbsp; for (int i = 0; i &lt; 100000; i ) ...{ <br />
&nbsp;&nbsp; hashmap.put("" i, "test"); <br />
&nbsp; } <br />
<br />
&nbsp; long bg = System.currentTimeMillis();<br />
&nbsp; Iterator iterator = hashmap.keySet().iterator();&nbsp;&nbsp; <br />
&nbsp; while (iterator.hasNext()) {&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; System.out.print(hashmap.get(iterator.next())); <br />
&nbsp; } <br />
&nbsp; System.out.println(); <br />
&nbsp; System.out.println(System.currentTimeMillis()- bg); <br />
&nbsp; listHashMap(); <br />
} <br />
<br />
&nbsp; public static void listHashMap() ...{ <br />
&nbsp; java.util.HashMap hashmap = new java.util.HashMap(); <br />
&nbsp; for (int i = 0; i &lt; 100000; i ) ...{ <br />
&nbsp;&nbsp; hashmap.put("" i, "test"); <br />
&nbsp; } <br />
&nbsp; long bg = System.currentTimeMillis();<br />
&nbsp; java.util.Iterator it = hashmap.entrySet().iterator(); <br />
&nbsp; while (it.hasNext()) ...{ <br />
&nbsp;&nbsp; java.util.Map.Entry entry = (java.util.Map.Entry) it.next(); <br />
&nbsp;&nbsp; // entry.getKey() 返回与此项对应的键 <br />
&nbsp;&nbsp; // entry.getValue() 返回与此项对应的值 <br />
&nbsp;&nbsp; System.out.print(entry.getValue()); <br />
&nbsp; } <br />
&nbsp; System.out.println(); <br />
&nbsp; System.out.println(System.currentTimeMillis() - bg); <br />
} <br />
} <br />
<br />
对于keySet其实是遍历了2次，一次是转为iterator，一次就从hashmap中取出key所对于的value。而entryset只是遍历了第一次，他把key和value都放到了entry中，所以就快了。
<img src ="http://www.blogjava.net/jlin/aggbug/331259.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2010-09-06 23:33 <a href="http://www.blogjava.net/jlin/articles/331259.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java做的比较完善的FTP连接上传下载文件(转)</title><link>http://www.blogjava.net/jlin/articles/330605.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Wed, 01 Sep 2010 10:30:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/articles/330605.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/330605.html</wfw:comment><comments>http://www.blogjava.net/jlin/articles/330605.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/330605.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/330605.html</trackback:ping><description><![CDATA[这是偶第一次写java程序实现公司要求的FTP数据同步，所有原代码如下，以供各位参考并提出宝贵意见！另外俺还有两个功能没有实现，有请高手指点一二：1、如何删除FTP服务器上已经下载过的文件？2、如何将上传的文件改名？上传时在文件名前加&#8220;temp_&#8221;，上传完毕后需要把文件名改回来。3、如何使用openPassiveDataConnection()方法将ftp连接更改为主动连接，因为要从unix系统配置的ftp服务器下载文件的话，就需要主动连接。<br />
<br />
<br />
<br />
/*<br />
*******************************************************************************************************<br />
<br />
Filename: ftp.java<br />
Author: &nbsp; leetsing(elove)<br />
Create date: 2004-08-30<br />
Use: &nbsp; connect to FTP server,then upload and download file<br />
Modify date: 2004-09-05 add to upload file<br />
&nbsp; 2004-09-13 add to download file<br />
Copy right: Magisky Media Technology Co.,Ltd.<br />
<br />
*******************************************************************************************************<br />
*/<br />
//import cz.dhl.io.*;<br />
//import cz.dhl.ftp.*;<br />
import sun.net.ftp.*; <br />
import sun.net.*;<br />
import java.applet.*; <br />
import java.io.*;<br />
import java.io.IOException;<br />
import java.util.StringTokenizer;<br />
import sun.net.ftp.FtpClient;<br />
import java.util.ArrayList;<br />
<br />
public class ftp extends Applet<br />
{<br />
FtpClient aftp; <br />
DataOutputStream outputs ; <br />
TelnetInputStream ins; <br />
TelnetOutputStream outs;<br />
<br />
int ch; <br />
public String a; <br />
String hostname=\"\";<br />
private String path = \"/\";<br />
<br />
public static void main(String[] args) <br />
{<br />
String hostname = \"192.168.0.56\";<br />
int port = 2121;<br />
String uid = \"lee\";<br />
String pwd = \"lee\";<br />
String RWFileDir = \"D:\\\\smsftp\\\\\";//文件目录<br />
<br />
//连接ftp服务器<br />
ftp ft = new ftp();<br />
ft.connect(RWFileDir,hostname,port,uid,pwd); <br />
<br />
//下载文件<br />
if (ft.aftp != null){<br />
&nbsp; try {<br />
&nbsp; ft.getNameList(RWFileDir);<br />
&nbsp; }catch(IOException e) <br />
&nbsp; { <br />
&nbsp; System.out.println(\"下载文件出错：\"+e);<br />
&nbsp; } <br />
}<br />
<br />
<br />
//上传文件<br />
if (ft.aftp != null){<br />
&nbsp; String sdir = RWFileDir + \"subunsubfromsp\\\\\";<br />
&nbsp; File fdir = new File(sdir);<br />
&nbsp; String FileName = \"\";<br />
<br />
&nbsp; for(int i=0;i &nbsp; FileName = sdir + (fdir.list())<em>;<br />
&nbsp; <br />
&nbsp; ft.uploadFile(RWFileDir,FileName);<br />
&nbsp; }<br />
&nbsp; //System.out.println(\"成功上传的文件：\");<br />
&nbsp; //ft.showFileContents(\"subunsubfromsp\\\\\"); <br />
}<br />
<br />
//删除subunsubfromsp目录下已经上传的文件文件<br />
// ft.deleFile(RWFileDir);<br />
<br />
//断开服务器连接<br />
ft.stop(RWFileDir);<br />
<br />
}<br />
<br />
public FtpClient connect(String RWFileDir,String hostname,int port,String uid,String pwd) <br />
{<br />
this.hostname = hostname;<br />
System.out.println(\"正在连接\"+hostname+\"，请等待.....\");<br />
try{ <br />
&nbsp; aftp = new FtpClient(hostname,port); <br />
&nbsp; aftp.login(uid,pwd); <br />
&nbsp; aftp.binary();<br />
&nbsp; //aftp.openPortDataConnection();<br />
&nbsp; a = \"连接主机:\"+hostname+\"成功!\";<br />
&nbsp; System.out.println(a); <br />
} <br />
catch(FtpLoginException e){ <br />
&nbsp; a=\"登陆主机:\"+hostname+\"失败!请检查用户名或密码是否正确：\"+e; <br />
&nbsp; System.out.println(a);<br />
&nbsp; //return false; <br />
} <br />
catch (IOException e){ <br />
&nbsp; a=\"连接主机:\"+hostname+\"失败!请检查端口是否正确：\"+e; <br />
&nbsp; System.out.println(a);<br />
&nbsp; //return false; <br />
} <br />
catch(SecurityException e) <br />
{ <br />
&nbsp; a=\"无权限与主机:\"+hostname+\"连接!请检查是否有访问权限：\"+e; <br />
&nbsp; System.out.println(a);<br />
&nbsp; //return false; <br />
} <br />
<br />
log(RWFileDir,a);<br />
return aftp; <br />
} <br />
<br />
public void stop(String RWFileDir) <br />
{ <br />
String message = \"\";<br />
try { <br />
&nbsp; if(aftp!=null){<br />
&nbsp; aftp.closeServer(); <br />
&nbsp; message = \"与主机\"+hostname+\"连接已断开!\";<br />
&nbsp; System.out.println(message); <br />
&nbsp; log(RWFileDir,message);<br />
&nbsp; }<br />
} <br />
catch(IOException e) <br />
{ <br />
&nbsp; message = \"与主机\"+hostname+\"断开连接失败!\"+e;<br />
&nbsp; System.out.println(message); <br />
&nbsp; log(RWFileDir,message);<br />
} <br />
} <br />
<br />
<br />
public boolean downloadFile(String RWFileDir,String filepathname){ <br />
boolean result=true; <br />
String message = \"\";<br />
if (aftp != null) <br />
{ <br />
&nbsp; System.out.println(\"正在下载文件\"+filepathname+\",请等待....\"); <br />
&nbsp; String badfile = filepathname.substring(filepathname.length()-4,filepathname.length());<br />
&nbsp; String badlog = filepathname.substring(filepathname.length()-7,filepathname.length());<br />
&nbsp; String baddir = \"\";<br />
&nbsp; if ((badfile.compareTo(\".bad\") != 0) &amp;&amp; (badlog.compareTo(\".badlog\") != 0)){<br />
&nbsp; baddir = \"subunsubtosp\\\\\";<br />
&nbsp; }<br />
&nbsp; else{<br />
&nbsp; baddir = \"bad\\\\\";<br />
&nbsp; }<br />
&nbsp; String strdir = \"subunsubtosp\\\\\";<br />
&nbsp; //System.out.println(RWFileDir + baddir + filepathname);<br />
&nbsp; try{ <br />
&nbsp; //FtpClient fc=new FtpClient(\"192.168.0.56\",2121);<br />
&nbsp; //fc.login(\"lee\",\"lee\");<br />
&nbsp; int ch;<br />
&nbsp; File fi = new File(RWFileDir + baddir + filepathname);<br />
&nbsp; //aftp.cd(strdir);<br />
&nbsp; RandomAccessFile getFile = new RandomAccessFile(fi,\"rw\");<br />
&nbsp; getFile.seek(0);<br />
&nbsp; TelnetInputStream fget=aftp.get(strdir+filepathname);<br />
&nbsp; DataInputStream puts = new DataInputStream(fget);<br />
&nbsp; while ((ch = puts.read()) &gt;= 0) {<br />
&nbsp; getFile.write(ch);<br />
&nbsp; <br />
&nbsp; }<br />
&nbsp; //s.delete();<br />
&nbsp; <br />
&nbsp; fget.close();<br />
&nbsp; getFile.close();<br />
&nbsp; //fc.closeServer();<br />
<br />
&nbsp; message = \"下载\"+filepathname+\"文件到\"+baddir +\"目录成功!\";<br />
&nbsp; System.out.println(message); <br />
&nbsp; log(RWFileDir,message);<br />
&nbsp; } <br />
&nbsp; catch(IOException e){ <br />
&nbsp; message = \"下载\"+filepathname+\"文件到\"+baddir +\"目录失败!\"+e; <br />
&nbsp; System.out.println(message); <br />
&nbsp; log(RWFileDir,message);<br />
&nbsp; result = false ; <br />
<br />
&nbsp; } <br />
} <br />
else{ <br />
&nbsp; result = false; <br />
} <br />
return result; <br />
} <br />
<br />
<br />
public boolean uploadFile(String RWFileDir,String filepathname){ <br />
boolean result=true; <br />
String message = \"\";<br />
if (aftp != null) <br />
{ <br />
&nbsp; System.out.println(\"正在上传文件\"+filepathname+\",请等待....\"); <br />
<br />
&nbsp; try{ <br />
&nbsp; String fg =new String(\"\\\\subunsubfromsp\\\\\"); <br />
&nbsp; int index = filepathname.lastIndexOf(fg); <br />
&nbsp; String filename = filepathname.substring(index+1); <br />
&nbsp; File localFile = new File(filepathname) ;<br />
&nbsp; &nbsp; <br />
&nbsp; RandomAccessFile sendFile = new RandomAccessFile(filepathname,\"r\"); <br />
&nbsp; // <br />
&nbsp; sendFile.seek(0); <br />
&nbsp; //改名上传temp_<br />
&nbsp; filename = filename.substring(0,15)+\"temp_\"+filename.substring(15,filename.length());<br />
&nbsp; outs = aftp.put(filename); <br />
&nbsp; outputs = new DataOutputStream(outs); <br />
&nbsp; while (sendFile.getFilePointer() &lt; sendFile.length() ) <br />
&nbsp; { <br />
&nbsp; ch = sendFile.read(); <br />
&nbsp; outputs.write(ch); <br />
&nbsp; } <br />
&nbsp; <br />
&nbsp; rename(filename.substring(15,filename.length()),filename.substring(20,filename.length()));<br />
&nbsp; outs.close(); <br />
&nbsp; sendFile.close(); <br />
&nbsp; <br />
&nbsp; message = \"上传\"+filepathname+\"文件成功!\";<br />
&nbsp; System.out.println(message); <br />
&nbsp; log(RWFileDir,message);<br />
&nbsp; } <br />
&nbsp; catch(IOException e){ <br />
&nbsp; message = \"上传\"+filepathname+\"文件失败!\"+e;<br />
&nbsp; System.out.println(message); <br />
&nbsp; log(RWFileDir,message);<br />
&nbsp; result = false ; <br />
<br />
&nbsp; } <br />
} <br />
else{ <br />
&nbsp; result = false; <br />
} <br />
return result; <br />
} <br />
<br />
public void rename(String oldName,String newName){<br />
<br />
&nbsp; //aftp.renameTo(oldName,newName);<br />
&nbsp; File Old = new File(oldName); //oldName<br />
&nbsp; File New = new File(newName); //newName<br />
&nbsp; //aftp.renameTo(New);<br />
&nbsp; //boolean Old.renameTo(File newName);<br />
&nbsp; //System.out.println(Old);<br />
&nbsp; //System.out.println(New);<br />
<br />
}<br />
<br />
public static void deleFile(String RWFileDir) { <br />
//try { <br />
//取得ReadFile目录下的txt文件<br />
String sdir = RWFileDir + \"subunsubfromsp\\\\\";<br />
File fdir = new File(sdir);<br />
String FileName = \"\";<br />
int j = fdir.list().length;<br />
<br />
System.out.println(sdir+\"目录下要删除的文件数：\"+fdir.list().length);<br />
File file;<br />
for(int i=0;i {<br />
&nbsp; //删除subunsubfromsp中的txt文件<br />
&nbsp; FileName = RWFileDir + \"subunsubfromsp\\\\\" + (fdir.list())[0];<br />
&nbsp; file = new File(FileName);<br />
&nbsp; file.delete();<br />
&nbsp; System.out.println(\"已经成功删除\"+FileName+\"文件！\");<br />
}<br />
//} <br />
//catch (IOException e) { <br />
// System.out.println(\"删除txt文件错误!\");<br />
// e.printStackTrace();<br />
//}<br />
}<br />
<br />
<br />
public void showFileContents(String strdir) <br />
{ <br />
StringBuffer buf = new StringBuffer();<br />
try { <br />
&nbsp; aftp.cd(strdir);<br />
&nbsp; ins= aftp.list(); <br />
&nbsp; while ((ch=ins.read())&gt;=0){ <br />
&nbsp; buf.append((char)ch); <br />
&nbsp; } <br />
&nbsp; <br />
&nbsp; System.out.println(buf.toString()); <br />
<br />
&nbsp; ins.close(); <br />
&nbsp; &nbsp; } <br />
catch(IOException e) <br />
{ <br />
} <br />
}<br />
<br />
<br />
<br />
// 返回当前目录的所有文件及文件夹<br />
<br />
public ArrayList getFileList() throws IOException {<br />
BufferedReader dr = new BufferedReader(new InputStreamReader(aftp.list()));<br />
ArrayList al = new ArrayList();<br />
String s = \"\";<br />
while ( (s = dr.readLine()) != null) {<br />
al.add(s);<br />
}<br />
return al;<br />
}<br />
<br />
public void setPath(String path) throws IOException {<br />
if (aftp == null)<br />
this.path = path;<br />
else {<br />
&nbsp; aftp.cd(path);<br />
}<br />
}<br />
<br />
// 返回当前目录的文件名称<br />
<br />
public ArrayList getNameList(String RWFileDir) throws IOException {<br />
<br />
BufferedReader dr = new BufferedReader(new InputStreamReader(aftp.nameList(\"subunsubtosp\\\\\")));<br />
ArrayList al = new ArrayList();<br />
String s = \"\";<br />
while ( (s = dr.readLine()) != null) {<br />
&nbsp; al.add(s);<br />
&nbsp; s = s.substring(13,s.length());<br />
&nbsp; isFile(s);<br />
&nbsp; downloadFile(RWFileDir,s);<br />
&nbsp; //String strFileDelF = aftp.nameList(\"subunsubtosp\\\\\");<br />
&nbsp; File fileDelF=new File(s);<br />
&nbsp; fileDelF.delete();<br />
}<br />
return al;<br />
//System.out.println(al.add(s));<br />
}<br />
<br />
// 判断一行文件信息是否为目录<br />
<br />
public boolean isDir(String line) {<br />
return ( (String) parseLine(line).get(0)).indexOf(\"d\") != -1;<br />
}<br />
<br />
public boolean isFile(String line) {<br />
return!isDir(line);<br />
}<br />
<br />
// 处理getFileList取得的行信息<br />
<br />
private ArrayList parseLine(String line) {<br />
ArrayList s1 = new ArrayList();<br />
StringTokenizer st = new StringTokenizer(line, \" \");<br />
while (st.hasMoreTokens()) {<br />
&nbsp; s1.add(st.nextToken());<br />
}<br />
&nbsp; return s1;<br />
}<br />
<br />
//写消息日志<br />
public static void log(String RWFileDir,String msg)<br />
{<br />
String message = \"\";<br />
try {<br />
&nbsp; java.text.DateFormat df = new java.text.SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\");<br />
&nbsp; java.text.DateFormat dflog = new java.text.SimpleDateFormat(\"yyyyMMdd\");<br />
&nbsp; java.util.Date date = new java.util.Date() ;<br />
&nbsp; String datestr = df.format(new java.util.Date()) ;<br />
&nbsp; String datelog = dflog.format(new java.util.Date()) ;<br />
&nbsp; //String datelog = datestr.substring(0,10);<br />
&nbsp; //datelog = datelog.replace(\'-\',\' \');<br />
<br />
&nbsp; //按日期每天生成一个日志文件<br />
&nbsp; FileWriter fwl = new FileWriter(RWFileDir + \"CMSSftp\"+datelog+\".log\",true);<br />
&nbsp; PrintWriter outl = new PrintWriter(fwl);<br />
&nbsp; outl.println(datestr + \" \" + msg);<br />
&nbsp; outl.close();<br />
&nbsp; fwl.close();<br />
}catch (IOException e) { <br />
&nbsp; message = \"写log文件错误!\"+e;<br />
&nbsp; e.printStackTrace();<br />
&nbsp; log(RWFileDir,message);<br />
&nbsp; System.out.println(message);<br />
}<br />
}<br />
}</em><br />
转自：http://bbs.java.ccidnet.com/read.php?tid=135053&amp;fpage=4
<img src ="http://www.blogjava.net/jlin/aggbug/330605.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2010-09-01 18:30 <a href="http://www.blogjava.net/jlin/articles/330605.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java检查PDF文件是否损坏</title><link>http://www.blogjava.net/jlin/articles/330603.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Wed, 01 Sep 2010 10:20:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/articles/330603.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/330603.html</wfw:comment><comments>http://www.blogjava.net/jlin/articles/330603.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/330603.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/330603.html</trackback:ping><description><![CDATA[<p>如果在系统中有比较多的PDF文件，但是的pdf文件可能被损坏了，我们可以利用itext 用来检测<br />
首先下载itext包<br />
http://sourceforge.net/projects/itext/files/<br />
然后在执行以下代码</p>
<p>import java.io.File;<br />
import java.io.FileFilter;<br />
import java.io.IOException;<br />
import java.util.ArrayList;<br />
import com.itextpdf.text.Document;<br />
import com.itextpdf.text.pdf.PdfReader;<br />
public class TestPdf {<br />
&nbsp;private static ArrayList&lt;String&gt; pdffiles = new ArrayList&lt;String&gt;();</p>
<p>&nbsp;/**<br />
&nbsp; * 递归得到特定目录下的所有文件<br />
&nbsp; */<br />
&nbsp;public static void getAllPdfFile(String basedir) {<br />
&nbsp;&nbsp;File dir = new File(basedir);<br />
&nbsp;&nbsp;File[] files = dir.listFiles(new PdfFileFilter());<br />
&nbsp;&nbsp;if (files == null)<br />
&nbsp;&nbsp;&nbsp;return;<br />
&nbsp;&nbsp;for (int i = 0; i &lt; files.length; i++) {<br />
&nbsp;&nbsp;&nbsp;if (files[i].isDirectory()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;getAllPdfFile(files[i].getAbsolutePath());<br />
&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;pdffiles.add(files[i].getAbsolutePath());<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
&nbsp;/**<br />
&nbsp; * 循环检测<br />
&nbsp; */<br />
&nbsp;private static void CheckPdfFiles(ArrayList&lt;String&gt; files) {<br />
&nbsp;&nbsp;for (String file : files) {<br />
&nbsp;&nbsp;&nbsp;boolean flag = false;<br />
&nbsp;&nbsp;&nbsp;flag = check(file);<br />
&nbsp;&nbsp;&nbsp;if (!flag) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(file + "文件损坏");<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;}</p>
<p>&nbsp;/**<br />
&nbsp; * 利用itext打开pdf文档<br />
&nbsp; */<br />
&nbsp;private static boolean check(String file) {<br />
&nbsp;&nbsp;boolean flag1 = false;<br />
&nbsp;&nbsp;int n = 0;<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;Document document = new Document(new PdfReader(file).getPageSize(1));<br />
&nbsp;&nbsp;&nbsp;document.open();<br />
&nbsp;&nbsp;&nbsp;PdfReader reader = new PdfReader(file);<br />
&nbsp;&nbsp;&nbsp;n = reader.getNumberOfPages();<br />
&nbsp;&nbsp;&nbsp;if (n != 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;flag1 = true;<br />
&nbsp;&nbsp;&nbsp;document.close();<br />
&nbsp;&nbsp;} catch (IOException e) {<br />
&nbsp;&nbsp;&nbsp;System.out.println(e.getMessage());<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return flag1;</p>
<p>&nbsp;}</p>
<p>&nbsp;public static void main(String[] args) {<br />
&nbsp;&nbsp;getAllPdfFile("C:\\CO_uat\\");<br />
&nbsp;&nbsp;if (pdffiles.size() &gt; 0)<br />
&nbsp;&nbsp;&nbsp;CheckPdfFiles(pdffiles);<br />
&nbsp;&nbsp;System.out.println("No break down file");<br />
&nbsp;}<br />
}<br />
/*<br />
&nbsp;* pdf文件过滤器<br />
&nbsp;*/<br />
class PdfFileFilter implements FileFilter {<br />
&nbsp;public boolean accept(File file) {<br />
&nbsp;&nbsp;if (file.isFile()) {<br />
&nbsp;&nbsp;&nbsp;String filename = file.getName().toLowerCase();<br />
&nbsp;&nbsp;&nbsp;if (filename.endsWith(".pdf") == true) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;return true;<br />
&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;return false;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;return true;<br />
&nbsp;&nbsp;}<br />
&nbsp;}</p>
<p>}</p>
<img src ="http://www.blogjava.net/jlin/aggbug/330603.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2010-09-01 18:20 <a href="http://www.blogjava.net/jlin/articles/330603.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java文件操作(转)</title><link>http://www.blogjava.net/jlin/articles/329783.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Tue, 24 Aug 2010 06:52:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/articles/329783.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/329783.html</wfw:comment><comments>http://www.blogjava.net/jlin/articles/329783.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/329783.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/329783.html</trackback:ping><description><![CDATA[<p>写了个Java操作文件的简单例子，希望给需要帮助的兄弟提供点儿帮助，同时也希望大家给予批评指正。 <br />
文件操作类，代码如下：<br />
import java.io.File;<br />
import java.io.FileInputStream;<br />
import java.io.FileOutputStream;<br />
import java.io.IOException;<br />
import org.apache.log4j.LogManager;<br />
import org.apache.log4j.Logger;</p>
<p>&nbsp;</p>
<p>public class FileTools {<br />
&nbsp;private static final String SPECIAL_FILE_STYLE_PICTURECACHE = "Thumbs.db";<br />
&nbsp;public static final Logger logger = LogManager.getLogger(FileTools.class);<br />
&nbsp;<br />
&nbsp;public FileTools()<br />
&nbsp;{<br />
&nbsp;&nbsp;<br />
&nbsp;}<br />
&nbsp;/*<br />
&nbsp; * @discription:Delete a folder<br />
&nbsp; * @param:dirPath String<br />
&nbsp; * @return boolean<br />
&nbsp; */<br />
&nbsp;public static boolean deleteDirectory(String dirPath,boolean deteDirRoot)<br />
&nbsp;{<br />
&nbsp;&nbsp;File parentFile = new File(dirPath);<br />
&nbsp;&nbsp;File[] chirenFile = null;<br />
&nbsp;&nbsp;if(parentFile.exists() &amp;&amp; parentFile.isDirectory())<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;chirenFile = parentFile.listFiles();<br />
&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; chirenFile.length; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!chirenFile[i].isDirectory())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chirenFile[i].delete();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;deleteDirectory(chirenFile[i].getAbsolutePath(),true);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chirenFile[i].delete();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(deteDirRoot)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parentFile.delete();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;return true;&nbsp;&nbsp;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;else<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;FileTools.logger.error("The Floder Is Not Exist!");<br />
&nbsp;&nbsp;&nbsp;return false;<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;/*<br />
&nbsp; * @discription:Copy Folder<br />
&nbsp; * @param:sourceFilePath String,targetFilePath String<br />
&nbsp; * @return boolean<br />
&nbsp; */<br />
&nbsp;public static boolean copyDirectory(String sourceFilePath,String targetFilePath) throws IOException<br />
&nbsp;{<br />
&nbsp;&nbsp;File sourceFile = new File(sourceFilePath);<br />
&nbsp;&nbsp;File targetFile = new File(targetFilePath);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;if(!targetFile.exists())<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;targetFile.mkdir();<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;File[] sourceChirenFile = null;<br />
&nbsp;&nbsp;FileInputStream fileInputStream = null;<br />
&nbsp;&nbsp;FileOutputStream fileOutputStream = null;<br />
&nbsp;&nbsp;FileTools.logger.debug("Copy "+sourceFile.getName()+" Floder Start......");<br />
&nbsp;&nbsp;if(sourceFile.exists() &amp;&amp; sourceFile.isDirectory())<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;sourceChirenFile = sourceFile.listFiles();<br />
&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; sourceChirenFile.length; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;File tempFile = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(!sourceFilePath.endsWith(File.separator))<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempFile = new File(targetFilePath+File.separator+sourceChirenFile[i].getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempFile = new File(targetFilePath+sourceChirenFile[i].getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(!FileTools.SPECIAL_FILE_STYLE_PICTURECACHE.equalsIgnoreCase(sourceChirenFile[i].getName()))<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!sourceChirenFile[i].isDirectory())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileInputStream = new FileInputStream(sourceChirenFile[i]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileOutputStream = new FileOutputStream(tempFile);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte[] b = new byte[1024];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileTools.logger.debug("Copy "+sourceChirenFile[i].getName()+" File Start......");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(fileInputStream.read(b)!=-1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;fileOutputStream.write(b);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileTools.logger.debug("Copy "+sourceChirenFile[i].getName()+"&nbsp; File End!");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fileInputStream.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fileOutputStream.close();&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;copyDirectory(sourceFilePath+File.separator+sourceChirenFile[i].getName(),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; targetFilePath+File.separator+sourceChirenFile[i].getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;FileTools.logger.debug("Copy "+sourceFile.getName()+" Floder End!");<br />
&nbsp;&nbsp;&nbsp;return true;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;else<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;FileTools.logger.error("The Floder Is Not Exist!");<br />
&nbsp;&nbsp;&nbsp;return false;<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
}<br />
Junit测试类 <br />
</p>
<p>&nbsp;</p>
<p>import java.io.IOException;</p>
<p>import org.coolyongzi.FileTools;</p>
<p>import junit.framework.TestCase;</p>
<p>public class FileToolsTest extends TestCase {</p>
<p>&nbsp;protected void setUp() throws Exception {<br />
&nbsp;&nbsp;super.setUp();<br />
&nbsp;}</p>
<p>&nbsp;protected void tearDown() throws Exception {<br />
&nbsp;&nbsp;super.tearDown();<br />
&nbsp;}</p>
<p>&nbsp;public void testDeleteDirectory() <br />
&nbsp;{<br />
&nbsp;&nbsp;FileTools.deleteDirectory("F:/复件 图片",false);<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;public void testCopyDirectory()<br />
&nbsp;{<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;FileTools.copyDirectory("F:/Game","F:/Game1");<br />
&nbsp;&nbsp;} catch (IOException e) {<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
}</p>
<img src ="http://www.blogjava.net/jlin/aggbug/329783.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2010-08-24 14:52 <a href="http://www.blogjava.net/jlin/articles/329783.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于 Exception: An invalid XML character (Unicode: 0xb) was found </title><link>http://www.blogjava.net/jlin/articles/328156.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Fri, 06 Aug 2010 10:23:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/articles/328156.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/328156.html</wfw:comment><comments>http://www.blogjava.net/jlin/articles/328156.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/328156.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/328156.html</trackback:ping><description><![CDATA[About Exception:<br />
An invalid XML character (Unicode: 0xb) was found in the element content of the document.<br />
<br />
原因：<br />
从异常来看，很明显是因为字节数组中存在 Unicode: 0xb,而这个字节在Xml中被认为是非法字符。<br />
<br />
对于一些经过编码或加、解密的字符串中，很容易会出现这个 0xb,<br />
特别是在加、解密中，经常会涉及到字符填充，而填充物通常是 0xb，<br />
需对于0x00-0x20 都会引起一定的问题，又因为这些字符不可见，因此用通常的编辑器进行编辑的时候找不到问题所在。<br />
而在转成String后也觉察不到任何异常。<br />
所以在转成XML格式时要对字符串进行检测：<br />
*&nbsp; Verify that no character has a hex value greater than 0xFFFD, or less than 0x20.<br />
* Check that the character is not equal to the tab ("t), the newline ("n), the carriage return ("r), or is an invalid XML character below the range of 0x20. If any of these characters occur, an exception is thrown.<br />
<br />
pubic String&nbsp; CheckUnicodeString(String value) <br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp; char&nbsp;xmlChar = value.toCharArray();<br />
&nbsp;&nbsp;&nbsp; for (int i=0; i &lt; xmlChar.Length; ++i) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (xmlChar[i] &gt; 0xFFFD) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new Exception("Invalid Unicode");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //或者直接替换掉0xb&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlChar[i] =' ';//&nbsp;用空格替换<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (xmlChar[i] &lt; 0x20 &amp;&amp; xmlChar[i] != 't' &amp; xmlChar[i] != 'n' &amp; xmlChar[i] != 'r')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new Exception("Invalid Xml Characters");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //或者直接替换掉0xb<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlChar[i] =' ' ;//&nbsp;用空格替换<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new String( xmlChar );<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
<img src ="http://www.blogjava.net/jlin/aggbug/328156.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2010-08-06 18:23 <a href="http://www.blogjava.net/jlin/articles/328156.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正则表达式详解(转)</title><link>http://www.blogjava.net/jlin/articles/325485.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Wed, 07 Jul 2010 10:05:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/articles/325485.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/325485.html</wfw:comment><comments>http://www.blogjava.net/jlin/articles/325485.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/325485.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/325485.html</trackback:ping><description><![CDATA[<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">如果你曾经用过Perl或任何其他内建正则表达式支持的语言，你一定知道用正则表达式处理文本和匹配模式是多么简单。如果你不熟悉这个术语，那么&#8220;正则表达式&#8221;（Regular Expression）就是一个字符构成的串，它定义了一个用来搜索匹配字符串的模式。 </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">许多语言，包括Perl、PHP、Python、JavaScript和JScript，都支持用正则表达式处理文本，一些文本编辑器用正则表达式实现高级&#8220;搜索-替换&#8221;功能。那么Java又怎样呢？本文写作时，一个包含了用正则表达式进行文本处理的Java规范需求（Specification Request）已经得到认可，你可以期待在JDK的下一版本中看到它。 </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">然而，如果现在就需要使用正则表达式，又该怎么办呢？你可以从Apache.org下载源代码开放的Jakarta-ORO库。本文接下来的内容先简要地介绍正则表达式的入门知识，然后以Jakarta-ORO API为例介绍如何使用正则表达式。 </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14"><strong><span style="font-size: medium">一、正则表达式基础知识</span></strong> </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">我们先从简单的开始。假设你要搜索一个包含字符&#8220;cat&#8221;的字符串，搜索用的正则表达式就是&#8220;cat&#8221;。如果搜索对大小写不敏感，单词&#8220;catalog&#8221;、&#8220;Catherine&#8221;、&#8220;sophisticated&#8221;都可以匹配。也就是说： </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14"><img style="cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/j43nu4ndo6z8.jpg" border="0" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14"><strong>1.1 句点符号</strong> </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">假设你在玩英文拼字游戏，想要找出三个字母的单词，而且这些单词必须以&#8220;t&#8221;字母开头，以&#8220;n&#8221;字母结束。另外，假设有一本英文字典，你可以用正则表达式搜索它的全部内容。要构造出这个正则表达式，你可以使用一个通配符——句点符号&#8220;.&#8221;。这样，完整的表达式就是&#8220;t.n&#8221;，它匹配&#8220;tan&#8221;、&#8220;ten&#8221;、&#8220;tin&#8221;和&#8220;ton&#8221;，还匹配&#8220;t#n&#8221;、&#8220;tpn&#8221;甚至&#8220;t n&#8221;，还有其他许多无意义的组合。这是因为句点符号匹配所有字符，包括空格、Tab字符甚至换行符： </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14"><img style="cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/9i9f280hrzkz.jpg" border="0" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14"><strong>1.2 方括号符号</strong> </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">为了解决句点符号匹配范围过于广泛这一问题，你可以在方括号（&#8220;[]&#8221;）里面指定看来有意义的字符。此时，只有方括号里面指定的字符才参与匹配。也就是说，正则表达式&#8220;t[aeio]n&#8221;只匹配&#8220;tan&#8221;、&#8220;Ten&#8221;、&#8220;tin&#8221;和&#8220;ton&#8221;。但&#8220;Toon&#8221;不匹配，因为在方括号之内你只能匹配单个字符： </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14"><img style="cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/t1e74w8itp99.jpg" border="0" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14"><strong>1.3 &#8220;或&#8221;符号</strong> </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">如果除了上面匹配的所有单词之外，你还想要匹配&#8220;toon&#8221;，那么，你可以使用&#8220;|&#8221;操作符。&#8220;|&#8221;操作符的基本意义就是&#8220;或&#8221;运算。要匹配&#8220;toon&#8221;，使用&#8220;t(a|e|i|o|oo)n&#8221;正则表达式。这里不能使用方扩号，因为方括号只允许匹配单个字符；这里必须使用圆括号&#8220;()&#8221;。圆括号还可以用来分组，具体请参见后面介绍。 </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14"><img style="cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/i1fus8ynpz96.jpg" border="0" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14"><strong>1.4 表示匹配次数的符号</strong> </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">表一显示了表示匹配次数的符号，这些符号用来确定紧靠该符号左边的符号出现的次数： </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">
            <p align="center"><img style="cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/8k41sc2nzdy7.jpg" border="0" /></p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">假设我们要在文本文件中搜索美国的社会安全号码。这个号码的格式是999-99-9999。用来匹配它的正则表达式如图一所示。在正则表达式中，连字符（&#8220;-&#8221;）有着特殊的意义，它表示一个范围，比如从0到9。因此，匹配社会安全号码中的连字符号时，它的前面要加上一个转义字符&#8220;\&#8221;。 </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">
            <p align="center"><img style="cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/d0461e0196rw.gif" border="0" /></p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">
            <p align="center">图一：匹配所有123-12-1234形式的社会安全号码</p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">假设进行搜索的时候，你希望连字符号可以出现，也可以不出现——即，999-99-9999和999999999都属于正确的格式。这时，你可以在连字符号后面加上&#8220;？&#8221;数量限定符号，如图二所示： </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">
            <p align="center"><img style="width: 500px; cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/4s8b1dwh8778.gif" border="0" /></p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">
            <p align="center">图二：匹配所有123-12-1234和123121234形式的社会安全号码</p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">下面我们再来看另外一个例子。美国汽车牌照的一种格式是四个数字加上二个字母。它的正则表达式前面是数字部分&#8220;[0-9]{4}&#8221;，再加上字母部分&#8220;[A-Z]{2}&#8221;。图三显示了完整的正则表达式。 </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">
            <p align="center"><img style="cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/8uvnyokp8pix.gif" border="0" /></p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">
            <p align="center">图三：匹配典型的美国汽车牌照号码，如8836KV</p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">1.5 &#8220;否&#8221;符号 </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">&#8220;^&#8221;符号称为&#8220;否&#8221;符号。如果用在方括号内，&#8220;^&#8221;表示不想要匹配的字符。例如，图四的正则表达式匹配所有单词，但以&#8220;X&#8221;字母开头的单词除外。 </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">
            <p align="center"><img style="cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/47z03c6v2q6z.gif" border="0" /></p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">
            <p align="center">图四：匹配所有单词，但&#8220;X&#8221;开头的除外</p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">1.6 圆括号和空白符号 </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">假设要从格式为&#8220;June 26, 1951&#8221;的生日日期中提取出月份部分，用来匹配该日期的正则表达式可以如图五所示： </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">
            <p align="center"><img style="width: 500px; cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/2w4mut5a8vjn.gif" border="0" /></p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">
            <p align="center">图五：匹配所有Moth DD,YYYY格式的日期</p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">新出现的&#8220;\s&#8221;符号是空白符号，匹配所有的空白字符，包括Tab字符。如果字符串正确匹配，接下来如何提取出月份部分呢？只需在月份周围加上一个圆括号创建一个组，然后用ORO API（本文后面详细讨论）提取出它的值。修改后的正则表达式如图六所示： </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">
            <p align="center"><img style="width: 500px; cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/c677z4111jo2.gif" border="0" /></p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">
            <p align="center">图六：匹配所有Month DD,YYYY格式的日期，定义月份值为第一个组</p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14"><strong>1.7 其它符号</strong> </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">为简便起见，你可以使用一些为常见正则表达式创建的快捷符号。如表二所示： </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">表二：常用符号 </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">
            <p align="center"><img style="cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/32xa8u62viqw.jpg" border="0" /></p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">例如，在前面社会安全号码的例子中，所有出现&#8220;[0-9]&#8221;的地方我们都可以使用&#8220;\d&#8221;。修改后的正则表达式如图七所示： </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">
            <p align="center"><img style="cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/4k2mcvrp04b7.gif" border="0" /></p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">
            <p align="center">图七：匹配所有123-12-1234格式的社会安全号码</p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14"><strong><span style="font-size: medium">二、Jakarta-ORO库</span></strong> </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">有许多源代码开放的正则表达式库可供Java程序员使用，而且它们中的许多支持Perl 5兼容的正则表达式语法。我在这里选用的是Jakarta-ORO正则表达式库，它是最全面的正则表达式API之一，而且它与Perl 5正则表达式完全兼容。另外，它也是优化得最好的API之一。 </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">Jakarta-ORO库以前叫做OROMatcher，Daniel Savarese大方地把它赠送给了Jakarta Project。你可以按照本文最后参考资源的说明下载它。 </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">我首先将简要介绍使用Jakarta-ORO库时你必须创建和访问的对象，然后介绍如何使用Jakarta-ORO API。 </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14"><strong>▲ PatternCompiler对象</strong> </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">首先，创建一个Perl5Compiler类的实例，并把它赋值给PatternCompiler接口对象。Perl5Compiler是PatternCompiler接口的一个实现，允许你把正则表达式编译成用来匹配的Pattern对象。 </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14"><img style="cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/x4z3923ca13a.jpg" border="0" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14"><strong>▲ Pattern对象</strong> </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">要把正则表达式编译成Pattern对象，调用compiler对象的compile()方法，并在调用参数中指定正则表达式。例如，你可以按照下面这种方式编译正则表达式&#8220;t[aeio]n&#8221;： </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14"><img style="cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/2fd26rskmll5.jpg" border="0" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">默认情况下，编译器创建一个大小写敏感的模式（pattern）。因此，上面代码编译得到的模式只匹配&#8220;tin&#8221;、&#8220;tan&#8221;、 &#8220;ten&#8221;和&#8220;ton&#8221;，但不匹配&#8220;Tin&#8221;和&#8220;taN&#8221;。要创建一个大小写不敏感的模式，你应该在调用编译器的时候指定一个额外的参数： </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14"><img style="cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/l56lk1spu66k.jpg" border="0" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">创建好Pattern对象之后，你就可以通过PatternMatcher类用该Pattern对象进行模式匹配。 </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14"><strong>▲ PatternMatcher对象</strong> </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">PatternMatcher对象根据Pattern对象和字符串进行匹配检查。你要实例化一个Perl5Matcher类并把结果赋值给PatternMatcher接口。Perl5Matcher类是PatternMatcher接口的一个实现，它根据Perl 5正则表达式语法进行模式匹配： </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14"><img style="cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/an6co93nb236.jpg" border="0" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">使用PatternMatcher对象，你可以用多个方法进行匹配操作，这些方法的第一个参数都是需要根据正则表达式进行匹配的字符串： </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">&#183; boolean matches(String input, Pattern pattern)：当输入字符串和正则表达式要精确匹配时使用。换句话说，正则表达式必须完整地描述输入字符串。 </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">&#183; boolean matchesPrefix(String input, Pattern pattern)：当正则表达式匹配输入字符串起始部分时使用。 </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">&#183; boolean contains(String input, Pattern pattern)：当正则表达式要匹配输入字符串的一部分时使用（即，它必须是一个子串）。 </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">另外，在上面三个方法调用中，你还可以用PatternMatcherInput对象作为参数替代String对象；这时，你可以从字符串中最后一次匹配的位置开始继续进行匹配。当字符串可能有多个子串匹配给定的正则表达式时，用PatternMatcherInput对象作为参数就很有用了。用PatternMatcherInput对象作为参数替代String时，上述三个方法的语法如下： </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">&#183; boolean matches(PatternMatcherInput input, Pattern pattern) </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">&#183; boolean matchesPrefix(PatternMatcherInput input, Pattern pattern) </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">&#183; boolean contains(PatternMatcherInput input, Pattern pattern) </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14"><strong><span style="font-size: medium">三、应用实例</span></strong> </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">下面我们来看看Jakarta-ORO库的一些应用实例。 </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14"><strong>3.1 日志文件处理</strong> </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">任务：分析一个Web服务器日志文件，确定每一个用户花在网站上的时间。在典型的BEA WebLogic日志文件中，日志记录的格式如下： </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14"><img style="cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/242u5d50m3fr.jpg" border="0" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">分析这个日志记录，可以发现，要从这个日志文件提取的内容有两项：IP地址和页面访问时间。你可以用分组符号（圆括号）从日志记录提取出IP地址和时间标记。 </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">首先我们来看看IP地址。IP地址有4个字节构成，每一个字节的值在0到255之间，各个字节通过一个句点分隔。因此，IP地址中的每一个字节有至少一个、最多三个数字。图八显示了为IP地址编写的正则表达式： </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">
            <p align="center"><img style="width: 500px; cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/21g3c5o3k67u.gif" border="0" /></p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">
            <p align="center">图八：匹配IP地址</p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">IP地址中的句点字符必须进行转义处理（前面加上&#8220;\&#8221;），因为IP地址中的句点具有它本来的含义，而不是采用正则表达式语法中的特殊含义。句点在正则表达式中的特殊含义本文前面已经介绍。 </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">日志记录的时间部分由一对方括号包围。你可以按照如下思路提取出方括号里面的所有内容：首先搜索起始方括号字符（&#8220;[&#8221;），提取出所有不超过结束方括号字符（&#8220;]&#8221;）的内容，向前寻找直至找到结束方括号字符。图九显示了这部分的正则表达式。 </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">
            <p align="center"><img style="cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/cg2u2j7n0mpg.gif" border="0" /></p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">
            <p align="center">图九：匹配至少一个字符，直至找到&#8220;]&#8221;</p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">现在，把上述两个正则表达式加上分组符号（圆括号）后合并成单个表达式，这样就可以从日志记录提取出IP地址和时间。注意，为了匹配&#8220;- -&#8221;（但不提取它），正则表达式中间加入了&#8220;\s-\s-\s&#8221;。完整的正则表达式如图十所示。 </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">
            <p align="center"><img style="width: 500px; cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/157qqoq9ve8w.gif" border="0" /></p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">
            <p align="center">图十：匹配IP地址和时间标记</p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">现在正则表达式已经编写完毕，接下来可以编写使用正则表达式库的Java代码了。 </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">为使用Jakarta-ORO库，首先创建正则表达式字符串和待分析的日志记录字符串： </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14"><img style="cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/759353ra1907.jpg" border="0" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">这里使用的正则表达式与图十的正则表达式差不多完全相同，但有一点例外：在Java中，你必须对每一个向前的斜杠（&#8220;\&#8221;）进行转义处理。图十不是Java的表示形式，所以我们要在每个&#8220;\&#8221;前面加上一个&#8220;\&#8221;以免出现编译错误。遗憾的是，转义处理过程很容易出现错误，所以应该小心谨慎。你可以首先输入未经转义处理的正则表达式，然后从左到右依次把每一个&#8220;\&#8221;替换成&#8220;\\&#8221;。如果要复检，你可以试着把它输出到屏幕上。 </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">初始化字符串之后，实例化PatternCompiler对象，用PatternCompiler编译正则表达式创建一个Pattern对象： </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14"><img style="cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/4o3y3mdkct2x.jpg" border="0" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">现在，创建PatternMatcher对象，调用PatternMatcher接口的contain()方法检查匹配情况： </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14"><img style="cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/75jn387mn42x.jpg" border="0" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">接下来，利用PatternMatcher接口返回的MatchResult对象，输出匹配的组。由于logEntry字符串包含匹配的内容，你可以看到类如下面的输出： </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14"><img style="cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/vgpi8nu05ivw.jpg" border="0" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14"><strong>3.2 HTML处理实例一</strong> </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">下面一个任务是分析HTML页面内FONT标记的所有属性。HTML页面内典型的FONT标记如下所示： </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14"><span style="font-size: x-small; color: #ff0000"><img style="cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/606h60377ssy.jpg" border="0" /></span></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">程序将按照如下形式，输出每一个FONT标记的属性： </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14"><img style="cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/brf9m2df9ieo.jpg" border="0" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">在这种情况下，我建议你使用两个正则表达式。第一个如图十一所示，它从字体标记提取出&#8220;"face="Arial, Serif" size="+2" color="red"&#8221;。 </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">
            <p align="center"><img style="width: 500px; cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/ru4fdvu24otu.gif" border="0" /></p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">
            <p align="center">图十一：匹配FONT标记的所有属性</p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">第二个正则表达式如图十二所示，它把各个属性分割成名字-值对。 </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">
            <p align="center"><img style="width: 500px; cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/7jng3h91d45k.gif" border="0" /></p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">
            <p align="center">图十二：匹配单个属性，并把它分割成名字-值对</p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">分割结果为： </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14"><img style="cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/7jjzyu7lfs84.jpg" border="0" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">现在我们来看看完成这个任务的Java代码。首先创建两个正则表达式字符串，用Perl5Compiler把它们编译成Pattern对象。编译正则表达式的时候，指定Perl5Compiler.CASE_INSENSITIVE_MASK选项，使得匹配操作不区分大小写。 </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">接下来，创建一个执行匹配操作的Perl5Matcher对象。 </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14"><img style="cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/5cf25vch72r5.jpg" border="0" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">假设有一个String类型的变量html，它代表了HTML文件中的一行内容。如果html字符串包含FONT标记，匹配器将返回true。此时，你可以用匹配器对象返回的MatchResult对象获得第一个组，它包含了FONT的所有属性： </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14"><img style="cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/6z605d16f9gp.jpg" border="0" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">接下来创建一个PatternMatcherInput对象。这个对象允许你从最后一次匹配的位置开始继续进行匹配操作，因此，它很适合于提取FONT标记内属性的名字-值对。创建PatternMatcherInput对象，以参数形式传入待匹配的字符串。然后，用匹配器实例提取出每一个FONT的属性。这通过指定PatternMatcherInput对象（而不是字符串对象）为参数，反复地调用PatternMatcher对象的contains()方法完成。PatternMatcherInput对象之中的每一次迭代将把它内部的指针向前移动，下一次检测将从前一次匹配位置的后面开始。 </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">本例的输出结果如下： </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14"><img style="cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/308i497h04uz.jpg" border="0" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14"><strong>3.3 HTML处理实例二</strong> </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">下面我们来看看另一个处理HTML的例子。这一次，我们假定Web服务器从widgets.acme.com移到了newserver.acme.com。现在你要修改一些页面中的链接： </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14"><img style="cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/17341kb8z3di.jpg" border="0" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">执行这个搜索的正则表达式如图十三所示： </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">
            <p align="center"><img style="width: 500px; cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/88277rk37770.gif" border="0" /></p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">
            <p align="center">图十三：匹配修改前的链接</p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">如果能够匹配这个正则表达式，你可以用下面的内容替换图十三的链接： </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14"><a href="http://newserver.acme.com/interface.html#%241"><img style="cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/s82f65t25m75.jpg" border="0" /></a></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">注意#字符的后面加上了$1。Perl正则表达式语法用$1、$2等表示已经匹配且提取出来的组。图十三的表达式把所有作为一个组匹配和提取出来的内容附加到链接的后面。 </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">现在，返回Java。就象前面我们所做的那样，你必须创建测试字符串，创建把正则表达式编译到Pattern对象所必需的对象，以及创建一个PatternMatcher对象：<img style="width: 500px; cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/qg1rzozee4bf.jpg" border="0" /> </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">接下来，用com.oroinc.text.regex包Util类的substitute()静态方法进行替换，输出结果字符串： </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14"><img style="cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/o3m76k1jdp62.jpg" border="0" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">Util.substitute()方法的语法如下： </td>
        </tr>
    </tbody>
</table>
<table style="height: 17px" width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14" height="13"><img style="cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/v9z05f24f3tc.jpg" border="0" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14">这个调用的前两个参数是以前创建的PatternMatcher和Pattern对象。第三个参数是一个Substiution对象，它决定了替换操作如何进行。本例使用的是Perl5Substitution对象，它能够进行Perl5风格的替换。第四个参数是想要进行替换操作的字符串，最后一个参数允许指定是否替换模式的所有匹配子串（Util.SUBSTITUTE_ALL），或只替换指定的次数。 </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" border="0">
    <tbody>
        <tr>
            <td class="a14"><strong>【结束语】</strong>在这篇文章中，我为你介绍了正则表达式的强大功能。只要正确运用，正则表达式能够在字符串提取和文本修改中起到很大的作用。另外，我还介绍了如何在Java程序中通过Jakarta-ORO库利用正则表达式。至于最终采用老式的字符串处理方式（使用StringTokenizer，charAt，和substring），还是采用正则表达式，这就有待你自己决定了。</td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/jlin/aggbug/325485.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2010-07-07 18:05 <a href="http://www.blogjava.net/jlin/articles/325485.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jvm调优总结(转)</title><link>http://www.blogjava.net/jlin/articles/321500.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Thu, 20 May 2010 14:11:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/articles/321500.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/321500.html</wfw:comment><comments>http://www.blogjava.net/jlin/articles/321500.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/321500.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/321500.html</trackback:ping><description><![CDATA[jvm调优总结，见附件<a href="/Files/jlin/JVM_optimism.pdf">/Files/jlin/JVM_optimism.pdf</a>
<img src ="http://www.blogjava.net/jlin/aggbug/321500.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2010-05-20 22:11 <a href="http://www.blogjava.net/jlin/articles/321500.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java连接数据库代码 </title><link>http://www.blogjava.net/jlin/articles/320678.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Wed, 12 May 2010 03:02:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/articles/320678.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/320678.html</wfw:comment><comments>http://www.blogjava.net/jlin/articles/320678.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/320678.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/320678.html</trackback:ping><description><![CDATA[<p><span style="font-size: x-small; font-family: Courier New">1、Oracle8/8i/9i数据库（thin模式） <br />
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); <br />
String url="jdbc:oracle:thin:@localhost:1521:orcl"; <br />
//orcl为数据库的SID <br />
String user="test"; <br />
String password="test"; <br />
Connection conn= DriverManager.getConnection(url,user,password); <br />
<br />
2、DB2数据库 <br />
Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance(); <br />
String url="jdbc:db2://localhost:5000/sample"; <br />
//sample为你的数据库名 <br />
String user="admin"; <br />
String password=""; <br />
Connection conn= DriverManager.getConnection(url,user,password); <br />
<br />
3、Sql Server7.0/2000数据库 <br />
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); <br />
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb"; <br />
//mydb为数据库 <br />
String user="sa"; <br />
String password=""; <br />
Connection conn= DriverManager.getConnection(url,user,password); <br />
<br />
4、Sybase数据库 <br />
Class.forName("com.sybase.jdbc.SybDriver").newInstance(); <br />
String url =" jdbc:sybase:Tds:localhost:5007/myDB"; <br />
//myDB为你的数据库名 <br />
Properties sysProps = System.getProperties(); <br />
SysProps.put("user","userid"); <br />
SysProps.put("password","user_password"); <br />
Connection conn= DriverManager.getConnection(url, SysProps); <br />
<br />
5、Informix数据库 <br />
Class.forName("com.informix.jdbc.IfxDriver").newInstance(); <br />
String url = <br />
"jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver; <br />
user=testuser;password=testpassword"; <br />
//myDB为数据库名 <br />
Connection conn= DriverManager.getConnection(url); <br />
<br />
6、MySQL数据库 <br />
Class.forName("org.gjt.mm.mysql.Driver").newInstance(); <br />
String url ="jdbc:mysql://localhost/myDB?user=soft&amp;password=soft1234&amp;useUnicode=true&amp;characterEncoding=8859_1" <br />
//myDB为数据库名 <br />
Connection conn= DriverManager.getConnection(url); <br />
<br />
7、PostgreSQL数据库 <br />
Class.forName("org.postgresql.Driver").newInstance(); <br />
String url ="jdbc:postgresql://localhost/myDB" <br />
//myDB为数据库名 <br />
String user="myuser"; <br />
String password="mypassword"; <br />
Connection conn= DriverManager.getConnection(url,user,password);</span> </p>
<img src ="http://www.blogjava.net/jlin/aggbug/320678.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2010-05-12 11:02 <a href="http://www.blogjava.net/jlin/articles/320678.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多线程技术下载文件（转）</title><link>http://www.blogjava.net/jlin/articles/320420.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Sun, 09 May 2010 14:12:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/articles/320420.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/320420.html</wfw:comment><comments>http://www.blogjava.net/jlin/articles/320420.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/320420.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/320420.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp; 由于网络传输存在着传输速度,传输路径等问题,将一个文件分为若干块来传送,可以提高传输效率,JAVA多线程技术正是将一个任务分为若干个任务来同时完成.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该实例应用JAVA多线程技术,将一个网络文件分为若干块,每一个线程负责一块数据的下载,下载完毕后将其保存在指定的磁盘路径中.&nbsp;&nbsp;&n...&nbsp;&nbsp;<a href='http://www.blogjava.net/jlin/articles/320420.html'>阅读全文</a><img src ="http://www.blogjava.net/jlin/aggbug/320420.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2010-05-09 22:12 <a href="http://www.blogjava.net/jlin/articles/320420.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用Java代码（转）</title><link>http://www.blogjava.net/jlin/articles/320418.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Sun, 09 May 2010 13:43:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/articles/320418.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/320418.html</wfw:comment><comments>http://www.blogjava.net/jlin/articles/320418.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/320418.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/320418.html</trackback:ping><description><![CDATA[<p>/**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 将某个日期以固定格式转化成字符串<br />
&nbsp;&nbsp;&nbsp;&nbsp; * <br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param date<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return String<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public static String dateToStr(java.util.Date date)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String str = sdf.format(date);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return str;<br />
&nbsp;&nbsp;&nbsp; }<br />
------------------------------------------------------------------------------------------<br />
&nbsp;/**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 判断任意一个整数是否素数<br />
&nbsp;&nbsp;&nbsp;&nbsp; * <br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param n<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return boolean<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public static boolean isPrimes(int n)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 2; i &lt;= Math.sqrt(n); i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (n % i == 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br />
&nbsp;&nbsp;&nbsp; }<br />
------------------------------------------------------------------------------------------<br />
/**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 获得任意一个整数的阶乘，递归<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * <br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param n<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return n!<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public static int factorial(int n)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (n == 1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return n * factorial(n - 1);<br />
&nbsp;&nbsp;&nbsp; }<br />
--------------------------------------------------------------------------------------------<br />
/**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 将指定byte数组以16进制的形式打印到控制台<br />
&nbsp;&nbsp;&nbsp;&nbsp; * <br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param hint<br />
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param b<br />
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[]<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return void<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public static void printHexString(String hint, byte[] b)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print(hint);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; b.length; i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String hex = Integer.toHexString(b[i] &amp; 0xFF);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (hex.length() == 1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hex = '0' + hex;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print(hex.toUpperCase() + " ");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("");<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
-----------------------------------------------------------------------------------------<br />
package net.java2000.tools;</p>
<p>/**<br />
&nbsp;* Title:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Java Bean 工具<br />
&nbsp;* Description:<br />
&nbsp;* Copyright:&nbsp;&nbsp;&nbsp; Copyright (c) 2001<br />
&nbsp;* Company:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JAVA世纪网 http://www.java2000.net<br />
&nbsp;* @author 赵学庆<br />
&nbsp;* @version 1.0<br />
&nbsp;*/<br />
import java.util.*;<br />
import java.util.regex.Pattern;</p>
<p>public class StrTools {<br />
&nbsp;/**<br />
&nbsp; * 分割字符串<br />
&nbsp; * <br />
&nbsp; * @param str<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String 原始字符串<br />
&nbsp; * @param splitsign<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String 分隔符<br />
&nbsp; * @return String[] 分割后的字符串数组<br />
&nbsp; */<br />
&nbsp;@SuppressWarnings("unchecked")<br />
&nbsp;public static String[] split(String str, String splitsign) {<br />
&nbsp;&nbsp;int index;<br />
&nbsp;&nbsp;if (str == null || splitsign == null)<br />
&nbsp;&nbsp;&nbsp;return null;<br />
&nbsp;&nbsp;ArrayList al = new ArrayList();<br />
&nbsp;&nbsp;while ((index = str.indexOf(splitsign)) != -1) {<br />
&nbsp;&nbsp;&nbsp;al.add(str.substring(0, index));<br />
&nbsp;&nbsp;&nbsp;str = str.substring(index + splitsign.length());<br />
&nbsp;&nbsp;&nbsp;//System.out.println("str is : " +str);<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;al.add(str);<br />
&nbsp;&nbsp;return (String[]) al.toArray(new String[0]);<br />
&nbsp;}</p>
<p>&nbsp;/**<br />
&nbsp; * 替换字符串<br />
&nbsp; * <br />
&nbsp; * @param from<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String 原始字符串<br />
&nbsp; * @param to<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String 目标字符串<br />
&nbsp; * @param source<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String 母字符串<br />
&nbsp; * @return String 替换后的字符串<br />
&nbsp; */<br />
&nbsp;public static String replace(String from, String to, String source) {<br />
&nbsp;&nbsp;if (source == null || from == null || to == null)<br />
&nbsp;&nbsp;&nbsp;return null;<br />
&nbsp;&nbsp;StringBuffer bf = new StringBuffer("");<br />
&nbsp;&nbsp;int index = -1;<br />
&nbsp;&nbsp;while ((index = source.indexOf(from)) != -1) {<br />
&nbsp;&nbsp;&nbsp;bf.append(source.substring(0, index) + to);<br />
&nbsp;&nbsp;&nbsp;source = source.substring(index + from.length());<br />
&nbsp;&nbsp;&nbsp;index = source.indexOf(from);<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;bf.append(source);<br />
&nbsp;&nbsp;return bf.toString();<br />
&nbsp;}</p>
<p>&nbsp;/**<br />
&nbsp; * 替换字符串，能能够在HTML页面上直接显示(替换双引号和小于号)<br />
&nbsp; * <br />
&nbsp; * @param str<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String 原始字符串<br />
&nbsp; * @return String 替换后的字符串<br />
&nbsp; */<br />
&nbsp;public static String htmlencode(String str) {<br />
&nbsp;&nbsp;if (str == null) {<br />
&nbsp;&nbsp;&nbsp;return null;<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;return replace("\"", "&amp;quot;", replace("&lt;", "&amp;lt;", str));<br />
&nbsp;}</p>
<p>&nbsp;/**<br />
&nbsp; * 替换字符串，将被编码的转换成原始码（替换成双引号和小于号）<br />
&nbsp; * <br />
&nbsp; * @param str<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String<br />
&nbsp; * @return String<br />
&nbsp; */<br />
&nbsp;public static String htmldecode(String str) {<br />
&nbsp;&nbsp;if (str == null) {<br />
&nbsp;&nbsp;&nbsp;return null;<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;return replace("&amp;quot;", "\"", replace("&amp;lt;", "&lt;", str));<br />
&nbsp;}</p>
<p>&nbsp;private static final String _BR = "&lt;br/&gt;";</p>
<p>&nbsp;/**<br />
&nbsp; * 在页面上直接显示文本内容，替换小于号，空格，回车，TAB<br />
&nbsp; * <br />
&nbsp; * @param str<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String 原始字符串<br />
&nbsp; * @return String 替换后的字符串<br />
&nbsp; */<br />
&nbsp;public static String htmlshow(String str) {<br />
&nbsp;&nbsp;if (str == null) {<br />
&nbsp;&nbsp;&nbsp;return null;<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;str = replace("&lt;", "&amp;lt;", str);<br />
&nbsp;&nbsp;str = replace(" ", "&amp;nbsp;", str);<br />
&nbsp;&nbsp;str = replace("\r\n", _BR, str);<br />
&nbsp;&nbsp;str = replace("\n", _BR, str);<br />
&nbsp;&nbsp;str = replace("\t", "&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;", str);<br />
&nbsp;&nbsp;return str;<br />
&nbsp;}</p>
<p>&nbsp;/**<br />
&nbsp; * 返回指定字节长度的字符串<br />
&nbsp; * <br />
&nbsp; * @param str<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String 字符串<br />
&nbsp; * @param length<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int 指定长度<br />
&nbsp; * @return String 返回的字符串<br />
&nbsp; */<br />
&nbsp;public static String toLength(String str, int length) {<br />
&nbsp;&nbsp;if (str == null) {<br />
&nbsp;&nbsp;&nbsp;return null;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;if (length &lt;= 0) {<br />
&nbsp;&nbsp;&nbsp;return "";<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;if (str.getBytes("GBK").length &lt;= length) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;return str;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;} catch (Exception ex) {<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;StringBuffer buff = new StringBuffer();</p>
<p>&nbsp;&nbsp;int index = 0;<br />
&nbsp;&nbsp;char c;<br />
&nbsp;&nbsp;length -= 3;<br />
&nbsp;&nbsp;while (length &gt; 0) {<br />
&nbsp;&nbsp;&nbsp;c = str.charAt(index);<br />
&nbsp;&nbsp;&nbsp;if (c &lt; 128) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;length--;<br />
&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;length--;<br />
&nbsp;&nbsp;&nbsp;&nbsp;length--;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;buff.append(c);<br />
&nbsp;&nbsp;&nbsp;index++;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;buff.append("...");<br />
&nbsp;&nbsp;return buff.toString();<br />
&nbsp;}</p>
<p>&nbsp;/**<br />
&nbsp; * 判断是否为整数<br />
&nbsp; * <br />
&nbsp; * @param str<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 传入的字符串<br />
&nbsp; * @return 是整数返回true,否则返回false<br />
&nbsp; */<br />
&nbsp;public static boolean isInteger(String str) {<br />
&nbsp;&nbsp;Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");<br />
&nbsp;&nbsp;return pattern.matcher(str).matches();<br />
&nbsp;}</p>
<p>&nbsp;/**<br />
&nbsp; * 判断是否为浮点数，包括double和float<br />
&nbsp; * <br />
&nbsp; * @param str<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 传入的字符串<br />
&nbsp; * @return 是浮点数返回true,否则返回false<br />
&nbsp; */<br />
&nbsp;public static boolean isDouble(String str) {<br />
&nbsp;&nbsp;Pattern pattern = Pattern.compile("^[-\\+]?[.\\d]*$");<br />
&nbsp;&nbsp;return pattern.matcher(str).matches();<br />
&nbsp;}</p>
<p>&nbsp;/**<br />
&nbsp; * 判断输入的字符串是否符合Email样式.<br />
&nbsp; * <br />
&nbsp; * @param str<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 传入的字符串<br />
&nbsp; * @return 是Email样式返回true,否则返回false<br />
&nbsp; */<br />
&nbsp;public static boolean isEmail(String str) {<br />
&nbsp;&nbsp;Pattern pattern = Pattern<br />
&nbsp;&nbsp;&nbsp;&nbsp;.compile("^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$");<br />
&nbsp;&nbsp;return pattern.matcher(str).matches();<br />
&nbsp;}</p>
<p>&nbsp;/**<br />
&nbsp; * 判断输入的字符串是否为纯汉字<br />
&nbsp; * <br />
&nbsp; * @param str<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 传入的字符窜<br />
&nbsp; * @return 如果是纯汉字返回true,否则返回false<br />
&nbsp; */<br />
&nbsp;public static boolean isChinese(String str) {<br />
&nbsp;&nbsp;Pattern pattern = Pattern.compile("[\u0391-\uFFE5]+$");<br />
&nbsp;&nbsp;return pattern.matcher(str).matches();<br />
&nbsp;}</p>
<p>&nbsp;/**<br />
&nbsp; * 是否为空白,包括null和""<br />
&nbsp; * <br />
&nbsp; * @param str<br />
&nbsp; * @return<br />
&nbsp; */<br />
&nbsp;public static boolean isBlank(String str) {<br />
&nbsp;&nbsp;return str == null || str.trim().length() == 0;<br />
&nbsp;}</p>
<p>&nbsp;/**<br />
&nbsp; * 判断是否为质数<br />
&nbsp; * <br />
&nbsp; * @param x<br />
&nbsp; * @return<br />
&nbsp; */<br />
&nbsp;public static boolean isPrime(int x) {<br />
&nbsp;&nbsp;if (x &lt;= 7) {<br />
&nbsp;&nbsp;&nbsp;if (x == 2 || x == 3 || x == 5 || x == 7)<br />
&nbsp;&nbsp;&nbsp;&nbsp;return true;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;int c = 7;<br />
&nbsp;&nbsp;if (x % 2 == 0)<br />
&nbsp;&nbsp;&nbsp;return false;<br />
&nbsp;&nbsp;if (x % 3 == 0)<br />
&nbsp;&nbsp;&nbsp;return false;<br />
&nbsp;&nbsp;if (x % 5 == 0)<br />
&nbsp;&nbsp;&nbsp;return false;<br />
&nbsp;&nbsp;int end = (int) Math.sqrt(x);<br />
&nbsp;&nbsp;while (c &lt;= end) {<br />
&nbsp;&nbsp;&nbsp;if (x % c == 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;return false;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;c += 4;<br />
&nbsp;&nbsp;&nbsp;if (x % c == 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;return false;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;c += 2;<br />
&nbsp;&nbsp;&nbsp;if (x % c == 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;return false;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;c += 4;<br />
&nbsp;&nbsp;&nbsp;if (x % c == 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;return false;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;c += 2;<br />
&nbsp;&nbsp;&nbsp;if (x % c == 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;return false;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;c += 4;<br />
&nbsp;&nbsp;&nbsp;if (x % c == 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;return false;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;c += 6;<br />
&nbsp;&nbsp;&nbsp;if (x % c == 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;return false;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;c += 2;<br />
&nbsp;&nbsp;&nbsp;if (x % c == 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;return false;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;c += 6;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return true;<br />
&nbsp;}</p>
<p>&nbsp;public static void main(String[] args) {<br />
&nbsp;&nbsp;String[] numbers = { "12345", "-12345", "123.45", "-123.45", ".12345",<br />
&nbsp;&nbsp;&nbsp;&nbsp;"-.12345", "a12345", "12345a", "123.a45" };<br />
&nbsp;&nbsp;for (String str : numbers) {<br />
&nbsp;&nbsp;&nbsp;System.out<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.println(str + "=" + isInteger(str) + " " + isDouble(str));<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;String[] emails = { "1@2.com", "1.2@3.com", "1@3.4.5.com" };<br />
&nbsp;&nbsp;for (String str : emails) {<br />
&nbsp;&nbsp;&nbsp;System.out.println(str + "=" + isEmail(str));<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;String[] chineses = { "中国", "1中国", "中国1", "1中国2", "中1国" };<br />
&nbsp;&nbsp;for (String str : chineses) {<br />
&nbsp;&nbsp;&nbsp;System.out.println(str + "=" + isChinese(str));<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp; String str = "lin@san@fu@2009";<br />
&nbsp;&nbsp; String[] strArray =split(str,"@");<br />
&nbsp;&nbsp; for(String s: strArray)<br />
&nbsp;&nbsp; System.out.println(s);<br />
&nbsp;}<br />
}<br />
-------------------------------------------------------------------------------------------------<br />
<span style="color: #008000">/*</span><span style="color: #008000"> * Db.java<br />
Created on 2007年8月20日, 上午 8:37<br />
</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">import</span><span style="color: #000000"> java.io.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000"> java.sql.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000"> java.util.Properties;<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> Db {<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">private</span><span style="color: #000000"> String driver;<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">private</span><span style="color: #000000"> String url;<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">private</span><span style="color: #000000"> String user;<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">private</span><span style="color: #000000"> String password;<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">private</span><span style="color: #000000"> Connection conn;<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">private</span><span style="color: #000000"> Statement stm;<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">private</span><span style="color: #000000"> ResultSet rs;<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">public</span><span style="color: #000000"> Db(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">this</span><span style="color: #000000">(</span><span style="color: #000000">"</span><span style="color: #000000">DBConf.properties</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">public</span><span style="color: #000000"> Db(String conf) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loadProperties(conf);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setConn();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">public</span><span style="color: #000000"> Connection getConn(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #0000ff">this</span><span style="color: #000000">.conn;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp; </span><span style="color: #008000">//</span><span style="color: #008000">handle the properties file to get the informations for connection</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">private</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> loadProperties(String conf){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Properties props </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> Properties();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">try</span><span style="color: #000000"> {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; props.load(</span><span style="color: #0000ff">new</span><span style="color: #000000"> FileInputStream(conf));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (FileNotFoundException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (IOException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">this</span><span style="color: #000000">.driver </span><span style="color: #000000">=</span><span style="color: #000000"> props.getProperty(</span><span style="color: #000000">"</span><span style="color: #000000">driver</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">this</span><span style="color: #000000">.url </span><span style="color: #000000">=</span><span style="color: #000000"> props.getProperty(</span><span style="color: #000000">"</span><span style="color: #000000">url</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">this</span><span style="color: #000000">.user </span><span style="color: #000000">=</span><span style="color: #000000"> props.getProperty(</span><span style="color: #000000">"</span><span style="color: #000000">user</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">this</span><span style="color: #000000">.password </span><span style="color: #000000">=</span><span style="color: #000000"> props.getProperty(</span><span style="color: #000000">"</span><span style="color: #000000">password</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #008000">//</span><span style="color: #008000">implement the Connection</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">private</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> setConn(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">try</span><span style="color: #000000"> {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class.forName(driver);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">this</span><span style="color: #000000">.conn </span><span style="color: #000000">=</span><span style="color: #000000"> DriverManager.getConnection(url,user,password);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </span><span style="color: #0000ff">catch</span><span style="color: #000000">(ClassNotFoundException classnotfoundexception) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; classnotfoundexception.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(</span><span style="color: #000000">"</span><span style="color: #000000">db: </span><span style="color: #000000">"</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> classnotfoundexception.getMessage());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </span><span style="color: #0000ff">catch</span><span style="color: #000000">(SQLException sqlexception) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(</span><span style="color: #000000">"</span><span style="color: #000000">db.getconn(): </span><span style="color: #000000">"</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> sqlexception.getMessage());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> doInsert(String sql) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">try</span><span style="color: #000000"> {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Statement statement </span><span style="color: #000000">=</span><span style="color: #000000"> conn.createStatement();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">int</span><span style="color: #000000"> i </span><span style="color: #000000">=</span><span style="color: #000000"> stm.executeUpdate(sql);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </span><span style="color: #0000ff">catch</span><span style="color: #000000">(SQLException sqlexception) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(</span><span style="color: #000000">"</span><span style="color: #000000">db.executeInset:</span><span style="color: #000000">"</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> sqlexception.getMessage());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> doDelete(String sql) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">try</span><span style="color: #000000"> {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stm </span><span style="color: #000000">=</span><span style="color: #000000"> conn.createStatement();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">int</span><span style="color: #000000"> i </span><span style="color: #000000">=</span><span style="color: #000000"> stm.executeUpdate(sql);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </span><span style="color: #0000ff">catch</span><span style="color: #000000">(SQLException sqlexception) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(</span><span style="color: #000000">"</span><span style="color: #000000">db.executeDelete:</span><span style="color: #000000">"</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> sqlexception.getMessage());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> doUpdate(String sql) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">try</span><span style="color: #000000"> {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stm </span><span style="color: #000000">=</span><span style="color: #000000"> conn.createStatement();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">int</span><span style="color: #000000"> i </span><span style="color: #000000">=</span><span style="color: #000000"> stm.executeUpdate(sql);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </span><span style="color: #0000ff">catch</span><span style="color: #000000">(SQLException sqlexception) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(</span><span style="color: #000000">"</span><span style="color: #000000">db.executeUpdate:</span><span style="color: #000000">"</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> sqlexception.getMessage());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">public</span><span style="color: #000000"> ResultSet doSelect(String sql) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">try</span><span style="color: #000000"> {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stm </span><span style="color: #000000">=</span><span style="color: #000000"> conn.createStatement(java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE,java.sql.ResultSet.CONCUR_READ_ONLY);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs </span><span style="color: #000000">=</span><span style="color: #000000"> stm.executeQuery(sql);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </span><span style="color: #0000ff">catch</span><span style="color: #000000">(SQLException sqlexception) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(</span><span style="color: #000000">"</span><span style="color: #000000">db.executeQuery: </span><span style="color: #000000">"</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> sqlexception.getMessage());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">return</span><span style="color: #000000"> rs;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> main(String[] args){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">try</span><span style="color: #000000">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Db db </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> Db();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Connection conn </span><span style="color: #000000">=</span><span style="color: #000000"> db.getConn();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">if</span><span style="color: #000000">(conn </span><span style="color: #000000">!=</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000"> </span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000"> </span><span style="color: #000000">!</span><span style="color: #000000">conn.isClosed()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">連結成功</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResultSet rs </span><span style="color: #000000">=</span><span style="color: #000000"> db.doSelect(</span><span style="color: #000000">"</span><span style="color: #000000">select * from content</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">while</span><span style="color: #000000">(rs.next()){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(rs.getString(</span><span style="color: #000000">1</span><span style="color: #000000">)</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">rs.getString(</span><span style="color: #000000">2</span><span style="color: #000000">)</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">rs.getString(</span><span style="color: #000000">3</span><span style="color: #000000">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span><span style="color: #0000ff">catch</span><span style="color: #000000">(SQLException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }&nbsp; <br />
}<br />
</span><br />
</p>
<img src ="http://www.blogjava.net/jlin/aggbug/320418.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2010-05-09 21:43 <a href="http://www.blogjava.net/jlin/articles/320418.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA里面如何让一个线程死亡或结束（转）</title><link>http://www.blogjava.net/jlin/articles/318201.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Tue, 13 Apr 2010 14:28:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/articles/318201.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/318201.html</wfw:comment><comments>http://www.blogjava.net/jlin/articles/318201.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/318201.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/318201.html</trackback:ping><description><![CDATA[<p>这问题也是很常见的问题，自打 stop不推荐使用后，我们还有别的可以选择的方法吗？<br />
设置一个标志，让其自动return最安全。 </p>
<p>/**<br />
&nbsp;* JAVA里面如何使用一个线程死亡或结束.<br />
&nbsp;* @author 赵学庆，Java世纪网(java2000.net)<br />
&nbsp;*<br />
&nbsp;*/<br />
public class T {<br />
&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp; // 启动线程<br />
&nbsp;&nbsp;&nbsp; MyThread thread = new MyThread();<br />
&nbsp;&nbsp;&nbsp; new Thread(thread).start();</p>
<p><br />
&nbsp;&nbsp;&nbsp; // 你的其它的工作，此时线程在运行中</p>
<p><br />
&nbsp;&nbsp;&nbsp; // 你不想让线程干活了，停掉它<br />
&nbsp;&nbsp;&nbsp; // 注意，这只是一个标志，具体线程何时停，并不能精确控制<br />
&nbsp;&nbsp;&nbsp; thread.allDone = true;</p>
<p><br />
&nbsp; }</p>
<p><br />
}</p>
<p><br />
class MyThread implements Runnable {<br />
&nbsp; boolean volatile allDone = false;</p>
<p><br />
&nbsp; public void run() {<br />
&nbsp;&nbsp;&nbsp; // 每次循环都检测标志<br />
&nbsp;&nbsp;&nbsp; // 如果设置停止标志时已经在循环里<br />
&nbsp;&nbsp;&nbsp; // 则最长需要等待一个循环的时间才能终止<br />
&nbsp;&nbsp;&nbsp; while (!allDone) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 循环里的工作<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp; }<br />
}</p>
<p><br />
本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/phphot/archive/2008/10/30/3187042.aspx</p>
<img src ="http://www.blogjava.net/jlin/aggbug/318201.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2010-04-13 22:28 <a href="http://www.blogjava.net/jlin/articles/318201.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java URL 访问</title><link>http://www.blogjava.net/jlin/articles/317247.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Thu, 01 Apr 2010 17:14:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/articles/317247.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/317247.html</wfw:comment><comments>http://www.blogjava.net/jlin/articles/317247.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/317247.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/317247.html</trackback:ping><description><![CDATA[<p>/**<br />
&nbsp;* <br />
&nbsp;*/<br />
package com.lin;</p>
<p>import java.io.BufferedReader;<br />
import java.io.InputStreamReader;<br />
import java.io.PrintWriter;<br />
import java.net.HttpURLConnection;</p>
<p>import javax.net.ssl.SSLHandshakeException;</p>
<p>/**<br />
&nbsp;* @author lin<br />
&nbsp;* <br />
&nbsp;*/<br />
public class TestURL {</p>
<p>&nbsp;/**<br />
&nbsp; * @param args<br />
&nbsp; */<br />
&nbsp;public static void main(String[] args)&nbsp;&nbsp; {<br />
&nbsp;&nbsp;String result = "";<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;java.net.URL url = new java.net.URL("<a href="http://mail.163.com">http://mail.163.com</a>");<br />
&nbsp;&nbsp;&nbsp;HttpURLConnection httpConn = (HttpURLConnection) url<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.openConnection();<br />
&nbsp;&nbsp;&nbsp;httpConn.setDoOutput(true);<br />
&nbsp;&nbsp;&nbsp;httpConn.setDoInput(true);<br />
&nbsp;&nbsp;&nbsp;httpConn.setRequestMethod("POST");<br />
&nbsp;&nbsp;&nbsp;PrintWriter out = new PrintWriter(httpConn.getOutputStream());<br />
&nbsp;&nbsp;&nbsp;out.println("Email=test@gmail.com" +"password=123456");<br />
&nbsp;&nbsp;&nbsp;out.flush();<br />
&nbsp;&nbsp;&nbsp;out.close();<br />
&nbsp;&nbsp;&nbsp;BufferedReader in = new BufferedReader(new InputStreamReader(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;httpConn.getInputStream(), "UTF-8"));<br />
&nbsp;&nbsp;&nbsp;String line;<br />
&nbsp;&nbsp;&nbsp;while ((line = in.readLine()) != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;result += line + "\n";<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;System.out.println("result: " + result);<br />
&nbsp;&nbsp;&nbsp;in.close();<br />
&nbsp;&nbsp;&nbsp; }catch(SSLHandshakeException se){<br />
&nbsp;&nbsp;&nbsp;System.out.println("error is open");<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;System.out.println("sucess " + e);<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;}<br />
}<br />
</p>
<img src ="http://www.blogjava.net/jlin/aggbug/317247.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2010-04-02 01:14 <a href="http://www.blogjava.net/jlin/articles/317247.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java反射经典实例 Java Reflection Cookbook</title><link>http://www.blogjava.net/jlin/articles/311378.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Sun, 31 Jan 2010 05:06:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/articles/311378.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/311378.html</wfw:comment><comments>http://www.blogjava.net/jlin/articles/311378.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/311378.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/311378.html</trackback:ping><description><![CDATA[<p>Java提供了一套机制来动态执行方法和构造方法，以及数组操作等，这套机制就叫——反射。反射机制是如今很多流行框架的实现基础，其中包括Spring、Hibernate等。原理性的问题不是本文的重点，接下来让我们在实例中学习这套精彩的机制。</p>
<p>1. 得到某个对象的属性</p>
<p>1 public Object getProperty(Object owner, String fieldName) throws Exception {<br />
2&nbsp;&nbsp;&nbsp;&nbsp; Class ownerClass = owner.getClass();<br />
3 <br />
4&nbsp;&nbsp;&nbsp;&nbsp; Field field = ownerClass.getField(fieldName);<br />
5 <br />
6&nbsp;&nbsp;&nbsp;&nbsp; Object property = field.get(owner);<br />
7 <br />
8&nbsp;&nbsp;&nbsp;&nbsp; return property;<br />
9 }<br />
Class ownerClass = owner.getClass()：得到该对象的Class。</p>
<p>Field field = ownerClass.getField(fieldName)：通过Class得到类声明的属性。</p>
<p>Object property = field.get(owner)：通过对象得到该属性的实例，如果这个属性是非公有的，这里会报IllegalAccessException。</p>
<p>&nbsp;</p>
<p>2. 得到某个类的静态属性</p>
<p>&nbsp;1 public Object getStaticProperty(String className, String fieldName)<br />
&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws Exception {<br />
&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp; Class ownerClass = Class.forName(className);<br />
&nbsp;4 <br />
&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp; Field field = ownerClass.getField(fieldName);<br />
&nbsp;6 <br />
&nbsp;7&nbsp;&nbsp;&nbsp;&nbsp; Object property = field.get(ownerClass);<br />
&nbsp;8 <br />
&nbsp;9&nbsp;&nbsp;&nbsp;&nbsp; return property;<br />
10 }</p>
<p>Class ownerClass = Class.forName(className) ：首先得到这个类的Class。</p>
<p>Field field = ownerClass.getField(fieldName)：和上面一样，通过Class得到类声明的属性。</p>
<p>Object property = field.get(ownerClass) ：这里和上面有些不同，因为该属性是静态的，所以直接从类的Class里取。</p>
<p><br />
3. 执行某对象的方法</p>
<p>&nbsp;1 public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception {<br />
&nbsp;2 <br />
&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp; Class ownerClass = owner.getClass();<br />
&nbsp;4 <br />
&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp; Class[] argsClass = new Class[args.length];<br />
&nbsp;6 <br />
&nbsp;7&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0, j = args.length; i &lt; j; i++) {<br />
&nbsp;8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; argsClass[i] = args[i].getClass();<br />
&nbsp;9&nbsp;&nbsp;&nbsp;&nbsp; }<br />
10 <br />
11&nbsp;&nbsp;&nbsp;&nbsp; Method method = ownerClass.getMethod(methodName, argsClass);<br />
12 <br />
13&nbsp;&nbsp;&nbsp;&nbsp; return method.invoke(owner, args);<br />
14 }<br />
Class owner_class = owner.getClass() ：首先还是必须得到这个对象的Class。</p>
<p>5～9行：配置参数的Class数组，作为寻找Method的条件。</p>
<p>Method method = ownerClass.getMethod(methodName, argsClass)：通过Method名和参数的Class数组得到要执行的Method。</p>
<p>method.invoke(owner, args)：执行该Method，invoke方法的参数是执行这个方法的对象，和参数数组。返回值是Object，也既是该方法的返回值。</p>
<p><br />
4. 执行某个类的静态方法</p>
<p>&nbsp;1 public Object invokeStaticMethod(String className, String methodName,<br />
&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object[] args) throws Exception {<br />
&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp; Class ownerClass = Class.forName(className);<br />
&nbsp;4 <br />
&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp; Class[] argsClass = new Class[args.length];<br />
&nbsp;6 <br />
&nbsp;7&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0, j = args.length; i &lt; j; i++) {<br />
&nbsp;8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; argsClass[i] = args[i].getClass();<br />
&nbsp;9&nbsp;&nbsp;&nbsp;&nbsp; }<br />
10 <br />
11&nbsp;&nbsp;&nbsp;&nbsp; Method method = ownerClass.getMethod(methodName, argsClass);<br />
12 <br />
13&nbsp;&nbsp;&nbsp;&nbsp; return method.invoke(null, args);<br />
14 }</p>
<p>基本的原理和实例3相同，不同点是最后一行，invoke的一个参数是null，因为这是静态方法，不需要借助实例运行。</p>
<p>&nbsp;</p>
<p>5. 新建实例<br />
&nbsp;1 <br />
&nbsp;2 public Object newInstance(String className, Object[] args) throws Exception {<br />
&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp; Class newoneClass = Class.forName(className);<br />
&nbsp;4 <br />
&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp; Class[] argsClass = new Class[args.length];<br />
&nbsp;6 <br />
&nbsp;7&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0, j = args.length; i &lt; j; i++) {<br />
&nbsp;8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; argsClass[i] = args[i].getClass();<br />
&nbsp;9&nbsp;&nbsp;&nbsp;&nbsp; }<br />
10 <br />
11&nbsp;&nbsp;&nbsp;&nbsp; Constructor cons = newoneClass.getConstructor(argsClass);<br />
12 <br />
13&nbsp;&nbsp;&nbsp;&nbsp; return cons.newInstance(args);<br />
14 <br />
15 }</p>
<p>这里说的方法是执行带参数的构造函数来新建实例的方法。如果不需要参数，可以直接使用newoneClass.newInstance()来实现。</p>
<p>Class newoneClass = Class.forName(className)：第一步，得到要构造的实例的Class。</p>
<p>第5～第9行：得到参数的Class数组。</p>
<p>Constructor cons = newoneClass.getConstructor(argsClass)：得到构造子。</p>
<p>cons.newInstance(args)：新建实例。</p>
<p><br />
6. 判断是否为某个类的实例</p>
<p>1 public boolean isInstance(Object obj, Class cls) {<br />
2&nbsp;&nbsp;&nbsp;&nbsp; return cls.isInstance(obj);<br />
3 }</p>
<p><br />
7. 得到数组中的某个元素<br />
1 public Object getByArray(Object array, int index) {<br />
2&nbsp;&nbsp;&nbsp;&nbsp; return Array.get(array,index);<br />
3 }</p>
<p><br />
附完整源码：</p>
<p>import java.lang.reflect.Array;<br />
import java.lang.reflect.Constructor;<br />
import java.lang.reflect.Field;<br />
import java.lang.reflect.Method;</p>
<p><br />
/**<br />
&nbsp;* Java Reflection Cookbook<br />
&nbsp;*<br />
&nbsp;* @author Michael Lee<br />
&nbsp;* @since 2006-8-23<br />
&nbsp;* @version 0.1a<br />
&nbsp;*/</p>
<p>public class Reflection {<br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 得到某个对象的公共属性<br />
&nbsp;&nbsp;&nbsp;&nbsp; *<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param owner, fieldName<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return 该属性对象<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @throws Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp; *<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public Object getProperty(Object owner, String fieldName) throws Exception {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class ownerClass = owner.getClass();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Field field = ownerClass.getField(fieldName);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object property = field.get(owner);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return property;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 得到某类的静态公共属性<br />
&nbsp;&nbsp;&nbsp;&nbsp; *<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param className&nbsp;&nbsp; 类名<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param fieldName&nbsp;&nbsp; 属性名<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return 该属性对象<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @throws Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public Object getStaticProperty(String className, String fieldName)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws Exception {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class ownerClass = Class.forName(className);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Field field = ownerClass.getField(fieldName);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object property = field.get(ownerClass);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return property;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p><br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 执行某对象方法<br />
&nbsp;&nbsp;&nbsp;&nbsp; *<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param owner<br />
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对象<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param methodName<br />
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法名<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param args<br />
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 参数<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return 方法返回值<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @throws Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public Object invokeMethod(Object owner, String methodName, Object[] args)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws Exception {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class ownerClass = owner.getClass();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class[] argsClass = new Class[args.length];</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0, j = args.length; i &lt; j; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; argsClass[i] = args[i].getClass();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method method = ownerClass.getMethod(methodName, argsClass);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return method.invoke(owner, args);<br />
&nbsp;&nbsp;&nbsp; }</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 执行某类的静态方法<br />
&nbsp;&nbsp;&nbsp;&nbsp; *<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param className<br />
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类名<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param methodName<br />
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法名<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param args<br />
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 参数数组<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return 执行方法返回的结果<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @throws Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public Object invokeStaticMethod(String className, String methodName,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object[] args) throws Exception {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class ownerClass = Class.forName(className);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class[] argsClass = new Class[args.length];</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0, j = args.length; i &lt; j; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; argsClass[i] = args[i].getClass();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method method = ownerClass.getMethod(methodName, argsClass);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return method.invoke(null, args);<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 新建实例<br />
&nbsp;&nbsp;&nbsp;&nbsp; *<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param className<br />
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类名<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param args<br />
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 构造函数的参数<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return 新建的实例<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @throws Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public Object newInstance(String className, Object[] args) throws Exception {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class newoneClass = Class.forName(className);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class[] argsClass = new Class[args.length];</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0, j = args.length; i &lt; j; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; argsClass[i] = args[i].getClass();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Constructor cons = newoneClass.getConstructor(argsClass);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return cons.newInstance(args);</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p><br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 是不是某个类的实例<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param obj 实例<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param cls 类<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return 如果 obj 是此类的实例，则返回 true<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public boolean isInstance(Object obj, Class cls) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return cls.isInstance(obj);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 得到数组中的某个元素<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param array 数组<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param index 索引<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return 返回指定数组对象中索引组件的值<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public Object getByArray(Object array, int index) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return Array.get(array,index);<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p>本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/nomads/archive/2006/09/05/1178867.aspx</p>
<img src ="http://www.blogjava.net/jlin/aggbug/311378.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2010-01-31 13:06 <a href="http://www.blogjava.net/jlin/articles/311378.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring-搞定bean加载( 转)</title><link>http://www.blogjava.net/jlin/articles/298269.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Wed, 14 Oct 2009 10:01:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/articles/298269.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/298269.html</wfw:comment><comments>http://www.blogjava.net/jlin/articles/298269.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/298269.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/298269.html</trackback:ping><description><![CDATA[<p>spring的IOC非常的强大。。特别是管理Web项目中的自动加载。</p>
<p>但是实际应用中，可能会碰到这样两类的问题：</p>
<p>1.写UnitTest的时候，需要脱离容器，手动读取xml文件加载bean。</p>
<p>2.在一个Web容器中，可能某个脱离了spring管理（也就是一个非bean）的类，需要感知并读取某个spring容易的bean。</p>
<p>&nbsp;</p>
<p>下面转了2篇文章，分别是对应上面2个问题的解决方案</p>
<p>&nbsp;</p>
<p>http://hi.baidu.com/%C9%CF%B5%DB%D2%B2%B7%B8%C0%A7/blog/item/f934474a104c3e2008f7ef66.html</p>
<p>Spring中读取bean配置文件的几种方式&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>BeanFactory允许InputStream作为构造函数的参数，也可以org.springframework.core.io.Resource接口。下面这个例子是用ClassPathResource作为参数：<br />
Resource resource = new ClassPathResource("bean.xml");<br />
BeanFactory factory = new XmlBeanFactory(resource);<br />
ActionBean action = (ActionBean) factory.getBean("actionBean"); </p>
<p>如果同一个Bean在配置文件有多个bean的定义，则用下面的方法取得所有的对象：<br />
Resource resource = new ClassPathResource("bean.xml");<br />
ListableBeanFactory factory = new XmlBeanFactory(resource);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
Map helloBeans = factory.getBeansOfType(ActionBean.class, false, false); </p>
<p><br />
&nbsp;&nbsp;&nbsp; 一个应用程序中往往有很多的Bean要放在配置文件，如果所有的Bean都放在一个文件中，维护起来就相当的麻烦，这时我们可以按照模块把每个模块用到Bean放到不同的配置文件，Spring提供了相应的方法：<br />
BeanDefinitionRegistry reg = new DefaultListableBeanFactory();<br />
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(reg);<br />
&nbsp;&nbsp; <br />
// 載入bean定義檔&nbsp;&nbsp; <br />
reader.loadBeanDefinitions(new ClassPathResource("bean1.xml"));<br />
reader.loadBeanDefinitions(new ClassPathResource("bean2.xml"));<br />
....</p>
<p>// 取得Bean<br />
BeanFactory bf = (BeanFactory) reg;<br />
Object o = bf.getBean("actionBean"); </p>
<p>===================================================================</p>
<p>读取配置文件的几种方法<br />
在读spring in aciton 时，他用的BeanFactory factory = new XmlBeanFactory(new FileInputStream("hello.xml"));<br />
可是现在的用的1.2.6版本的构造器(XmlBeanFactory)只能接收Resource接口了，所以调不出来是正常的事情，假设现在有一个文件hello.xml<br />
读取方法</p>
<p>1:ApplicationContext cx=new FileSystemXmlApplicationContext("hello.xml");//指定的路径去找文件<br />
2:ApplicationContext factory = new ClassPathXmlApplicationContext("hello.xml");//还会在classpath去找<br />
3:Resource fa = new FileSystemResource("hello.xml");<br />
BeanFactory factory=new XmlBeanFactory(fa);<br />
4:这个要设制classpath了，麻烦<br />
　 Resource res = new ClassPathResource("com/springinaction/chapter01/hello/hello.xml");<br />
　 BeanFactory factory=new XmlBeanFactory(res);<br />
好了，用了上面那种方法都可以调用getBean("your bean name")了，<br />
eg: BeanFactory factory=new XmlBeanFactory(fa);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hello he=(hello)factory.getBean("hello");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; he.getHello();</p>
<p>================================================================================</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰</p>
<p>http://babycountry.spaces.live.com/blog/cns!18767b1e2eb6d0e1!236.entry</p>
<p>spring 读取注册bean的一些方法(转)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我现在在做的东西,主要用到了框架是struts2+hibernate+spring开发一个上传,下载,播放视频,听歌的东西,在做到获得到注册bean的时候,我想通过在web.xml配置context-param中获得,但老也不成功,后来在网站上看到别人写的,共同分享:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过几个项目的实践总结一下几种获得spring里注册Bean的方法： <br />
一：方法一（多在struts框架中）继承BaseDispatchAction <br />
1234567891011121314151617181920212223242526272829303132333435363738394041 package com.mas.wawacommunity.wap.web.action;<br />
&nbsp;<br />
import org.apache.struts.action.ActionForm;<br />
import org.apache.struts.action.ActionForward;<br />
import org.apache.struts.action.ActionMapping;<br />
import org.apache.struts.action.ActionServlet;<br />
import org.apache.struts.actions.DispatchAction;<br />
import org.springframework.web.context.WebApplicationContext;<br />
import org.springframework.web.context.support.WebApplicationContextUtils;<br />
&nbsp;<br />
import com.mas.wawacommunity.wap.service.UserManager;<br />
&nbsp;<br />
public class BaseDispatchAction extends DispatchAction {<br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp; * web应用上下文环境变量<br />
&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; protected WebApplicationContext ctx;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; protected UserManager userMgr;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp; * 获得注册Bean&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; * @param beanName String 注册Bean的名称<br />
&nbsp;&nbsp;&nbsp; * @return<br />
&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; protected final Object getBean(String beanName) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ctx.getBean(beanName);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; protected ActionForward unspecified(ActionMapping mapping, ActionForm form,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; javax.servlet.http.HttpServletRequest request,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; javax.servlet.http.HttpServletResponse response) {&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return mapping.findForward("index");<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; public void setServlet(ActionServlet servlet) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.servlet = servlet;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.ctx = WebApplicationContextUtils.getWebApplicationContext(servlet.getServletContext());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.userMgr = (UserManager) getBean("userManager");<br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
}<br />
&nbsp;</p>
<p>action调用： <br />
123456789101112131415161718192021222324252627282930313233343536373839 package com.mas.wawacommunity.wap.web.action;<br />
&nbsp;<br />
import javax.servlet.http.HttpServletRequest;<br />
import javax.servlet.http.HttpServletResponse;<br />
&nbsp;<br />
import org.apache.struts.action.ActionForm;<br />
import org.apache.struts.action.ActionForward;<br />
import org.apache.struts.action.ActionMapping;<br />
import org.apache.struts.action.ActionServlet;<br />
&nbsp;<br />
import com.mas.wawacommunity.wap.model.News;<br />
import com.mas.wawacommunity.wap.service.NewsManager;<br />
&nbsp;<br />
public class NewsAction extends BaseDispatchAction {<br />
&nbsp; NewsManager newsManager;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public void setServlet(ActionServlet servlet) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super.setServlet(servlet);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newsManager = (NewsManager) this.getBean("newsManager");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp; * 得到新闻列表<br />
&nbsp;&nbsp;&nbsp; * @param mapping<br />
&nbsp;&nbsp;&nbsp; * @param form<br />
&nbsp;&nbsp;&nbsp; * @param request<br />
&nbsp;&nbsp;&nbsp; * @param resp<br />
&nbsp;&nbsp;&nbsp; * @return<br />
&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public ActionForward getNewsList(ActionMapping mapping, ActionForm form,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletRequest request, HttpServletResponse resp) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int category = Text.parseInt(request, "category", 0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int pageNo = Text.parseInt(request, "pageNo", 1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int pageSize = Text.parseInt(request, "pageSize", 9);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PageRoll pageRoll = newsManager.getAllNews(category, pageNo, pageSize);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request.setAttribute("pageRoll", pageRoll);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return mapping.findForward("news.list");<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
&nbsp;</p>
<p><br />
二：方法二实现BeanFactoryAware <br />
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 package com.anymusic.oa.commons.service;<br />
&nbsp;<br />
import org.springframework.beans.BeansException;<br />
import org.springframework.beans.factory.BeanFactory;<br />
import org.springframework.beans.factory.BeanFactoryAware;<br />
&nbsp;<br />
/**<br />
* Created by IntelliJ IDEA.<br />
* User: Weany<br />
* Date: 2006-4-2<br />
* Time: 2:46:51<br />
* To change this template use File | Settings | File Templates.<br />
*/<br />
public class ServiceLocator implements BeanFactoryAware {<br />
&nbsp;&nbsp;&nbsp; private static BeanFactory beanFactory = null;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; private static ServiceLocator servlocator = null;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; public void setBeanFactory(BeanFactory factory) throws BeansException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.beanFactory = factory;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; public BeanFactory getBeanFactory() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return beanFactory;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp; * 创建读取Bean服务类实例(从spring.xml中加载)<br />
&nbsp;&nbsp;&nbsp; * &lt;bean id="serviceLocator" class="com.am.oa.commons.service.ServiceLocator" singleton="true" /&gt;<br />
&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public static ServiceLocator getInstance() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (servlocator == null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; servlocator = (ServiceLocator) beanFactory.getBean("serviceLocator");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return servlocator;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp; * 根据提供的bean名称得到相应的服务类&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; * @param servName bean名称&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public static Object getService(String servName) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return beanFactory.getBean(servName);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp; * 根据提供的bean名称得到对应于指定类型的服务类<br />
&nbsp;&nbsp;&nbsp; * @param servName bean名称<br />
&nbsp;&nbsp;&nbsp; * @param clazz 返回的bean类型,若类型不匹配,将抛出异常<br />
&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public static Object getService(String servName, Class clazz) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return beanFactory.getBean(servName, clazz);<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
&nbsp;</p>
<p><br />
action调用: <br />
1234567891011121314151617181920212223242526272829303132333435363738 package com.anymusic.oa.webwork;<br />
&nbsp;<br />
import java.util.List;<br />
import java.util.Map;<br />
&nbsp;<br />
import javax.servlet.http.HttpServletRequest;<br />
&nbsp;<br />
import com.anymusic.oa.commons.service.ServiceLocator;<br />
import com.anymusic.oa.hibernate.pojo.Role;<br />
import com.anymusic.oa.hibernate.pojo.Users;<br />
import com.anymusic.oa.spring.IUserService;<br />
import com.opensymphony.webwork.ServletActionContext;<br />
import com.opensymphony.xwork.Action;<br />
import com.opensymphony.xwork.ActionContext;<br />
import com.opensymphony.xwork.ModelDriven;<br />
&nbsp;<br />
public class UserAction extends BaseAction implements Action,ModelDriven{<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; private Users user = new Users();<br />
&nbsp;&nbsp;&nbsp; protected ServiceLocator service = ServiceLocator.getInstance();<br />
&nbsp;&nbsp;&nbsp; UserService userService = (UserService)service.getService("userService");<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; public String execute() throws Exception {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return SUCCESS;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
&nbsp; public Object getModel() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return user;<br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public String getAllUser(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletRequest request = ServletActionContext.getRequest();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List ls=userService.LoadAllObject( Users.class );<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request.setAttribute("user",ls);&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.setUrl("/yonghu.jsp");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return SUCCESS;<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
&nbsp;</p>
<p><br />
三：方法三实现ApplicationContextAware </p>
<p>123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 package com.easou.framework.common.util;<br />
&nbsp;<br />
import org.springframework.beans.BeansException;<br />
import org.springframework.beans.factory.NoSuchBeanDefinitionException;<br />
import org.springframework.context.ApplicationContext;<br />
import org.springframework.context.ApplicationContextAware;<br />
&nbsp;<br />
public class SpringContextUtil implements ApplicationContextAware {<br />
&nbsp; private static ApplicationContext applicationContext;&nbsp;&nbsp;&nbsp;&nbsp; //Spring应用上下文环境<br />
&nbsp;<br />
&nbsp; /**<br />
&nbsp; * 实现ApplicationContextAware接口的回调方法，设置上下文环境&nbsp;&nbsp; <br />
&nbsp; * @param applicationContext<br />
&nbsp; * @throws BeansException<br />
&nbsp; */<br />
&nbsp; public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {<br />
&nbsp;&nbsp;&nbsp; SpringContextUtil.applicationContext = applicationContext;<br />
&nbsp; }<br />
&nbsp;<br />
&nbsp; /**<br />
&nbsp; * @return ApplicationContext<br />
&nbsp; */<br />
&nbsp; public static ApplicationContext getApplicationContext() {<br />
&nbsp;&nbsp;&nbsp; return applicationContext;<br />
&nbsp; }<br />
&nbsp;<br />
&nbsp; /**<br />
&nbsp; * 获取对象&nbsp;&nbsp; <br />
&nbsp; * @param name<br />
&nbsp; * @return Object 一个以所给名字注册的bean的实例<br />
&nbsp; * @throws BeansException<br />
&nbsp; */<br />
&nbsp; public static Object getBean(String name) throws BeansException {<br />
&nbsp;&nbsp;&nbsp; return applicationContext.getBean(name);<br />
&nbsp; }<br />
&nbsp;<br />
&nbsp; /**<br />
&nbsp; * 获取类型为requiredType的对象<br />
&nbsp; * 如果bean不能被类型转换，相应的异常将会被抛出（BeanNotOfRequiredTypeException）<br />
&nbsp; * @param name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bean注册名<br />
&nbsp; * @param requiredType 返回对象类型<br />
&nbsp; * @return Object 返回requiredType类型对象<br />
&nbsp; * @throws BeansException<br />
&nbsp; */<br />
&nbsp; public static Object getBean(String name, Class requiredType) throws BeansException {<br />
&nbsp;&nbsp;&nbsp; return applicationContext.getBean(name, requiredType);<br />
&nbsp; }<br />
&nbsp;<br />
&nbsp; /**<br />
&nbsp; * 如果BeanFactory包含一个与所给名称匹配的bean定义，则返回true <br />
&nbsp; * @param name<br />
&nbsp; * @return boolean<br />
&nbsp; */<br />
&nbsp; public static boolean containsBean(String name) {<br />
&nbsp;&nbsp;&nbsp; return applicationContext.containsBean(name);<br />
&nbsp; }<br />
&nbsp;<br />
&nbsp; /**<br />
&nbsp; * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。<br />
&nbsp; * 如果与给定名字相应的bean定义没有被找到，将会抛出一个异常（NoSuchBeanDefinitionException）&nbsp;&nbsp; <br />
&nbsp; * @param name<br />
&nbsp; * @return boolean<br />
&nbsp; * @throws NoSuchBeanDefinitionException<br />
&nbsp; */<br />
&nbsp; public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {<br />
&nbsp;&nbsp;&nbsp; return applicationContext.isSingleton(name);<br />
&nbsp; }<br />
&nbsp;<br />
&nbsp; /**<br />
&nbsp; * @param name<br />
&nbsp; * @return Class 注册对象的类型<br />
&nbsp; * @throws NoSuchBeanDefinitionException<br />
&nbsp; */<br />
&nbsp; public static Class getType(String name) throws NoSuchBeanDefinitionException {<br />
&nbsp;&nbsp;&nbsp; return applicationContext.getType(name);<br />
&nbsp; }<br />
&nbsp;<br />
&nbsp; /**<br />
&nbsp; * 如果给定的bean名字在bean定义中有别名，则返回这些别名&nbsp;&nbsp; <br />
&nbsp; * @param name<br />
&nbsp; * @return<br />
&nbsp; * @throws NoSuchBeanDefinitionException<br />
&nbsp; */<br />
&nbsp; public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {<br />
&nbsp;&nbsp;&nbsp; return applicationContext.getAliases(name);<br />
&nbsp; }<br />
}<br />
&nbsp;</p>
<p>&nbsp;</p>
<p>action调用： <br />
1234567891011121314151617181920212223242526272829303132333435363738 package com.anymusic.oa.webwork;<br />
&nbsp;<br />
import java.util.List;<br />
import java.util.Map;<br />
&nbsp;<br />
import javax.servlet.http.HttpServletRequest;<br />
&nbsp;<br />
import com.anymusic.oa.commons.service.ServiceLocator;<br />
import com.anymusic.oa.hibernate.pojo.Role;<br />
import com.anymusic.oa.hibernate.pojo.Users;<br />
import com.anymusic.oa.spring.IUserService;<br />
import com.opensymphony.webwork.ServletActionContext;<br />
import com.opensymphony.xwork.Action;<br />
import com.opensymphony.xwork.ActionContext;<br />
import com.opensymphony.xwork.ModelDriven;<br />
&nbsp;<br />
public class UserAction extends BaseAction implements Action,ModelDriven{<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; private Users user = new Users();&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; UserService userService = (UserService) SpringContextUtil.getBean("userService");<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public String execute() throws Exception {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return SUCCESS;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
&nbsp; public Object getModel() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return user;<br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public String getAllUser(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletRequest request = ServletActionContext.getRequest();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List ls=userService.LoadAllObject( Users.class );<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request.setAttribute("user",ls);&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.setUrl("/yonghu.jsp");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return SUCCESS;<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
&nbsp;</p>
<p><br />
本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/d8111/archive/2008/08/31/2856601.aspx</p>
 <img src ="http://www.blogjava.net/jlin/aggbug/298269.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2009-10-14 18:01 <a href="http://www.blogjava.net/jlin/articles/298269.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java对象排序（转）</title><link>http://www.blogjava.net/jlin/articles/293760.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Thu, 03 Sep 2009 09:06:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/articles/293760.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/293760.html</wfw:comment><comments>http://www.blogjava.net/jlin/articles/293760.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/293760.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/293760.html</trackback:ping><description><![CDATA[<div class="tit">Java对象排序的3种实现方法</div>
<div class="date">2009-05-01 23:13</div>
<table style="table-layout: fixed; width: 100%">
    <tbody>
        <tr>
            <td>
            <div class="cnt" id="blog_text">/*** Java对象排序的3种实现方式*/
            <p><code>public class TestObjectSort {<br />
            /**<br />
            * @param args<br />
            */<br />
            public static void main(String[] args) {<br />
            // TODO Auto-generated method stub<br />
            </code>　/**方法1</p>
            <p><clk>* 使用 <nobr style="color: rgb(102,0,255); border-bottom: rgb(102,0,255) 1px dotted; background-color: transparent; text-decoration: underline"></nobr>Collections.sort(List, Comparator)实现，必须实现Comparator的一个比较器并复写compare() 方法<nobr style="color: rgb(102,0,255); border-bottom: rgb(102,0,255) 1px dotted; background-color: transparent; text-decoration: underline"></nobr></clk></p>
            <p>　　*/</p>
            <p><code>　　　　Person1[] ps = new Person1[]{new Person1("p0",0),<br />
            new Person1("p1",3),<br />
            new Person1("p2",5),<br />
            new Person1("p3",4),<br />
            new Person1("p4",8),<br />
            new Person1("p5",6),<br />
            new Person1("p6",7),<br />
            new Person1("p7",1),<br />
            new Person1("p8",2),<br />
            new Person1("p9",9)};<br />
            List&lt;Person1&gt; pl = new ArrayList&lt;Person1&gt;();<br />
            for(int i = 0; i &lt; 10; i++){<br />
            System.out.print(ps[i].getAge());<br />
            pl.add(ps[i]);<br />
            }<br />
            System.out.println("n使用Collections.sort(List, Comparator)类来比较：");<br />
            long l1 = System.currentTimeMillis();<br />
            Collections.sort(pl, new MyComparator());<br />
            System.out.println("time: " + (System.currentTimeMillis() - l1));<br />
            for(Iterator it = pl.iterator(); it.hasNext();){<br />
            Person1 p = (Person1) it.next();<br />
            System.out.print(p.getAge());<br />
            }</code></p>
            <p>/**方法2</p>
            <p><clk>* <nobr style="color: rgb(102,0,255); border-bottom: rgb(102,0,255) 1px dotted; background-color: transparent; text-decoration: underline"></nobr>使用Arrays.sort(Object[])实现,对象必须实现Comparable接口并复写compareTo() 方法<nobr style="color: rgb(102,0,255); border-bottom: rgb(102,0,255) 1px dotted; background-color: transparent; text-decoration: underline"></nobr></clk></p>
            <p>　　*/</p>
            <p><code>　　　　Person2[] ps2 = new Person2[]{new Person2("p0",0),<br />
            new Person2("p1",3),<br />
            new Person2("p2",5),<br />
            new Person2("p3",4),<br />
            new Person2("p4",8),<br />
            new Person2("p5",6),<br />
            new Person2("p6",7),<br />
            new Person2("p7",1),<br />
            new Person2("p8",2),<br />
            new Person2("p9",9)};<br />
            System.out.println("n使用Arrays.sort(Object[])类来比较：");<br />
            long l2 = System.currentTimeMillis();<br />
            Arrays.sort(ps2);<br />
            System.out.println("time: " + (System.currentTimeMillis() - l2));<br />
            <br />
            for(int i = 0; i &lt; 10; i++){<br />
            System.out.print(ps2[i].getAge());<br />
            }<br />
            </code>　　　　/**方法3</p>
            <p>　　* 使用Collections.sort(List)实现，对象必须实现Comparable接口并复写compareTo()方法</p>
            <p>　　*/</p>
            <p><code>　　　　Person2[] ps3 = new Person2[]{new Person2("p0",0),<br />
            new Person2("p1",3),<br />
            new Person2("p2",5),<br />
            new Person2("p3",4),<br />
            new Person2("p4",8),<br />
            new Person2("p5",6),<br />
            new Person2("p6",7),<br />
            new Person2("p7",1),<br />
            new Person2("p8",2),<br />
            new Person2("p9",9)};<br />
            List&lt;Person2&gt; pl3 = new ArrayList&lt;Person2&gt;();<br />
            for(int i = 0; i &lt; 10; i++){<br />
            pl3.add(ps3[i]);<br />
            }<br />
            System.out.println("n使用Collections.sort(List)类来比较：");<br />
            Collections.sort(pl3);<br />
            for(Iterator it = pl3.iterator(); it.hasNext();){<br />
            Person2 p = (Person2) it.next();<br />
            System.out.print(p.getAge());<br />
            }<br />
            }<br />
            }<br />
            </code>/**　* 方法1需要</p>
            <p>　　*/</p>
            <p><code>class MyComparator implements Comparator{<br />
            public int compare(Object o1, Object o2){<br />
            Person1 p1 = (Person1)o1;<br />
            Person1 p2 = (Person1)o2;<br />
            if(p1.getAge() &lt; p2.getAge()){<br />
            return -1;<br />
            }else if(p1.getAge() == p2.getAge()){<br />
            return 0;<br />
            }else{<br />
            return 1;<br />
            }<br />
            }<br />
            <br />
            }</code></p>
            <p>　　/**</p>
            <p>　　* 方法1需要</p>
            <p>　　*/</p>
            <p><code>class Person1{<br />
            private String name;<br />
            private int age;<br />
            <br />
            public Person1(){}<br />
            public Person1(String name, int age) {<br />
            super();<br />
            this.name = name;<br />
            this.age = age;<br />
            }<br />
            public String getName() {<br />
            return name;<br />
            }<br />
            public void setName(String name) {<br />
            this.name = name;<br />
            }<br />
            public int getAge() {<br />
            return age;<br />
            }<br />
            public void setAge(int age) {<br />
            this.age = age;<br />
            }<br />
            <br />
            }<br />
            </code>/**</p>
            <p><clk>*方法 <nobr style="color: rgb(102,0,255); border-bottom: rgb(102,0,255) 1px dotted; background-color: transparent; text-decoration: underline"></nobr>2,3需要</clk></p>
            <p>　　*/</p>
            <p><code>class Person2 implements Comparable{<br />
            private String name;<br />
            private int age;<br />
            <br />
            public Person2(){}<br />
            public Person2(String name, int age) {<br />
            super();<br />
            this.name = name;<br />
            this.age = age;<br />
            }<br />
            public String getName() {<br />
            return name;<br />
            }<br />
            public void setName(String name) {<br />
            this.name = name;<br />
            }<br />
            public int getAge() {<br />
            return age;<br />
            }<br />
            public void setAge(int age) {<br />
            this.age = age;<br />
            }<br />
            <br />
            public int compareTo(Object o){<br />
            Person2 p = (Person2)o;<br />
            if(this.age &lt; p.age){<br />
            return -1;<br />
            }else if(this.age == p.age){<br />
            return 0;<br />
            }else{<br />
            return 1;<br />
            }<br />
            }<br />
            </code></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/jlin/aggbug/293760.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2009-09-03 17:06 <a href="http://www.blogjava.net/jlin/articles/293760.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jcom打印</title><link>http://www.blogjava.net/jlin/articles/265783.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Wed, 15 Apr 2009 08:36:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/articles/265783.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/265783.html</wfw:comment><comments>http://www.blogjava.net/jlin/articles/265783.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/265783.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/265783.html</trackback:ping><description><![CDATA[<p>jcom打印 <a href="/Files/jlin/jcom224.rar">/Files/jlin/jcom224.rar</a><br />
</p>
<h2>Setup</h2>
<p>Extract "jcom222.zip". And copy jcom.jar and jcom.dll to the following directories <br />
jcom.dll -&gt; (java.home)/bin/<br />
jcom.jar -&gt; (java.home)/lib/ext/<br />
make sure the JAVA_HOME evironmental variable has been set, ie. <br />
(java.home) == java.lang.System.getProperty("java.home"); </p>
<p>import jp.ne.so_net.ga2.no_ji.jcom.ReleaseManager;<br />
import jp.ne.so_net.ga2.no_ji.jcom.excel8.ExcelApplication;<br />
import jp.ne.so_net.ga2.no_ji.jcom.excel8.ExcelWorkbook;<br />
import jp.ne.so_net.ga2.no_ji.jcom.excel8.ExcelWorkbooks;<br />
import jp.ne.so_net.ga2.no_ji.jcom.excel8.ExcelWorksheet;</p>
<p>public class JCom {</p>
<p>&nbsp;public boolean print(String fname) {<br />
&nbsp;&nbsp;ReleaseManager rm = new ReleaseManager();<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;ExcelApplication excel = new ExcelApplication(rm);</p>
<p>&nbsp;&nbsp;&nbsp;ExcelWorkbooks xlBooks = excel.Workbooks();<br />
&nbsp;&nbsp;&nbsp;ExcelWorkbook xlBook = xlBooks.Open(fname);<br />
&nbsp;&nbsp;&nbsp;ExcelWorksheet xlSheet = excel.ActiveSheet();</p>
<p>&nbsp;&nbsp;&nbsp;xlSheet.PrintOut();</p>
<p>&nbsp;&nbsp;&nbsp;xlBook.Close(false, null, false);<br />
&nbsp;&nbsp;&nbsp;excel.Quit();<br />
&nbsp;&nbsp;} catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;return false;<br />
&nbsp;&nbsp;} finally {<br />
&nbsp;&nbsp;&nbsp;rm.release();<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return true;<br />
&nbsp;}</p>
<p>&nbsp;public static void main(String[] args) {<br />
&nbsp;&nbsp;JCom test = new JCom();</p>
<p>&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;//test.p<br />
&nbsp;&nbsp;&nbsp;test.print("d:/test.xls");<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;} catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
}<br />
</p>
<img src ="http://www.blogjava.net/jlin/aggbug/265783.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2009-04-15 16:36 <a href="http://www.blogjava.net/jlin/articles/265783.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java编程思想学习心得</title><link>http://www.blogjava.net/jlin/articles/245828.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Fri, 12 Dec 2008 00:59:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/articles/245828.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/245828.html</wfw:comment><comments>http://www.blogjava.net/jlin/articles/245828.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/245828.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/245828.html</trackback:ping><description><![CDATA[<p>Java编程思想学习心得<br />
-----------------------------------------------------------------------------------<br />
2008-12-4<br />
1.java对象存储在栈中基本类型存储在堆栈中<br />
2.作为一个类的成员使用时，java才确保给定其默认值。（局部变量不是适应）<br />
3.javadoc命令只能始于/** ...*/&nbsp; 为public和protected成员进行文档注释，<br />
private和&#8220;包内可访问成员&#8221;的注释会被忽略掉，但是可以用-private标记来输出。<br />
4.关系操作符==和!=适应所有的对象，但是他们比较对象的引用是不是相同，如果要比较对象的内容<br />
是否相等的话要用equals()方法，如果自己没有改写这个方法的话，还是比较对象的引用。<br />
5.for(int i=0,j=0;i&lt;10&amp;&amp;j!=11;i++,j++),只有for循环才具备在控制表达式里定义变量的能力。其他<br />
任何条件或循环语句，都不可以采用这种方法。<br />
------------------------------------------------------------------------------------------------<br />
2008-12-5<br />
1.this:关键字的作用。返回本对象的引用，在构造器中调用构造器。<br />
2.将所有的对象放于String表达式之中，就可以轻易的将他们强制转换为String的表达形式。<br />
3.如果编译单元完全不带public类也是可能的，在这种情况下，你可以随意对文件命名。<br />
4.请注意，类既不可以是private的，也不可以是protected的。所以对于类的访问权限，你仅有两个选择：<br />
包访问权或者是public。（内部类可以是private或是protected的，这是特例。）<br />
5.Java允许生成空白final，是指被声明为final但又未给定初值的数据成员。<br />
如：private final int j;//Blank final 你必须在构造方法中对此final进行赋值。<br />
类中所有的private方法读被隐含是final的。(你可以对private方法增加final修饰符，但这是无意义的。)<br />
6.只有非private方法才可以被重载，但是我们要密切注意重载private方法的现象，虽然编译不会出错，但是<br />
不回按我们所期望的来执行。在子类中，对于基类中的private方法，我们最好用一个不同的名字。<br />
------------------------------------------------------------------------------------------------<br />
2008-12-8 <br />
内部类的特性：将一个类的定义放到另一个类的定义内部。<br />
&nbsp; 1.如果你想从外部类的非静态方法之外的任意位置创建某个内部类对象你必须象main()方法中的那样，具体地<br />
&nbsp; 指明这个对象的类型：OuterClassName.InnerClassName。<br />
&nbsp; 2.可以创建继承接口的内部匿名类对象。<br />
嵌套类：如果你不需要内部类对象与其外围类对象之间的联系，你可以将内部类声明为static。<br />
&nbsp; 普通的内部类对象隐含地保存了一个引用，指向它的外围类对象。然而，当内部类为static时，情况就不一样了<br />
&nbsp; 嵌套类以为着：<br />
&nbsp; a. 要创建嵌套类对象，并不需要起外围类的对象。<br />
&nbsp; b.不能从嵌套类的对象中访问非静态的外围类对象。<br />
&nbsp; c.普通内部类的属性与方法，只能放在类的外部层次上，所以普通的内部类不能有static数据和static属性，也不&nbsp; 能包含嵌套类。<br />
局部类部类：在代码块里创建的内部类，局部内部类不能有访问说明符，它可以访问当前代码块内的常量，和次外围类所有的成员。<br />
每个内部类都能独立地继承自一个（接口）实现，所以无论外围类是否已经继承了某个实现，对于内部类都无影响。<br />
------------------------------------------------------------------------------------------------<br />
2008-12-9 <br />
1.重新抛出异常会把异常抛给上一级环境中的异常处理程序。同一个try块的后续catch字句将被忽略。此外，异常对象的所有信息读得以保持，高一级环境中捕获次异常的处理程序可以从这里的异常对象中得到所有信息。<br />
2.异常链：捕获一个异常然后抛出另有个异常，并且希望把原始异常的信息保存下来。<br />
3.一个出现在基类方法中的异常说明中的异常，不一定回出现在派生类方法的异常说明里，这点同继承的规则不同在继承中，基类的方法必须出现在派生类里，在继承和重载过程中，方法的&#8220;异常说明的接口&#8221;不是变大了而是变小了。<br />
4.当你重写方法时，你只能抛出在父类方法的异常说明里列出的那些异常。因为这样的话，对父类能工作的代码应用到字类对象的时候，一样能工作（这是面向对象的基本概念），异常也不例外。<br />
------------------------------------------------------------------------------------------------<br />
2008-12-10 <br />
复制数组：用System.arraycopy()，比用for循环复制要快很多。<br />
Java提供两种比较功能：<br />
1.实现java.lang.Comparable接口。<br />
2.实现java.util.comparator接口。<br />
collection：一组独立的元素。<br />
map：一组成对的键值对(key-value)对象<br />
容器的缺点：未知类型。容器只保存object型的引用。<br />
List：保证维护元素特定的顺序。<br />
ArrayList:数组实现的list，允许对元素进行快速随机访问，但是向list中间插入与移除元素很慢。<br />
LinkedList:双向链表实现，向list中间插入与移除元素很快，随机访问则相对较慢。<br />
Set:不保存重复的元素。每个元素都上唯一的，不保证元素的次序。<br />
HashSet:为快速查找设计的set，存入Hashset的对象必须定义了hashCode().<br />
TreeSet:保持次序的Set,底层为数结构。使用它可以从Set中提取有序的序列。<br />
LinkedHashSet：具有HashSet的查询速度，内部使用链表维护元素的顺序，在使用迭代器遍历Set时，<br />
结果会按元素插入的次序显示。<br />
------------------------------------------------------------------------------------------------<br />
正确的equals()方法必须满足下列5个条件。<br />
1.自反性：对任意的x，x.equals(x)一定返回true。<br />
2.对称性：对于任意的x，y，若y.equals(x)为true，则x.equals(y)也为ture。<br />
3.传递性：对于任何非空引用值 x、y 和 z，如果 x.equals(y) 返回 true，并且 y.equals(z) 返回 true，那么 x.equals(z) 应返回 true。 <br />
4.一致性：对于任何非空引用值 x 和 y，多次调用 x.equals(y) 始终返回 true 或始终返回 false，前提是对象上 equals 比较中所用的信息没有被修改。 <br />
5.对于任何非空引用值 x，x.equals(null) 都应返回 false。 <br />
------------------------------------------------------------------------------------------------<br />
2008-12-11<br />
1.匿名内部类既可以实现一个接口，又可以继承类(具体类或者抽象类)。<br />
2.如果定义一个匿名内部类，它要访问在它外部定义的一个变量，这个变量必须使用final关键字来修饰。<br />
如下面的例子:</p>
<p>import java.io.File;<br />
import java.io.FilenameFilter;<br />
import java.util.regex.Pattern;</p>
<p>/**<br />
&nbsp;* @author lin<br />
&nbsp;*<br />
&nbsp;*/<br />
public class DirList {<br />
&nbsp;&nbsp; //not using final in anonymous inner class<br />
&nbsp;&nbsp; public static FilenameFilter filter(final String regex){//<span style="color: red">注意此处的 final</span><br />
&nbsp;&nbsp;&nbsp; return new FilenameFilter(){<br />
&nbsp;&nbsp;private Pattern pattern = Pattern.compile(regex);<br />
&nbsp;&nbsp;public boolean accept(File dir, String name) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp; pattern.matcher(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;new File(name).getName()).matches();<br />
&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; };<br />
&nbsp;&nbsp; }<br />
&nbsp;/**<br />
&nbsp; * @param args<br />
&nbsp; */<br />
&nbsp;public static void main(String[] args) {<br />
&nbsp;&nbsp;File path = new File(".");<br />
&nbsp;&nbsp;String [] list;<br />
&nbsp;&nbsp;if(args.length==0)<br />
&nbsp;&nbsp;&nbsp;list=path.list();<br />
&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;list=path.list(filter(args[0]));<br />
&nbsp;&nbsp;for(int i=0;i&lt;list.length;i++)<br />
&nbsp;&nbsp;&nbsp;System.out.println(list[i]);<br />
&nbsp;}<br />
}</p>
<p><br />
&nbsp;<br />
</p>
<img src ="http://www.blogjava.net/jlin/aggbug/245828.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2008-12-12 08:59 <a href="http://www.blogjava.net/jlin/articles/245828.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java测试题库_Basic2.doc</title><link>http://www.blogjava.net/jlin/articles/233714.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Sat, 11 Oct 2008 02:37:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/articles/233714.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/233714.html</wfw:comment><comments>http://www.blogjava.net/jlin/articles/233714.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/233714.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/233714.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;<a href='http://www.blogjava.net/jlin/articles/233714.html'>阅读全文</a><img src ="http://www.blogjava.net/jlin/aggbug/233714.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2008-10-11 10:37 <a href="http://www.blogjava.net/jlin/articles/233714.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java classpath及package的一点操作（转）</title><link>http://www.blogjava.net/jlin/articles/233381.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Thu, 09 Oct 2008 08:19:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/articles/233381.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/233381.html</wfw:comment><comments>http://www.blogjava.net/jlin/articles/233381.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/233381.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/233381.html</trackback:ping><description><![CDATA[在C盘的根目录中新建一个子目录，名为&#8220;JavaTest&#8221;，以作为存放Java源代码的地方。打开XP中的记事本，先将其保存到JavaTest文件夹中，在&#8220;文件名&#8221;文本框中输入"Hello.java"。注意，在文件名的前后各加上一个双引号，否则，记事本就会将其存为"Hello.java.txt"的文本文件。然后输入以下代码： <br />
public&nbsp;class&nbsp;Hello&nbsp;{<br />
&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Hello,&nbsp;world");<br />
&nbsp;&nbsp;}<br />
}&nbsp;<br />
再次保存文件。<br />
在命令行窗口中输入<br />
cd&nbsp;C:\JavaTest<br />
将当前路径转入JavaTest中。然后，输入<br />
javac&nbsp;Hello.java<br />
由于我们是在源代码的当前路径下编译，因此，不会出现classpath设置有误的问题。<br />
在命令行窗口中输入java&nbsp;Hello，屏幕出现了<br />
Hello&nbsp;world<br />
因此一切正常。下面我们开始人为地将问题复杂化，在非当前工作路径中编译及运行，看看结果如何。<br />
在命令行窗口中输入<br />
cd&nbsp;C:<br />
转入到C盘根目录上，当前路径离开了存放源码的工作区。输入<br />
<clk><nobr oncontextmenu="return false" onmousemove="kwM(0)" id="clickeyekey0" onmouseover="kwE(event,0, this)" style="color: #6600ff; border-bottom: #6600ff 1px dotted; background-color: transparent; text-decoration: underline" onclick="kwC(event,0)" onmouseout="kwL(event,this)">java</nobr>c&nbsp;Hello.java</clk><br />
屏幕出现：<br />
error:&nbsp;cannot&nbsp;read:&nbsp;Hello.java<br />
1&nbsp;error<br />
找不到Hello.java了。我们要给它指定一个路径，告诉它到C:\JavaTest去找Hello.java文件。输入<br />
javac&nbsp;C:\JavaTest\Hello.java<br />
OK，这回不报错了，编译成功。<br />
输入<br />
java&nbsp;C:\JavaTest\Hello<br />
这回屏幕出现：<br />
Exception&nbsp;in&nbsp;thread&nbsp;"main"&nbsp;java.lang.NoClassDefFoundError:&nbsp;C:\JavaTest\Hello<br />
&nbsp;&nbsp; 意思为在&#8220;C:\JavaTest\Hello&#8221;找不到类的定义。明明C:\JavaTest\Hello是一个.class文件，为什么就找不到呢？原来，Java对待.java文件与.class文件是有区别的。对.java文件可以直接指定路径给它，而java命令所需的.class文件不能出现扩展名，也不能指定额外的路径给它。<br />
那么，如何指定路径呢？对于Java所需的.class文件，必须通过classpath来指定。<br />
&nbsp; &nbsp;依照第5步，弹出&#8220;环境变量&#8221;窗口，在用户变量中新建一个变量，变量名为&#8220;classpath&#8221;，变量值为"C:\JavaTest"。一路按&#8220;确定&#8221;退出。关闭原命令行窗口，打开新的命令行窗口，输入<br />
java&nbsp;Hello<br />
&#8220;Hello&nbsp;world&#8221;出来了。由此可见，在&#8220;环境变量&#8221;窗口中设置classpath的目的就是告诉JDK，到哪里去寻找.class文件。这种方法一旦设置好，以后每次运行java或javac时，在需要调用.class文件时，JDK都会自动地来到这里寻找。因此，这是一个全局性的设置。<br />
<br />
&nbsp; &nbsp;除了这种在环境变量&#8221;窗口中设置classpath的方法之外，还有另一种方法，即在java命令后面加上一个选项classpath，紧跟着不带扩展名的class文件名。例如，<br />
java&nbsp;-classpath&nbsp;C:\JavaTest&nbsp;Hello<br />
&nbsp;&nbsp;&nbsp; JDK遇到这种情况时，先根据命令行中的classpath选项中指定的路径去寻找.class文件，找不到时再到全局的classpath环境变量中去寻找。这种情况下，即使是没有设置全局的classpath环境变量，由于已经在命令行中正确地指定类路径，也可以运行。<br />
&nbsp;&nbsp;&nbsp; 为了在下面的例子中更好地演示classpath的问题，我们先将全局的classpath环境变量删除，而在必要时代之以命令行选项-classpath。弹出&#8220;环境变量&#8221;窗口，选中&#8220;classpath&#8221;的变量名，按&#8220;删除&#8221;键。<br />
&nbsp;&nbsp;&nbsp; 此外，java命令中还可以用cp，即classpath的缩写来代替classpath，如java&nbsp;-cp&nbsp;C:\JavaTest&nbsp;Hello。特别注意的是，JDK&nbsp;1.5.0之前，javac命令不能用cp来代替classpath，而只能用classpath。而在JDK&nbsp;1.5.0中，java及javac都可以使用cp及classpath。因此，为保持一致，建议一概使用classpath作为选项名称。<br />
<br />
&nbsp; 我们再次人为地复杂化问题。关闭正在编辑Hello.java的记事本，然后将JavaTest文件夹名称改为带空格的&#8220;Java&nbsp;Test&#8221;。在命令行中输入<br />
javac&nbsp;C:\Java&nbsp;Test\Hello.java<br />
长长的洋文又出来了，但这回却是报错了：<br />
javac:&nbsp;invalid&nbsp;flag:&nbsp;C:\Java<br />
&nbsp;&nbsp;&nbsp; JDK将带有空格的C:\Java&nbsp;Test分隔为两部分"C:\Java"及"Test\Hello.java"，并将C:\Java视作为一个无效的选项了。这种情况下，我们需要将整个路径都加上双引号，即<br />
javac&nbsp;"C:\Java&nbsp;Test\Hello.java"<br />
这回JDK知道，引号里面的是一个完整的路径，因此就不会报错了。同样，对java命令也需要如此，即<br />
java&nbsp;-classpath&nbsp;"C:\Java&nbsp;Test"&nbsp;Hello<br />
&nbsp;&nbsp;&nbsp; 对于长文件名及中文的文件夹，XP下面可以不加双引号。但一般来说，加双引号不容易出错，也容易理解，因此，建议在classpath选项中使用双引号。&nbsp;&nbsp; 我们再来看.java文件使用了其他类的情况。在C:\Java&nbsp;Test中新建一个Person.java文件，内容如下：<br />
&nbsp;&nbsp; public&nbsp;class&nbsp;Person&nbsp;{<br />
&nbsp;&nbsp; private&nbsp;String&nbsp;name;<br />
&nbsp;&nbsp; public&nbsp;Person(String&nbsp;name)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;this.name&nbsp;=&nbsp;name;<br />
&nbsp;&nbsp; }<br />
&nbsp; &nbsp;public&nbsp;String&nbsp;getName()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;name;<br />
&nbsp;&nbsp; }<br />
&nbsp;}<br />
然后，修改Hello.java，内容如下：<br />
public&nbsp;class&nbsp;Hello&nbsp;{<br />
&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Person&nbsp;person&nbsp;=&nbsp;new&nbsp;Person("Mike");<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(person.getName());<br />
&nbsp;&nbsp;}<br />
}&nbsp;<br />
在命令行输入<br />
javac&nbsp;"C:\Java&nbsp;Test\Hello.java"<br />
错误来了：<br />
C:\Java&nbsp;Test\Hello.java:3:&nbsp;cannot&nbsp;find&nbsp;symbol<br />
symbol:&nbsp;class&nbsp;Person<br />
JDK提示找不到Person类。为什么<nobr oncontextmenu="return false" onmousemove="kwM(0)" id="clickeyekey0" onmouseover="kwE(event,0, this)" style="color: #6600ff; border-bottom: #6600ff 1px dotted; background-color: transparent; text-decoration: underline" onclick="kwC(event,0)" onmouseout="kwL(event,this)">java</nobr>c&nbsp;"C:\Java&nbsp;Test\Hello.java"在第14步中可行，而在这里却不行了呢？第14步中的Hello.java文件并没有用来其他类，因此，JDK不需要去寻找其他类，而到了这里，我们修改了Hello.java，让其使用了一个Person类。</clk>&nbsp;&nbsp;根据第11步，我们需要告诉JDK，到哪里去找所用到的类，即使这个被使用的类就与Hello.java一起，同在C:\Java&nbsp;Test下面！输入<br />
javac&nbsp;-classpath&nbsp;"C:\Java&nbsp;Test"&nbsp;"C:\Java&nbsp;Test\Hello.java"<br />
编译通过，JDK在C:\Java&nbsp;Test文件夹下同时生成了Hello.class及Person.class两个文件。实际上，由于Hello.java使用了Person.java类，JDK先编译生成了Person.class，然后再编译生成Hello.class。因此，不管Hello.java这个主类使用了多少个其他类，只要编译这个类，JDK就会自动编译其他类，很方便。输入<br />
java&nbsp;-classpath&nbsp;"C:\Java&nbsp;Test"&nbsp;Hello<br />
屏幕出现了<br />
Mike<br />
成功。<br />
&nbsp;&nbsp; 说明了在Hello.java中如何使用一个我们自己创建的Person.java，而且这个类与Hello.java是同在一个文件夹下。在这一步中，我们将考查Person.java如果放在不同文件夹下面的情况。<br />
先将C:\Java&nbsp;Test文件夹下的Person.class文件删除，然后在C:\Java&nbsp;Test文件夹下新建一个名为DF的文件夹，并将C:\Java&nbsp;Test文件夹下的Person.java移动到其下面。在命令行输入<br />
<span style="color: red">javac&nbsp;-classpath&nbsp;"C:\Java&nbsp;Test\DF"&nbsp;"C:\Java&nbsp;Test\Hello.java" （注意这里不用；区分，用空格就可以！）</span><br />
编译通过。这时javac命令没有什么不同，只需将classpath改成C:\Java&nbsp;Test\DF就行了。<br />
在命令行输入<br />
java&nbsp;-classpath&nbsp;"C:\Java&nbsp;Test"&nbsp;Hello<br />
&nbsp;&nbsp;&nbsp; 这时由于Java需要找在不同文件夹下的两个.class文件，而命令行中只告诉JDK一个路径，即C:\Java&nbsp;Test，在此文件夹下，只能找到Hello.class，找不到Person.class文件，因此，错误是可以预料得到的：<br />
Exception&nbsp;in&nbsp;thread&nbsp;"main"&nbsp;java.lang.NoClassDefFoundError:&nbsp;Person<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;Hello.main(Hello.java:3)<br />
&nbsp;&nbsp;&nbsp; 果真找不到Person.class。<span style="color: red">在设置两个以上的classpath时，先将每个路径以双引号引起来，再将这些路径以&#8220;;&#8221;号隔开，并且每个路径与&#8220;;&#8221;之间不能带有空格。因此，我们在命令行重新输入：<br />
</span><span style="color: red">java&nbsp;-classpath&nbsp;"C:\Java&nbsp;Test";"C:\Java&nbsp;Test\DF"&nbsp;Hello</span><br />
&nbsp;&nbsp;&nbsp; 编译成功。但也暴露出一个问题，如果我们需要用到许多分处于不同文件夹下的类，那这个classpath的设置岂不是很长！有没有办法，对于一个文件夹下的所有.class文件，只指定这个文件夹的classpath，然后让JDK自动搜索此文件夹下面所有相应的路径？有，只要使用package。<br />
&nbsp;&nbsp;&nbsp; package简介。Java中引入package的概念，主要是为了<nobr oncontextmenu="return false" onmousemove="kwM(1)" id="clickeyekey1" onmouseover="kwE(event,1, this)" style="color: #6600ff; border-bottom: #6600ff 1px dotted; background-color: transparent; text-decoration: underline" onclick="kwC(event,1)" onmouseout="kwL(event,this)">解决</nobr>命名冲突的问题。比如说，在我们的例子中，我们设计了一个很简单的Person类，如果某人开发了一个类库，其中恰巧也有一个Person类，当我们使用这个类库时，两个Person类出现了命名冲突，JDK不知道我们到底要使用哪个Person类。更有甚者，当我们也开发了一个很庞大的类库，无可避免地，我们的类库中与其他人开发的类库中命名冲突的情况就会越来越多。总不能为了避免自己的类名与其他人开发的类名相同，而让每个编程人员都绞尽脑汁地将一个本应叫Writer的类强行改名为SarkuyaWriter，MikeWriter,&nbsp;SmithWriter吧？</clk><br />
&nbsp;&nbsp; 自定义package的名称可以由各个程序员自由创建。作为避免命名冲突的手段，package的名称最好足以与其他程序员的区别开来。在互联网上，每个域名都是唯一的，因此，Sun推荐将你自己的域名倒写后作为package的名称。如果你没有自己的域名，很可能只是因为囊中羞涩而不去申请罢了，并不见得你假想的域名与其他域名发生冲突。例如，笔者假想的域名是sarkuya.com，目前就是唯一的，因此我的package就可以定名为com.sarkuya。谢谢Java给了我们一个免费使用我们自己域名的机会，唯一的前提是倒着写。当然，每个package下面还可以带有不同的子package，如com.sarkuya.util，com.sarkuya.swing，等等。<br />
&nbsp;&nbsp;&nbsp;&nbsp;定义package的方式是在相应的.java文件的第一行加上&#8220;package&nbsp;packagename;&#8221;的字样，而且每个.java文件只能有一个package。实际上，Java中的package的实现是与计算机文件系统相结合的，即你有什么样的package，在<a href="http://www.pcdog.com/special/1118/index.html" target="_blank">硬盘</a>上就有什么样的存放路径。例如，某个类的package名为com.sarkuya.util，那么，这个类就应该必须存放在com/sarkuya/util的路径下面。至于这个com/sarkuya/util又是哪个文件夹的子路径，<br />
&nbsp;&nbsp;&nbsp; package除了有避免命名冲突的问题外，还引申出一个保护当前package下所有类文件的功能，主要通过为类定义几种可视度不同的修饰符来实现：public,&nbsp;protected,&nbsp;private,&nbsp;另外加上一个并不真实存在的friendly类型。<br />
<br />
&nbsp;&nbsp;&nbsp; 对于冠以public的类、类属变量及方法，包内及包外的任何类均可以访问；protected的类、类属变量及方法，包内的任何类，及包外的那些继承了此类的子类才能访问；private的类、类属变量及方法，包内包外的任何类均不能访问；如果一个类、类属变量及方法不以这三种修饰符来修饰，它就是friendly类型的，那么包内的任何类都可以访问它，而包外的任何类都不能访问它(包括包外继承了此类的子类)，因此，这种类、类属变量及方法对包内的其他类是友好的，开放的，而对包外的其他类是关闭的。<br />
<br />
&nbsp;&nbsp;&nbsp; 前面说过，package主要是为了解决命名冲突的问题，因此，处在不同的包里面的类根本不用担心与其他包的类名发生冲突，因为JDK在默认情况下只使用本包下面的类，对于其他包，JDK一概视而不见：&#8220;眼不见心不烦&#8221;。如果要引用其他包的类，就必须通过import来引入其他包中相应的类。只有在这时，JDK才会进行进一步的审查，即根据其他包中的这些类、类属变量及方法的可视度来审查是否符合使用要求。如果此审查通不过，编译就此卡住，直至你放弃使用这些类、类属变量及方法，或者将被引入的类、类属变量及方法的修饰符改为符合要求为止。如果此审查通过，JDK最后进行命名是否冲突的审查。如果发现命名冲突，你可以通过在代码中引用全名的方式来显式地引用相应的类，如使用<br />
java.util.Date&nbsp;=&nbsp;new&nbsp;java.util.Date()<br />
&nbsp; package的第三大作用是简化classpath的设置。还记上面的命令，这里重新引用其java命令：<br />
java&nbsp;-classpath&nbsp;"C:\Java&nbsp;Test";"C:\Java&nbsp;Test\DF"&nbsp;Hello<br />
<br />
&nbsp;&nbsp;&nbsp; 我们必须将所有的.class文件的路径一一告诉JDK，而不管DF其实就是C:\Java&nbsp;Test的子目录。如果要用到100个不同路径的.class文件，我们就得将classpath设置为一个特别长的字符串，很累。package的引入，很好地解决了这个问题。package的与classpath相结合，通过import指令为中介，将原来必须由classpath完成的类路径搜索功能，很巧妙地转移到import的身上，从而使classpath的设置简洁明了。我们先看下面的例子。<br />
&nbsp;先在Hello.java中导入DF.Person。代码修改如下：<br />
&nbsp; import&nbsp;DF.Person;<br />
&nbsp;public&nbsp;class&nbsp;Hello&nbsp;{<br />
&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Person&nbsp;person&nbsp;=&nbsp;new&nbsp;Person("Mike");<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(person.getName());<br />
&nbsp;&nbsp;}<br />
}&nbsp;<br />
再将DF子文件夹中的Person.java设置一个DF包。代码修改如下：<br />
package&nbsp;DF;<br />
public&nbsp;class&nbsp;Person&nbsp;{<br />
&nbsp;&nbsp;private&nbsp;String&nbsp;name;<br />
&nbsp;&nbsp;public&nbsp;Person(String&nbsp;name)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;this.name&nbsp;=&nbsp;name;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;public&nbsp;String&nbsp;getName()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;name;<br />
&nbsp;&nbsp;}<br />
}&nbsp;<br />
好了，神奇的命令行出现了：<br />
<br />
javac&nbsp;-classpath&nbsp;"C:\Java&nbsp;Test"&nbsp;"C:\Java&nbsp;Test\Hello.java"<br />
java&nbsp;-classpath&nbsp;"C:\Java&nbsp;Test"&nbsp;Hello<br />
（在我的jdk1.6上，没有设置classpath，上面的两条命令可以简化为：<br />
&nbsp;&nbsp; javac&nbsp;&nbsp;Hello.java<br />
&nbsp;&nbsp; java&nbsp;&nbsp; &nbsp;Hello<br />
&nbsp;呵呵，不知道是什么原因啊！<br />
）<br />
<br />
<img src ="http://www.blogjava.net/jlin/aggbug/233381.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2008-10-09 16:19 <a href="http://www.blogjava.net/jlin/articles/233381.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>