??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲精品福利网泷泽萝拉,亚洲日韩亚洲另类激情文学,夜夜春亚洲嫩草影院http://www.tkk7.com/jlin/category/12890.htmlzh-cnThu, 16 Jun 2016 21:24:10 GMTThu, 16 Jun 2016 21:24:10 GMT60Spring的事务管理入门:~程式事务管?TransactionTemplate)http://www.tkk7.com/jlin/articles/430921.htmlflyflyThu, 16 Jun 2016 01:55:00 GMThttp://www.tkk7.com/jlin/articles/430921.htmlhttp://www.tkk7.com/jlin/comments/430921.htmlhttp://www.tkk7.com/jlin/articles/430921.html#Feedback0http://www.tkk7.com/jlin/comments/commentRss/430921.htmlhttp://www.tkk7.com/jlin/services/trackbacks/430921.html阅读全文

fly 2016-06-16 09:55 发表评论
]]>
effective java-second edition http://www.tkk7.com/jlin/articles/398316.htmlflyflyTue, 23 Apr 2013 16:34:00 GMThttp://www.tkk7.com/jlin/articles/398316.htmlhttp://www.tkk7.com/jlin/comments/398316.htmlhttp://www.tkk7.com/jlin/articles/398316.html#Feedback0http://www.tkk7.com/jlin/comments/commentRss/398316.htmlhttp://www.tkk7.com/jlin/services/trackbacks/398316.html/Files/jlin/Effective_Java_2nd_Edition.pdf

fly 2013-04-24 00:34 发表评论
]]>
解决哈希QHASHQ冲H的主要ҎQ{Q?/title><link>http://www.tkk7.com/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.tkk7.com/jlin/articles/397724.html</guid><wfw:comment>http://www.tkk7.com/jlin/comments/397724.html</wfw:comment><comments>http://www.tkk7.com/jlin/articles/397724.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/jlin/comments/commentRss/397724.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/jlin/services/trackbacks/397724.html</trackback:ping><description><![CDATA[虽然我们不希望发生冲H,但实际上发生冲突的可能性仍是存在的。当关键字值域q大于哈希表的长度,而且事先q不知道关键字的具体取值时。冲H就隑օ会发 生。另外,当关键字的实际取值大于哈希表的长度时Q而且表中已装满了记录Q如果插入一个新记录Q不仅发生冲H,而且q会发生溢出。因此,处理冲突和溢出是 哈希技术中的两个重要问题?br /><strong>1、开攑֮址?/strong><br />     用开攑֮址法解军_H的做法是:当冲H发生时Q用某U探?亦称探测)技术在散列表中形成一个探??序列。沿此序列逐个单元地查找,直到扑ֈl定 的关键字Q或者碰C个开攄地址(卌地址单元为空)为止Q若要插入,在探查到开攄地址Q则可将待插入的新结点存地址单元Q。查找时探查到开攄 地址则表明表中无待查的关键字Q即查找p|?br />注意Q?br />①用开攑֮址法徏立散列表Ӟ前须表中所有单?更严格地_是指单元中存储的关键?|空?br />②I单元的表示与具体的应用相关?br />     按照形成探查序列的方法不同,可将开攑֮址法区分ؓU性探查法、线性补偿探法、随机探等?br />Q?Q线性探查法(Linear Probing)<br /><strong>该方法的基本思想是:</strong><br />    散列表T[0..m-1]看成是一个@环向量,若初始探查的地址为d(即h(key)=d)Q则最长的探查序列为:<br />        dQd+lQd+2Q?#8230;Qm-1Q?Q?Q?#8230;Qd-1<br />     ?探查时从地址d开始,首先探查T[d]Q然后依ơ探查T[d+1]Q?#8230;Q直到T[m-1]Q此后又循环到T[0]QT[1]Q?#8230;Q直到探查到T[d-1]为止?br /><strong>探查q程l止于三U情况:</strong><br />     (1)若当前探查的单元为空Q则表示查找p|Q若是插入则key写入其中Q;<br />    (2)若当前探查的单元中含有keyQ则查找成功Q但对于插入意味着p|Q?br />     (3)若探查到T[d-1]时仍未发现空单元也未扑ֈkeyQ则无论是查找还是插入均意味着p|(此时表满)?br /><strong>利用开攑֜址法的一般Ş式,U性探查法的探查序列ؓQ?/strong><br />        h<sub>i</sub>=(h(key)+i)Qm 0≤i≤m-1 //即d<sub>i</sub>=i<br /><strong>用线性探法处理冲突Q思\清晰Q算法简单,但存在下列缺点:</strong><br />① 处理溢出需另编E序。一般可另外讄一个溢Q专门用来存放上q哈希表中放不下的记录。此溢出表最单的l构是顺序表Q查找方法可用顺序查找?br />② 按上q算法徏立v来的哈希表,删除工作非常困难。假如要从哈希表 HT 中删除一个记录,按理应将q个记录所在位|置为空Q但我们不能q样做,而只能标上已被删除的标记Q否则,会影响以后的查找?br />③ U性探法很容易生堆聚现象。所谓堆聚现象,是存入哈希表的记录在表中连成一片。按照线性探法处理冲突Q如果生成哈希地址的连l序列愈?( 即不同关键字值的哈希地址盔R在一h?) Q则当新的记录加入该表时Q与q个序列发生冲突的可能性愈大。因此,哈希地址的较长连l序列比较短q箋序列生长得快Q这意味着Q一旦出现堆?( 伴随着冲突 ) Q就引赯一步的堆聚?br />Q?Q线性补偿探法 <br /><strong>U性补偿探法的基本思想是:</strong><br />线性探的步长?1 改ؓ Q Q即上q算法中?j Q?(j Q?1) % m 改ؓQ?j Q?(j Q?Q) % m Q而且要求 Q ?m 是互质的Q以便能探测到哈希表中的所有单元?br />【例?PDP-11 型计算Z的汇~程序所用的W合表,采用此Ҏ来解军_H,所用表?m Q?1321 Q选用 Q Q?25 ?br /><br />Q?Q随机探?<br /><strong>随机探测的基本思想是:</strong><br />线性探的步长从常数改为随机数Q即令: j Q?(j Q?RN) % m Q其?RN 是一个随机数。在实际E序中应预先用随机数发生器生一个随机序列,此序列作ؓ依次探测的步ѝ这样就能不同的关键字h不同的探次序,从而可以避 免或减少堆聚。基于与U性探法相同的理由,在线性补偿探法和随机探法中,删除一个记录后也要打上删除标记?br /><br /><strong>2、拉链法</strong><br />Q?Q拉链法解决冲突的方?br />     拉链法解军_H的做法是:所有关键字为同义词的结炚w接在同一个单链表中。若选定的散列表长度为mQ则可将散列表定义ؓ一个由m个头指针l成的指针数 lT[0..m-1]。凡是散列地址为i的结点,均插入到以T[i]为头指针的单链表中。T中各分量的初值均应ؓI指针。在拉链法中Q装填因?#945;可以大于 1Q但一般均?#945;≤1?br />【例】设?m Q?5 Q?H(K) Q?K mod 5 Q关键字值序?5 Q?21 Q?17 Q?9 Q?15 Q?36 Q?41 Q?24 Q按外链地址法所建立的哈希表如下图所C:<br />          <img src="http://sjjg.js.zwu.edu.cn/SFXX/sanlie/tupian/8.17.jpg" width="332" height="129" alt="" /> <br />Q?Q拉链法的优?br /><strong>与开攑֮址法相比,拉链法有如下几个优点Q?/strong><br />①拉链法处理冲H简单,且无堆积现象Q即非同义词决不会发生冲H,因此q_查找长度较短Q?br />②׃拉链法中各链表上的结点空间是动态申LQ故它更适合于造表前无法确定表长的情况Q?br />③开攑֮址法ؓ减少冲突Q要求装填因?#945;较小Q故当结点规模较大时会浪费很多空间。而拉链法中可?#945;≥1Q且l点较大Ӟ拉链法中增加的指针域可忽略不计,因此节省I间Q?br />④在用拉链法构造的散列表中Q删除结点的操作易于实现。只要简单地删去链表上相应的l点卛_。而对开攑֜址法构造的散列表,删除l点不能单地被删结 点的I间|ؓI,否则截断在它之后填人散列表的同义词l点的查找\径。这是因为各U开攑֜址法中Q空地址单元(卛_攑֜址)都是查找p|的条件。因此在 用开攑֜址法处理冲H的散列表上执行删除操作Q只能在被删l点上做删除标记Q而不能真正删除结炏V?br /><br />Q?Q拉链法的缺?br />     拉链法的~点是:指针需要额外的I间Q故当结点规模较时Q开攑֮址法较省空_而若节省的指针I间用来扩大散列表的规模Q可使装填因子变,q又减少了开攑֮址法中的冲H,从而提高^均查N度?<img src ="http://www.tkk7.com/jlin/aggbug/397724.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/jlin/" target="_blank">fly</a> 2013-04-12 00:14 <a href="http://www.tkk7.com/jlin/articles/397724.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入Java集合学习pdQHashMap的实现原理(转)http://www.tkk7.com/jlin/articles/397723.htmlflyflyThu, 11 Apr 2013 16:13:00 GMThttp://www.tkk7.com/jlin/articles/397723.htmlhttp://www.tkk7.com/jlin/comments/397723.htmlhttp://www.tkk7.com/jlin/articles/397723.html#Feedback0http://www.tkk7.com/jlin/comments/commentRss/397723.htmlhttp://www.tkk7.com/jlin/services/trackbacks/397723.html阅读全文

fly 2013-04-12 00:13 发表评论
]]>
Java 反射机制深入研究(?http://www.tkk7.com/jlin/articles/397205.htmlflyflySun, 31 Mar 2013 13:42:00 GMThttp://www.tkk7.com/jlin/articles/397205.htmlhttp://www.tkk7.com/jlin/comments/397205.htmlhttp://www.tkk7.com/jlin/articles/397205.html#Feedback0http://www.tkk7.com/jlin/comments/commentRss/397205.htmlhttp://www.tkk7.com/jlin/services/trackbacks/397205.html阅读全文

fly 2013-03-31 21:42 发表评论
]]>
Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPathQ(转)http://www.tkk7.com/jlin/articles/396935.htmlflyflySun, 24 Mar 2013 15:05:00 GMThttp://www.tkk7.com/jlin/articles/396935.htmlhttp://www.tkk7.com/jlin/comments/396935.htmlhttp://www.tkk7.com/jlin/articles/396935.html#Feedback0http://www.tkk7.com/jlin/comments/commentRss/396935.htmlhttp://www.tkk7.com/jlin/services/trackbacks/396935.html阅读全文

fly 2013-03-24 23:05 发表评论
]]>
常见~码列表http://www.tkk7.com/jlin/articles/370150.htmlflyflyThu, 16 Feb 2012 15:48:00 GMThttp://www.tkk7.com/jlin/articles/370150.htmlhttp://www.tkk7.com/jlin/comments/370150.htmlhttp://www.tkk7.com/jlin/articles/370150.html#Feedback0http://www.tkk7.com/jlin/comments/commentRss/370150.htmlhttp://www.tkk7.com/jlin/services/trackbacks/370150.html常见~码列表Q?br />8859_1           ISO 8859-1
8859_2           ISO 8859-2
8859_3           ISO 8859-3
8859_4           ISO 8859-4
8859_5           ISO 8859-5
8859_6           ISO 8859-6
8859_7           ISO 8859-7
8859_8           ISO 8859-8
8859_9           ISO 8859-9
Big5             Big5 码,J体中文
CNS11643         CNS 11643Q繁体中?br />Cp037            国、加拿大Q两U语aQ法语)、荷兰、葡萄牙、巴ѝ澳大利?br />Cp1006           IBM AIX 巴基斯坦Q乌都语)
Cp1025           IBM 多语U西里尔语:保加利亚、L斯尼?nbsp;、黑塞哥l那、马光 (FYR)
Cp1026           IBM Latin-5Q土耛_
Cp1046           IBM Open Edition US EBCDIC
Cp1097           IBM 伊朗QL斯语Q?波斯
Cp1098           IBM 伊朗QL斯语Q?波斯 (PC)
Cp1112           IBM 拉脱l亚Q立陶宛
Cp1122           IBM 爱沙g
Cp1123           IBM 乌克?br />Cp1124           IBM AIX 乌克?br />Cp1125           IBM 乌克?(PC)
Cp1250           Windows 东欧
Cp1251           Windows 斯拉夫语
Cp1252           Windows Latin-1
Cp1253           Windows 希腊
Cp1254           Windows 土耛_
Cp1255           Windows 希伯?br />Cp1256           Windows 阿拉?br />Cp1257           Windows 波罗的语
Cp1258           Windows 南?br />Cp1381           IBM OS/2, DOS 中华人民共和?(PRC)
Cp1383           IBM AIX 中华人民共和?(PRC)
Cp273            IBM 奥地利、d?br />Cp277            IBM 业w、挪?br />Cp278            IBM 芬兰、瑞?br />Cp280            IBM 意大?br />Cp284            IBM 加泰|尼亚语/西班牙、拉丁美z西班牙?br />Cp285            IBM 英国、爱兰
Cp297            IBM 法国
Cp33722          IBM-eucJP - 日语 (5050 的超?
Cp420            IBM 阿拉?br />Cp424            IBM 希伯?br />Cp437            MS-DOS 国、澳大利亚、新西兰、南?br />Cp500            EBCDIC 500V1
Cp737            PC 希腊
Cp775            PC 波罗的语
Cp838            IBM 泰国扩展 SBCS
Cp850            MS-DOS Latin-1
Cp852            MS-DOS Latin-2
Cp855            IBM 斯拉夫语
Cp857            IBM 土耛_?br />Cp860            MS-DOS 葡萄牙语
Cp861            MS-DOS 冰岛?br />Cp862            PC 希伯?br />Cp863            MS-DOS 加拿大法?br />Cp864            PC 阿拉伯语
Cp865            MS-DOS 日尔D
Cp866            MS-DOS 俄语
Cp868            MS-DOS 巴基斯坦?br />Cp869            IBM C希腊?br />Cp870            IBM 多语U?Latin-2
Cp871            IBM 冰岛?br />Cp874            IBM 泰国?br />Cp875            IBM 希腊?br />Cp918            IBM 巴基斯坦Q乌都语)
Cp921            IBM 拉脱l亚、立陶宛(AIX, DOS)
Cp922            IBM 爱沙g (AIX, DOS)
Cp930            ?4370 UDC 混合的日语,5026 的超?br />Cp933            ?1880 UDC 混合的韩文,5029 的超?br />Cp935            ?1880 UDC 混合的简体中文主机,5031 的超?
Cp937            ?6204 UDC 混合的繁体中文,5033 的超?br />Cp939            ?4370 UDC 混合的日语拉丁字母,5035 的超?br />Cp942            日语 (OS/2)Q?32 的超?
Cp948            OS/2 中文Q台湾)Q?38 集
Cp949            PC 韩文
Cp950            PC 中文Q香港、台湾)
Cp964            AIX 中文Q台湾)
Cp970            AIX 韩文
EUCJIS           JIS, EUC ~码、日?br />GB2312           GB2312, EUC ~码、简体中?br />GBK              GBK, 体中?br />ISO2022CN        ISO 2022 CN, 中文
ISO2022CN_CNS    ISO-2022-CN 形式?CNS 11643Q繁体中?
ISO2022CN_GB     ISO-2022-CN 形式?GB 2312Q简体中?br />ISO2022KR        ISO 2022 KR, 韩文
JIS              JIS, 日语
JIS0208          JIS 0208, 日语
KOI8_R           KOI8-R, 俄语
KSC5601          KS C 5601, 韩文
MS874            Windows 泰国?br />MacArabic        Macintosh 阿拉伯语
MacCentralEurope Macintosh Latin-2
MacCroatian      Macintosh 克罗C?br />MacCyrillic      Macintosh 斯拉夫语
MacDingbat       Macintosh Dingbat
MacGreek         Macintosh 希腊?br />MacHebrew        Macintosh 希伯p
MacIceland       Macintosh 冰岛?br />MacRoman         Macintosh |马?br />MacRomania       Macintosh |马g?br />MacSymbol        Macintosh W号
MacThai          Macintosh 泰国?br />MacTurkish       Macintosh 土耛_?br />MacUkraine       Macintosh 乌克兰语
SJIS             Shift-JIS, 日语
UTF8             UTF-8






fly 2012-02-16 23:48 发表评论
]]>
java字符串应用之字符串编码{?(?http://www.tkk7.com/jlin/articles/370143.htmlflyflyThu, 16 Feb 2012 12:48:00 GMThttp://www.tkk7.com/jlin/articles/370143.htmlhttp://www.tkk7.com/jlin/comments/370143.htmlhttp://www.tkk7.com/jlin/articles/370143.html#Feedback0http://www.tkk7.com/jlin/comments/commentRss/370143.htmlhttp://www.tkk7.com/jlin/services/trackbacks/370143.html阅读全文

fly 2012-02-16 20:48 发表评论
]]>
Java Code Conventionshttp://www.tkk7.com/jlin/articles/357534.htmlflyflyMon, 29 Aug 2011 15:52:00 GMThttp://www.tkk7.com/jlin/articles/357534.htmlhttp://www.tkk7.com/jlin/comments/357534.htmlhttp://www.tkk7.com/jlin/articles/357534.html#Feedback0http://www.tkk7.com/jlin/comments/commentRss/357534.htmlhttp://www.tkk7.com/jlin/services/trackbacks/357534.html阅读全文

fly 2011-08-29 23:52 发表评论
]]>
Java对象拯http://www.tkk7.com/jlin/articles/344218.htmlflyflySun, 13 Feb 2011 15:38:00 GMThttp://www.tkk7.com/jlin/articles/344218.htmlhttp://www.tkk7.com/jlin/comments/344218.htmlhttp://www.tkk7.com/jlin/articles/344218.html#Feedback0http://www.tkk7.com/jlin/comments/commentRss/344218.htmlhttp://www.tkk7.com/jlin/services/trackbacks/344218.htmlpackage com.lin.test;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ObjectClone {

 public static void main(String[] args) throws Exception,
   IllegalAccessException, Exception {

  Person jack = new Person("jack", 24, "hangzhou");
  Person brown = new Person("brown", 54, "hangzhou");
  jack.setFather(brown);
  brown.setArray(new String[]{"lin","feng"});
  String[] arr = { "lin", "fu" };
  jack.setArray(arr);
  Person lily = new Person();
  copyProperties(lily,jack);
   jack.getFather().setAddress("shanghai");
  jack.setAddress("test");

  System.out.println("jack" + jack.toString());
  System.out.println("lily" + lily.toString());

  System.out.println("jack.father:" + jack.getFather());
  System.out.println("lily.father:" + lily.getFather());

 }

 public static  void copyProperties(Object destObj,Object srcObj) throws Exception {
  // 取得拯对象的所有域
  Field[] fieldsBase = srcObj.getClass().getDeclaredFields();
  Field.setAccessible(fieldsBase, true);
  // 取得目标对象的所有域
  Field[] fieldsObj = destObj.getClass().getDeclaredFields();
  Field.setAccessible(fieldsObj, true);
  for (int i = 0; i < fieldsObj.length; i++) {
   // 取得域名U?br />    Field fieldObj = fieldsObj[i];
   for (int j = 0; j < fieldsBase.length; j++) {
    Field fieldBase = fieldsBase[j];
    // 比较两域名称是否一?br />     if (fieldObj.getName().equals(fieldBase.getName())) {
     // 取得域名Uƈ第一个字母大?br />      String fieldName = fieldObj.getName();
     String firstChar = fieldName.substring(0, 1).toUpperCase();
     fieldName = firstChar + fieldName.substring(1);
     // 取得目标对象中的setҎ
     Method methodObj = destObj.getClass().getMethod(
       "set" + fieldName,
       new Class[] { fieldObj.getType() });
     // 取得参照对象中的getҎ
     Method methodGet = srcObj.getClass().getMethod(
       "get" + fieldName, null);
     // 执行参照对象的getҎq取得返回?br />      Object resultObj = methodGet.invoke(srcObj, null);
     // 执行目标对象的setҎq进行设?br />      methodObj.invoke(destObj, new Object[] { resultObj });
     break;
    }
   }
  }
 }

 // 深层克隆Q主要利用一个递归调用
 public static Object cloneExt(Object obj) throws Exception {
  // getDeclaredFields得到object内定义的所有field
  Field[] fields = obj.getClass().getDeclaredFields();
  // 利用newInstanceҎQ生成一个空的Object
  Object newObj = obj.getClass().newInstance();
  for (int i = 0, j = fields.length; i < j; i++) {
   String propertyName = fields[i].getName();
   // field的?br />    Object propertyValue = getProperty(obj, propertyName);
   // field的类?br />    String propertyType = fields[i].getType().getName();
   if (propertyValue != null) {
    // 如果field不是8U基本类型,或者StringQ则直接赋?br />     if (propertyType.endsWith("String")
      || "char".equals(propertyType)
      || "int".equals(propertyType)
      || "boolean".equals(propertyType)
      || "byte".equals(propertyType)
      || "short".equals(propertyType)
      || "double".equals(propertyType)
      || "long".equals(propertyType)
      || "float".equals(propertyType)
      || "void".equals(propertyType)) {
     setProperty(newObj, propertyName, propertyValue);
    } else {
     // 如果fieldcd是其他ObjectQ则递归克隆一?br />      Object newPropObj = cloneExt(propertyValue);
     setProperty(newObj, propertyName, newPropObj);
    }
   }
  }
  return newObj;
 }

 // 层克隆
 public static Object clone(Object obj) throws Exception {
  Field[] fields = obj.getClass().getDeclaredFields();
  Object newObj = obj.getClass().newInstance();
  for (int i = 0, j = fields.length; i < j; i++) {
   String propertyName = fields[i].getName();
   Object propertyValue = getProperty(obj, propertyName);
   setProperty(newObj, propertyName, propertyValue);
  }
  return newObj;
 }

 // 反射调用setterҎQ进行赋?br />  private static Object setProperty(Object bean, String propertyName,
   Object value) {
  Class clazz = bean.getClass();
  try {
   Field field = clazz.getDeclaredField(propertyName);
   Method method = clazz.getDeclaredMethod(getSetterName(field
     .getName()), new Class[] { field.getType() });
   return method.invoke(bean, new Object[] { value });
  } catch (Exception e) {
  }
  return null;
 }

 // 反射调用getterҎQ得到field的?br />  private static Object getProperty(Object bean, String propertyName) {
  Class clazz = bean.getClass();
  try {
   Field field = clazz.getDeclaredField(propertyName);
   Method method = clazz.getDeclaredMethod(getGetterName(field
     .getName()), new Class[] {});
   return method.invoke(bean, new Object[] {});
  } catch (Exception e) {
  }
  return null;
 }

 // Ҏfield名,得到getterҎ?br />  private static String getGetterName(String propertyName) {
  String method = "get" + propertyName.substring(0, 1).toUpperCase()
    + propertyName.substring(1);
  return method;
 }

 // Ҏfield名,得到setterҎ?br />  private static String getSetterName(String propertyName) {
  String method = "set" + propertyName.substring(0, 1).toUpperCase()
    + propertyName.substring(1);
  return method;
 }
}

class Person {

 private String name;

 private int age;

 private String address;

 // 用于试深层克隆
 private Person father;

 private String array[] = null;

 public Person() {

 }

 public Person(String name, int age, String address) {
  this.name = name;
  this.address = address;
  this.age = age;
 }

 public Person(String name, int age, String address, Person father) {
  this.name = name;
  this.address = address;
  this.age = age;
  this.father = father;
 }

 // 所有的getterҎ和setterҎ要求都是publicQ且h一定的命名规则
 public String getAddress() {
  return address;
 }

 public void setAddress(String address) {
  this.address = address;
 }

 public int getAge() {
  return age;
 }

 public void setAge(int age) {
  this.age = age;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public Person getFather() {
  return father;
 }

 public void setFather(Person father) {
  this.father = father;
 }

 public String toString() {
  String sum = "";
  for (String s : array) {
   sum += " " + s;
  }
  return "{Name=" + name + ",Age=" + age + ",Address=" + address + sum
    + "}";
 }

 public String[] getArray() {
  return array;
 }

 public void setArray(String[] array) {
  this.array = array;
 }
}



fly 2011-02-13 23:38 发表评论
]]>
用JAVA来实现“生产者―消费者”问?/title><link>http://www.tkk7.com/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.tkk7.com/jlin/articles/334678.html</guid><wfw:comment>http://www.tkk7.com/jlin/comments/334678.html</wfw:comment><comments>http://www.tkk7.com/jlin/articles/334678.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/jlin/comments/commentRss/334678.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/jlin/services/trackbacks/334678.html</trackback:ping><description><![CDATA[生者和消费者问题是从操作系l中的许多实际同步问题中抽象出来的具?nbsp; <br /> 代表性的问题。它反映了操作系l中典型的同步例子?nbsp; <br />   生者进E?q程由多个线E组?生信息Q例如它可以是计进E。消?nbsp; <br /> 者进E用信息,它可以是输出打印q程。由于生产者和消费者彼此独立,且运  <br /> 行速度不确定,所以很可能出现生者已产生了信息而消费者却没有来得及接?nbsp; <br /> 信息q种情况。ؓ此,需要引入由一个或者若q个存储单元l成的时存储区Q?nbsp; <br /> 以便存放生者所产生的信息,qxq程间由于速度不确定所带来的问题。这?nbsp; <br /> 临时存储区叫做缓冲区Q通常用一l数l来表示?nbsp; <br />   ׃个或若干个存储单元组成的~冲区叫?#8220;有穷~冲?#8221;。下面我们来?nbsp; <br /> 析一下有IL冲的生者和消费者的例子?nbsp; <br />   假设有多个生产者和多个消费者,它们׃n一个具有n个存储单元的有穷~冲  <br /> 区Buffer(0……n-1)Q这是一个环形队列。其队尾指针Rear指向当前信息应存?nbsp; <br /> 的位|?Buffer[Rear])Q队首指针Front指向当前取出信息的位|?Buffer[front  <br /> ])。生产者进EL把信息存攑֜Buffer[Rear]中,消费者进E则L从Buffer  <br /> [Rear]中取Z息。如果想使生产者进E和消费者进E协调合作,则必M它们  <br /> 遵@如下规则:  <br />   1) 只要~冲区有存储单元Q生产者都可往其中存放信息Q当~冲区已满时Q?nbsp; <br /> 若Q意生产者提出写要求Q则都必ȝ待;  <br />   2) 只要~冲Z有消息可取,消费者都可从~冲Z取出消息Q当~冲Zؓ  <br /> I时Q若L消费者想取出信息Q则必须{待Q?nbsp; <br />   3) 生者们和消费者们不能同时诅R写~冲区?nbsp; <br />   用JAVA 实现“生者-消费?#8221;问题的代码如?  <br />   class MonitorTest{  <br />   static int produce_speed=200;  <br />   static int consume_speed=200;  <br />   public static void main (String [] args){  <br />    if(args.length>0)  <br />    produce_speed=Integer.parseInt(args[0]);  <br />    if(args.length>1)  <br />    consume_speed=Integer.parseInt(args[1]);  <br />    Monitor monitor=new Monitor();  <br />    new Producer(monitor,produce_speed);  <br />    new Consumer(monitor,consume_speed);  <br />    try{  <br />    Thread.sleep(4000);  <br />    }catch(InterruptedException e){}  <br />    System.exit(0);  <br />    }  <br />   }  <br /> <br />   class Monitor {  <br />    int Buffer_Length=10;  <br />    int[] Buffer=new int[Buffer_Length];  <br />    int Item;  <br />    int Count=0,Rear=0,Front=0;  <br />    //get buffer  <br />    synchronized int get(){  <br />    if(Count ==0)  <br />    try{  <br />    wait();  <br />    }catch(InterruptedException e){}  <br />    Item=Buffer[Front];  <br />    Count--;  <br />    Front=(Front+1)%Buffer_Length;  <br />    System.out.println("Got:"+Item);  <br />    notify();  <br />    return Item;  <br />   }  <br />   //set buffer  <br />   synchronized void set(int value){  <br />   if(Count==Buffer_Length)  <br />    try{  <br />    wait();  <br />    }catch(InterruptedException e){}  <br />    Buffer[Rear]=value;  <br />    Count++;  <br />    Rear=(Rear+1)%Buffer_Length;  <br />    System.out.println("Set:"+value);  <br />    notify();  <br />    }  <br />   }  <br /> <br />   class Producer implements Runnable{  <br />    Monitor monitor;  <br />    int speed;  <br />    Producer(Monitor monitor,int speed){  <br />    This.monitor=monitor;  <br />    This.speed=speed;  <br />    new Thread(this,"Producer").start();  <br />    }  <br />    public void run(){  <br />    int i=0;  <br />    while(true){  <br />    monitor.set(i++);  <br />    try{  <br />    Thread.sleep((int)(Math.random()*speed));  <br />    }catch(InterruptedException e){}  <br />    }  <br />    }  <br />   }  <br /> <br />   class Consumer implements Runnable{  <br />    Monitor monitor;  <br />    int speed;  <br />    Consumer(Monitor monitor,int speed){  <br />    This.monitor=monitor;  <br />    This.speed=speed;  <br />    new Thread(this,"Consumer").start();  <br />    }  <br />    public void run(){  <br />    while(true){  <br />    monitor.get();  <br />    try{  <br />    Thread.sleep((int) (Math.random()*speed));  <br />    }catch(InterruptedException e){}  <br />    }  <br />    }  <br />   }  <br /> --------------------------------------------------------------------------------------------------------------------------------<br /> Java example 实现的一中生产者和消费者的Q代码如下:<br /> <p>import java.util.Random;</p> <p>public class Consumer implements Runnable {<br />     private Drop drop;</p> <p>    public Consumer(Drop drop) {<br />         this.drop = drop;<br />     }</p> <p>    public void run() {<br />         Random random = new Random();<br />         for (String message = drop.take(); ! message.equals("DONE");<br />                 message = drop.take()) {<br />             System.out.format("MESSAGE RECEIVED: %s%n", message);<br />             try {<br />                 Thread.sleep(random.nextInt(5000));<br />             } catch (InterruptedException e) {}<br />         }<br />     }<br /> }</p> <p>import java.util.Random;</p> <p>public class Producer implements Runnable {<br />     private Drop drop;</p> <p>    public Producer(Drop drop) {<br />         this.drop = drop;<br />     }</p> <p>    public void run() {<br />         String importantInfo[] = {<br />             "Mares eat oats",<br />             "Does eat oats",<br />             "Little lambs eat ivy",<br />             "A kid will eat ivy too"<br />         };<br />         Random random = new Random();</p> <p>        for (int i = 0; i < importantInfo.length; i++) {<br />             drop.put(importantInfo[i]);<br />             try {<br />                 Thread.sleep(random.nextInt(5000));<br />             } catch (InterruptedException e) {}<br />         }<br />         drop.put("DONE");<br />     }<br /> }</p> <p>public class Drop {<br />     //Message sent from producer to consumer.<br />     private String message;<br />     //True if consumer should wait for producer to send message, false<br />     //if producer should wait for consumer to retrieve message.<br />     private boolean empty = true;</p> <p>    public synchronized String take() {<br />         //Wait until message is available.<br />         while (empty) {<br />             try {<br />                 wait();<br />             } catch (InterruptedException e) {}<br />         }<br />         //Toggle status.<br />         empty = true;<br />         //Notify producer that status has changed.<br />         notifyAll();<br />         return message;<br />     }</p> <p>    public synchronized void put(String message) {<br />         //Wait until message has been retrieved.<br />         while (!empty) {<br />             try { <br />                 wait();<br />             } catch (InterruptedException e) {}<br />         }<br />         //Toggle status.<br />         empty = false;<br />         //Store message.<br />         this.message = message;<br />         //Notify consumer that status has changed.<br />         notifyAll();<br />     }<br /> }       </p> public class ProducerConsumerExample {<br />     public static void main(String[] args) {<br />         Drop drop = new Drop();<br />         (new Thread(new Producer(drop))).start();<br />         (new Thread(new Consumer(drop))).start();<br />     }<br /> }<br /> <img src ="http://www.tkk7.com/jlin/aggbug/334678.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/jlin/" target="_blank">fly</a> 2010-10-12 17:06 <a href="http://www.tkk7.com/jlin/articles/334678.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HashMap遍历的两U方?/title><link>http://www.tkk7.com/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.tkk7.com/jlin/articles/331259.html</guid><wfw:comment>http://www.tkk7.com/jlin/comments/331259.html</wfw:comment><comments>http://www.tkk7.com/jlin/articles/331259.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/jlin/comments/commentRss/331259.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/jlin/services/trackbacks/331259.html</trackback:ping><description><![CDATA[<span style="color: red">W一U?</span> <br /> Map map = new HashMap(); <br /> Iterator iter = map.entrySet().iterator(); <br /> while (iter.hasNext()) { <br />     Map.Entry entry = (Map.Entry) iter.next(); <br />     Object key = entry.getKey(); <br />     Object val = entry.getValue(); <br /> } <br /> 效率?以后一定要使用此种方式Q?<br /> <span style="color: red">W二U?</span> <br /> Map map = new HashMap(); <br /> Iterator iter = map.keySet().iterator(); <br /> while (iter.hasNext()) { <br />     Object key = iter.next(); <br />     Object val = map.get(key); <br /> } <br /> 效率?以后量用! <br /> <br /> <span style="color: red">例:</span> <br /> HashMap的遍历有两种常用的方法,那就是用keyset及entryset来进行遍历,但两者的遍历速度是有差别的,下面L实例Q?<br /> <br /> public class HashMapTest { <br /> public static void main(String[] args) ...{ <br />   HashMap hashmap = new HashMap(); <br />   for (int i = 0; i < 100000; i ) ...{ <br />    hashmap.put("" i, "test"); <br />   } <br /> <br />   long bg = System.currentTimeMillis();<br />   Iterator iterator = hashmap.keySet().iterator();   <br />   while (iterator.hasNext()) {    <br />    System.out.print(hashmap.get(iterator.next())); <br />   } <br />   System.out.println(); <br />   System.out.println(System.currentTimeMillis()- bg); <br />   listHashMap(); <br /> } <br /> <br />   public static void listHashMap() ...{ <br />   java.util.HashMap hashmap = new java.util.HashMap(); <br />   for (int i = 0; i < 100000; i ) ...{ <br />    hashmap.put("" i, "test"); <br />   } <br />   long bg = System.currentTimeMillis();<br />   java.util.Iterator it = hashmap.entrySet().iterator(); <br />   while (it.hasNext()) ...{ <br />    java.util.Map.Entry entry = (java.util.Map.Entry) it.next(); <br />    // entry.getKey() q回与此对应的?<br />    // entry.getValue() q回与此对应的?<br />    System.out.print(entry.getValue()); <br />   } <br />   System.out.println(); <br />   System.out.println(System.currentTimeMillis() - bg); <br /> } <br /> } <br /> <br /> 对于keySet其实是遍历了2ơ,一ơ是转ؓiteratorQ一ơ就从hashmap中取出key所对于的value。而entryset只是遍历了第一ơ,他把key和value都放Centry中,所以就快了? <img src ="http://www.tkk7.com/jlin/aggbug/331259.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/jlin/" target="_blank">fly</a> 2010-09-06 23:33 <a href="http://www.tkk7.com/jlin/articles/331259.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java做的比较完善的FTPq接上传下蝲文g(?http://www.tkk7.com/jlin/articles/330605.htmlflyflyWed, 01 Sep 2010 10:30:00 GMThttp://www.tkk7.com/jlin/articles/330605.htmlhttp://www.tkk7.com/jlin/comments/330605.htmlhttp://www.tkk7.com/jlin/articles/330605.html#Feedback0http://www.tkk7.com/jlin/comments/commentRss/330605.htmlhttp://www.tkk7.com/jlin/services/trackbacks/330605.html


/*
*******************************************************************************************************

Filename: ftp.java
Author:   leetsing(elove)
Create date: 2004-08-30
Use:   connect to FTP server,then upload and download file
Modify date: 2004-09-05 add to upload file
  2004-09-13 add to download file
Copy right: Magisky Media Technology Co.,Ltd.

*******************************************************************************************************
*/
//import cz.dhl.io.*;
//import cz.dhl.ftp.*;
import sun.net.ftp.*;
import sun.net.*;
import java.applet.*;
import java.io.*;
import java.io.IOException;
import java.util.StringTokenizer;
import sun.net.ftp.FtpClient;
import java.util.ArrayList;

public class ftp extends Applet
{
FtpClient aftp;
DataOutputStream outputs ;
TelnetInputStream ins;
TelnetOutputStream outs;

int ch;
public String a;
String hostname=\"\";
private String path = \"/\";

public static void main(String[] args)
{
String hostname = \"192.168.0.56\";
int port = 2121;
String uid = \"lee\";
String pwd = \"lee\";
String RWFileDir = \"D:\\\\smsftp\\\\\";//文g目录

//q接ftp服务?br /> ftp ft = new ftp();
ft.connect(RWFileDir,hostname,port,uid,pwd);

//下蝲文g
if (ft.aftp != null){
  try {
  ft.getNameList(RWFileDir);
  }catch(IOException e)
  {
  System.out.println(\"下蝲文g出错Q\"+e);
  }
}


//上传文g
if (ft.aftp != null){
  String sdir = RWFileDir + \"subunsubfromsp\\\\\";
  File fdir = new File(sdir);
  String FileName = \"\";

  for(int i=0;i   FileName = sdir + (fdir.list());
 
  ft.uploadFile(RWFileDir,FileName);
  }
  //System.out.println(\"成功上传的文Ӟ\");
  //ft.showFileContents(\"subunsubfromsp\\\\\");
}

//删除subunsubfromsp目录下已l上传的文g文g
// ft.deleFile(RWFileDir);

//断开服务器连?br /> ft.stop(RWFileDir);

}

public FtpClient connect(String RWFileDir,String hostname,int port,String uid,String pwd)
{
this.hostname = hostname;
System.out.println(\"正在q接\"+hostname+\"Q请{待.....\");
try{
  aftp = new FtpClient(hostname,port);
  aftp.login(uid,pwd);
  aftp.binary();
  //aftp.openPortDataConnection();
  a = \"q接L:\"+hostname+\"成功!\";
  System.out.println(a);
}
catch(FtpLoginException e){
  a=\"登陆L:\"+hostname+\"p|!h查用户名或密码是否正:\"+e;
  System.out.println(a);
  //return false;
}
catch (IOException e){
  a=\"q接L:\"+hostname+\"p|!h查端口是否正:\"+e;
  System.out.println(a);
  //return false;
}
catch(SecurityException e)
{
  a=\"无权限与L:\"+hostname+\"q接!h查是否有讉K权限Q\"+e;
  System.out.println(a);
  //return false;
}

log(RWFileDir,a);
return aftp;
}

public void stop(String RWFileDir)
{
String message = \"\";
try {
  if(aftp!=null){
  aftp.closeServer();
  message = \"与主机\"+hostname+\"q接已断开!\";
  System.out.println(message);
  log(RWFileDir,message);
  }
}
catch(IOException e)
{
  message = \"与主机\"+hostname+\"断开q接p|!\"+e;
  System.out.println(message);
  log(RWFileDir,message);
}
}


public boolean downloadFile(String RWFileDir,String filepathname){
boolean result=true;
String message = \"\";
if (aftp != null)
{
  System.out.println(\"正在下蝲文g\"+filepathname+\",L?...\");
  String badfile = filepathname.substring(filepathname.length()-4,filepathname.length());
  String badlog = filepathname.substring(filepathname.length()-7,filepathname.length());
  String baddir = \"\";
  if ((badfile.compareTo(\".bad\") != 0) && (badlog.compareTo(\".badlog\") != 0)){
  baddir = \"subunsubtosp\\\\\";
  }
  else{
  baddir = \"bad\\\\\";
  }
  String strdir = \"subunsubtosp\\\\\";
  //System.out.println(RWFileDir + baddir + filepathname);
  try{
  //FtpClient fc=new FtpClient(\"192.168.0.56\",2121);
  //fc.login(\"lee\",\"lee\");
  int ch;
  File fi = new File(RWFileDir + baddir + filepathname);
  //aftp.cd(strdir);
  RandomAccessFile getFile = new RandomAccessFile(fi,\"rw\");
  getFile.seek(0);
  TelnetInputStream fget=aftp.get(strdir+filepathname);
  DataInputStream puts = new DataInputStream(fget);
  while ((ch = puts.read()) >= 0) {
  getFile.write(ch);
 
  }
  //s.delete();
 
  fget.close();
  getFile.close();
  //fc.closeServer();

  message = \"下蝲\"+filepathname+\"文g到\"+baddir +\"目录成功!\";
  System.out.println(message);
  log(RWFileDir,message);
  }
  catch(IOException e){
  message = \"下蝲\"+filepathname+\"文g到\"+baddir +\"目录p|!\"+e;
  System.out.println(message);
  log(RWFileDir,message);
  result = false ;

  }
}
else{
  result = false;
}
return result;
}


public boolean uploadFile(String RWFileDir,String filepathname){
boolean result=true;
String message = \"\";
if (aftp != null)
{
  System.out.println(\"正在上传文g\"+filepathname+\",L?...\");

  try{
  String fg =new String(\"\\\\subunsubfromsp\\\\\");
  int index = filepathname.lastIndexOf(fg);
  String filename = filepathname.substring(index+1);
  File localFile = new File(filepathname) ;
   
  RandomAccessFile sendFile = new RandomAccessFile(filepathname,\"r\");
  //
  sendFile.seek(0);
  //改名上传temp_
  filename = filename.substring(0,15)+\"temp_\"+filename.substring(15,filename.length());
  outs = aftp.put(filename);
  outputs = new DataOutputStream(outs);
  while (sendFile.getFilePointer() < sendFile.length() )
  {
  ch = sendFile.read();
  outputs.write(ch);
  }
 
  rename(filename.substring(15,filename.length()),filename.substring(20,filename.length()));
  outs.close();
  sendFile.close();
 
  message = \"上传\"+filepathname+\"文g成功!\";
  System.out.println(message);
  log(RWFileDir,message);
  }
  catch(IOException e){
  message = \"上传\"+filepathname+\"文gp|!\"+e;
  System.out.println(message);
  log(RWFileDir,message);
  result = false ;

  }
}
else{
  result = false;
}
return result;
}

public void rename(String oldName,String newName){

  //aftp.renameTo(oldName,newName);
  File Old = new File(oldName); //oldName
  File New = new File(newName); //newName
  //aftp.renameTo(New);
  //boolean Old.renameTo(File newName);
  //System.out.println(Old);
  //System.out.println(New);

}

public static void deleFile(String RWFileDir) {
//try {
//取得ReadFile目录下的txt文g
String sdir = RWFileDir + \"subunsubfromsp\\\\\";
File fdir = new File(sdir);
String FileName = \"\";
int j = fdir.list().length;

System.out.println(sdir+\"目录下要删除的文件数Q\"+fdir.list().length);
File file;
for(int i=0;i {
  //删除subunsubfromsp中的txt文g
  FileName = RWFileDir + \"subunsubfromsp\\\\\" + (fdir.list())[0];
  file = new File(FileName);
  file.delete();
  System.out.println(\"已经成功删除\"+FileName+\"文gQ\");
}
//}
//catch (IOException e) {
// System.out.println(\"删除txt文g错误!\");
// e.printStackTrace();
//}
}


public void showFileContents(String strdir)
{
StringBuffer buf = new StringBuffer();
try {
  aftp.cd(strdir);
  ins= aftp.list();
  while ((ch=ins.read())>=0){
  buf.append((char)ch);
  }
 
  System.out.println(buf.toString());

  ins.close();
    }
catch(IOException e)
{
}
}



// q回当前目录的所有文件及文g?br />
public ArrayList getFileList() throws IOException {
BufferedReader dr = new BufferedReader(new InputStreamReader(aftp.list()));
ArrayList al = new ArrayList();
String s = \"\";
while ( (s = dr.readLine()) != null) {
al.add(s);
}
return al;
}

public void setPath(String path) throws IOException {
if (aftp == null)
this.path = path;
else {
  aftp.cd(path);
}
}

// q回当前目录的文件名U?br />
public ArrayList getNameList(String RWFileDir) throws IOException {

BufferedReader dr = new BufferedReader(new InputStreamReader(aftp.nameList(\"subunsubtosp\\\\\")));
ArrayList al = new ArrayList();
String s = \"\";
while ( (s = dr.readLine()) != null) {
  al.add(s);
  s = s.substring(13,s.length());
  isFile(s);
  downloadFile(RWFileDir,s);
  //String strFileDelF = aftp.nameList(\"subunsubtosp\\\\\");
  File fileDelF=new File(s);
  fileDelF.delete();
}
return al;
//System.out.println(al.add(s));
}

// 判断一行文件信息是否ؓ目录

public boolean isDir(String line) {
return ( (String) parseLine(line).get(0)).indexOf(\"d\") != -1;
}

public boolean isFile(String line) {
return!isDir(line);
}

// 处理getFileList取得的行信息

private ArrayList parseLine(String line) {
ArrayList s1 = new ArrayList();
StringTokenizer st = new StringTokenizer(line, \" \");
while (st.hasMoreTokens()) {
  s1.add(st.nextToken());
}
  return s1;
}

//写消息日?br /> public static void log(String RWFileDir,String msg)
{
String message = \"\";
try {
  java.text.DateFormat df = new java.text.SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\");
  java.text.DateFormat dflog = new java.text.SimpleDateFormat(\"yyyyMMdd\");
  java.util.Date date = new java.util.Date() ;
  String datestr = df.format(new java.util.Date()) ;
  String datelog = dflog.format(new java.util.Date()) ;
  //String datelog = datestr.substring(0,10);
  //datelog = datelog.replace(\'-\',\' \');

  //按日期每天生成一个日志文?br />   FileWriter fwl = new FileWriter(RWFileDir + \"CMSSftp\"+datelog+\".log\",true);
  PrintWriter outl = new PrintWriter(fwl);
  outl.println(datestr + \" \" + msg);
  outl.close();
  fwl.close();
}catch (IOException e) {
  message = \"写log文g错误!\"+e;
  e.printStackTrace();
  log(RWFileDir,message);
  System.out.println(message);
}
}
}

转自Qhttp://bbs.java.ccidnet.com/read.php?tid=135053&fpage=4

fly 2010-09-01 18:30 发表评论
]]>
Java查PDF文g是否损坏http://www.tkk7.com/jlin/articles/330603.htmlflyflyWed, 01 Sep 2010 10:20:00 GMThttp://www.tkk7.com/jlin/articles/330603.htmlhttp://www.tkk7.com/jlin/comments/330603.htmlhttp://www.tkk7.com/jlin/articles/330603.html#Feedback3http://www.tkk7.com/jlin/comments/commentRss/330603.htmlhttp://www.tkk7.com/jlin/services/trackbacks/330603.html如果在系l中有比较多的PDF文gQ但是的pdf文g可能被损坏了Q我们可以利用itext 用来?br /> 首先下蝲itext?br /> http://sourceforge.net/projects/itext/files/
然后在执行以下代?/p>

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.ArrayList;
import com.itextpdf.text.Document;
import com.itextpdf.text.pdf.PdfReader;
public class TestPdf {
 private static ArrayList<String> pdffiles = new ArrayList<String>();

 /**
  * 递归得到特定目录下的所有文?br />   */
 public static void getAllPdfFile(String basedir) {
  File dir = new File(basedir);
  File[] files = dir.listFiles(new PdfFileFilter());
  if (files == null)
   return;
  for (int i = 0; i < files.length; i++) {
   if (files[i].isDirectory()) {
    getAllPdfFile(files[i].getAbsolutePath());
   } else {
    pdffiles.add(files[i].getAbsolutePath());
   }
  }
 }
 /**
  * 循环?br />   */
 private static void CheckPdfFiles(ArrayList<String> files) {
  for (String file : files) {
   boolean flag = false;
   flag = check(file);
   if (!flag) {
    System.out.println(file + "文g损坏");
   }
  }
 }

 /**
  * 利用itext打开pdf文档
  */
 private static boolean check(String file) {
  boolean flag1 = false;
  int n = 0;
  try {
   Document document = new Document(new PdfReader(file).getPageSize(1));
   document.open();
   PdfReader reader = new PdfReader(file);
   n = reader.getNumberOfPages();
   if (n != 0)
    flag1 = true;
   document.close();
  } catch (IOException e) {
   System.out.println(e.getMessage());
  }
  return flag1;

 }

 public static void main(String[] args) {
  getAllPdfFile("C:\\CO_uat\\");
  if (pdffiles.size() > 0)
   CheckPdfFiles(pdffiles);
  System.out.println("No break down file");
 }
}
/*
 * pdf文gqo?br />  */
class PdfFileFilter implements FileFilter {
 public boolean accept(File file) {
  if (file.isFile()) {
   String filename = file.getName().toLowerCase();
   if (filename.endsWith(".pdf") == true) {
    return true;
   } else {
    return false;
   }
  } else {
   return true;
  }
 }

}



fly 2010-09-01 18:20 发表评论
]]>
Java文g操作(?http://www.tkk7.com/jlin/articles/329783.htmlflyflyTue, 24 Aug 2010 06:52:00 GMThttp://www.tkk7.com/jlin/articles/329783.htmlhttp://www.tkk7.com/jlin/comments/329783.htmlhttp://www.tkk7.com/jlin/articles/329783.html#Feedback0http://www.tkk7.com/jlin/comments/commentRss/329783.htmlhttp://www.tkk7.com/jlin/services/trackbacks/329783.html写了个Java操作文g的简单例子,希望l需要帮助的兄弟提供点儿帮助Q同时也希望大家l予批评指正?
文g操作c,代码如下Q?br /> import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;

 

public class FileTools {
 private static final String SPECIAL_FILE_STYLE_PICTURECACHE = "Thumbs.db";
 public static final Logger logger = LogManager.getLogger(FileTools.class);
 
 public FileTools()
 {
  
 }
 /*
  * @discription:Delete a folder
  * @param:dirPath String
  * @return boolean
  */
 public static boolean deleteDirectory(String dirPath,boolean deteDirRoot)
 {
  File parentFile = new File(dirPath);
  File[] chirenFile = null;
  if(parentFile.exists() && parentFile.isDirectory())
  {
    chirenFile = parentFile.listFiles();
    for (int i = 0; i < chirenFile.length; i++) {
     if(!chirenFile[i].isDirectory())
     {
      chirenFile[i].delete();
     }
     else
     {
      deleteDirectory(chirenFile[i].getAbsolutePath(),true);     
      chirenFile[i].delete();
     }
    }
    if(deteDirRoot)
    {
     parentFile.delete();
    }
    
    return true;  
  }
  else
  {
   FileTools.logger.error("The Floder Is Not Exist!");
   return false;
  }
 }
 
 /*
  * @discription:Copy Folder
  * @param:sourceFilePath String,targetFilePath String
  * @return boolean
  */
 public static boolean copyDirectory(String sourceFilePath,String targetFilePath) throws IOException
 {
  File sourceFile = new File(sourceFilePath);
  File targetFile = new File(targetFilePath);
  
  if(!targetFile.exists())
  {
   targetFile.mkdir();
  }
  
  File[] sourceChirenFile = null;
  FileInputStream fileInputStream = null;
  FileOutputStream fileOutputStream = null;
  FileTools.logger.debug("Copy "+sourceFile.getName()+" Floder Start......");
  if(sourceFile.exists() && sourceFile.isDirectory())
  {
   sourceChirenFile = sourceFile.listFiles();
   for (int i = 0; i < sourceChirenFile.length; i++) {
    File tempFile = null;
    
    if(!sourceFilePath.endsWith(File.separator))
    {
     tempFile = new File(targetFilePath+File.separator+sourceChirenFile[i].getName());
    }
    else
    {
     tempFile = new File(targetFilePath+sourceChirenFile[i].getName());
    }
    if(!FileTools.SPECIAL_FILE_STYLE_PICTURECACHE.equalsIgnoreCase(sourceChirenFile[i].getName()))
    {
     if(!sourceChirenFile[i].isDirectory())
     {
      fileInputStream = new FileInputStream(sourceChirenFile[i]);
      fileOutputStream = new FileOutputStream(tempFile);
      byte[] b = new byte[1024];
      FileTools.logger.debug("Copy "+sourceChirenFile[i].getName()+" File Start......");
         while(fileInputStream.read(b)!=-1)
         {
          fileOutputStream.write(b);
         }
         FileTools.logger.debug("Copy "+sourceChirenFile[i].getName()+"  File End!");
         fileInputStream.close();
         fileOutputStream.close(); 
     }
     else
     {
      copyDirectory(sourceFilePath+File.separator+sourceChirenFile[i].getName(),
              targetFilePath+File.separator+sourceChirenFile[i].getName());
     }
    }
    
   }
   FileTools.logger.debug("Copy "+sourceFile.getName()+" Floder End!");
   return true;
  }
  else
  {
   FileTools.logger.error("The Floder Is Not Exist!");
   return false;
  }
 }
}
Junit试c?

 

import java.io.IOException;

import org.coolyongzi.FileTools;

import junit.framework.TestCase;

public class FileToolsTest extends TestCase {

 protected void setUp() throws Exception {
  super.setUp();
 }

 protected void tearDown() throws Exception {
  super.tearDown();
 }

 public void testDeleteDirectory()
 {
  FileTools.deleteDirectory("F:/复g 囄",false);
 }
 
 public void testCopyDirectory()
 {
  try {
   FileTools.copyDirectory("F:/Game","F:/Game1");
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
}



fly 2010-08-24 14:52 发表评论
]]>
关于 Exception: An invalid XML character (Unicode: 0xb) was found http://www.tkk7.com/jlin/articles/328156.htmlflyflyFri, 06 Aug 2010 10:23:00 GMThttp://www.tkk7.com/jlin/articles/328156.htmlhttp://www.tkk7.com/jlin/comments/328156.htmlhttp://www.tkk7.com/jlin/articles/328156.html#Feedback0http://www.tkk7.com/jlin/comments/commentRss/328156.htmlhttp://www.tkk7.com/jlin/services/trackbacks/328156.html An invalid XML character (Unicode: 0xb) was found in the element content of the document.

原因Q?br /> 从异常来看,很明显是因ؓ字节数组中存?Unicode: 0xb,而这个字节在Xml中被认ؓ是非法字W?br />
对于一些经q编码或加、解密的字符串中Q很Ҏ会出现这?0xb,
特别是在加、解密中Q经怼涉及到字W填充,而填充物通常?0xbQ?br /> 需对于0x00-0x20 都会引v一定的问题Q又因ؓq些字符不可见,因此用通常的编辑器q行~辑的时候找不到问题所在?br /> 而在转成String后也觉察不到M异常?br /> 所以在转成XML格式时要对字W串q行:
*  Verify that no character has a hex value greater than 0xFFFD, or less than 0x20.
* 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.

pubic String  CheckUnicodeString(String value)
    {
     char xmlChar = value.toCharArray();
    for (int i=0; i < xmlChar.Length; ++i) {
        if (xmlChar[i] > 0xFFFD)
        {
            throw new Exception("Invalid Unicode");
           //或者直接替换掉0xb 
            xmlChar[i] =' ';// 用空格替?br />         }
        else if (xmlChar[i] < 0x20 && xmlChar[i] != 't' & xmlChar[i] != 'n' & xmlChar[i] != 'r')
        {
            throw new Exception("Invalid Xml Characters");
           //或者直接替换掉0xb
            xmlChar[i] =' ' ;// 用空格替?br />         }
       return new String( xmlChar );
    }



fly 2010-08-06 18:23 发表评论
]]>
正则表达式详??http://www.tkk7.com/jlin/articles/325485.htmlflyflyWed, 07 Jul 2010 10:05:00 GMThttp://www.tkk7.com/jlin/articles/325485.htmlhttp://www.tkk7.com/jlin/comments/325485.htmlhttp://www.tkk7.com/jlin/articles/325485.html#Feedback0http://www.tkk7.com/jlin/comments/commentRss/325485.htmlhttp://www.tkk7.com/jlin/services/trackbacks/325485.html 如果你曾l用qPerl或Q何其他内建正则表辑ּ支持的语aQ你一定知道用正则表达式处理文本和匚w模式是多么简单。如果你不熟悉这个术语,那么“正则表达?#8221;QRegular ExpressionQ就是一个字W构成的Ԍ它定义了一个用来搜索匹配字W串的模式?
许多语言Q包括Perl、PHP、Python、JavaScript和JScriptQ都支持用正则表辑ּ处理文本Q一些文本编辑器用正则表辑ּ实现高“搜烦-替换”功能。那么Java又怎样呢?本文写作Ӟ一个包含了用正则表辑ּq行文本处理的Java规范需求(Specification RequestQ已l得到认可,你可以期待在JDK的下一版本中看到它?
然而,如果现在需要用正则表辑ּQ又该怎么办呢Q你可以从Apache.org下蝲源代码开攄Jakarta-ORO库。本文接下来的内容先要地介绍正则表达式的入门知识Q然后以Jakarta-ORO APIZ介绍如何使用正则表达式?
一、正则表辑ּ基础知识
我们先从单的开始。假设你要搜索一个包含字W?#8220;cat”的字W串Q搜索用的正则表辑ּ是“cat”。如果搜索对大小写不敏感Q单?#8220;catalog”?#8220;Catherine”?#8220;sophisticated”都可以匹配。也是_
1.1 句点W号
假设你在玩英文拼字游戏,惌扑և三个字母的单词,而且q些单词必须?#8220;t”字母开_?#8220;n”字母l束。另外,假设有一本英文字典,你可以用正则表达式搜索它的全部内宏V要构造出q个正则表达式,你可以用一个通配W——句点符?#8220;.”。这P完整的表辑ּ是“t.n”Q它匚w“tan”?#8220;ten”?#8220;tin”?#8220;ton”Q还匚w“t#n”?#8220;tpn”甚至“t n”Q还有其他许多无意义的组合。这是因为句点符号匹配所有字W,包括I格、Tab字符甚至换行W:
1.2 ҎL?/strong>
Z解决句点W号匚w范围q于q泛q一问题Q你可以在方括号Q?#8220;[]”Q里面指定看来有意义的字W。此Ӟ只有Ҏ号里面指定的字符才参与匹配。也是_正则表达?#8220;t[aeio]n”只匹?#8220;tan”?#8220;Ten”?#8220;tin”?#8220;ton”。但“Toon”不匹配,因ؓ在方括号之内你只能匹配单个字W:
1.3 “?#8221;W号
如果除了上面匚w的所有单词之外,你还惌匚w“toon”Q那么,你可以?#8220;|”操作W?#8220;|”操作W的基本意义是“?#8221;q算。要匚w“toon”Q?#8220;t(a|e|i|o|oo)n”正则表达式。这里不能用方扩号Q因为方括号只允许匹配单个字W;q里必须使用圆括?#8220;()”。圆括号q可以用来分l,具体请参见后面介l?
1.4 表示匚wơ数的符?/strong>
表一昄了表C匹配次数的W号Q这些符L来确定紧靠该W号左边的符号出现的ơ数Q?

假设我们要在文本文g中搜索美国的C会安全L。这个号码的格式?99-99-9999。用来匹配它的正则表辑ּ如图一所C。在正则表达式中Q连字符Q?#8220;-”Q有着Ҏ的意义,它表CZ个范_比如??。因此,匚wC会安全L中的q字W号Ӟ它的前面要加上一个{义字W?#8220;\”?

图一Q匹配所?23-12-1234形式的社会安全号?/p>

假设q行搜烦的时候,你希望连字符号可以出玎ͼ也可以不出现——即Q?99-99-9999?99999999都属于正的格式。这Ӟ你可以在q字W号后面加上“Q?#8221;数量限定W号Q如图二所C:

图二Q匹配所?23-12-1234?23121234形式的社会安全号?/p>

下面我们再来看另外一个例子。美国汽车牌照的一U格式是四个数字加上二个字母。它的正则表辑ּ前面是数字部?#8220;[0-9]{4}”Q再加上字母部分“[A-Z]{2}”。图三显CZ完整的正则表辑ּ?

图三Q匹配典型的国汽R牌照LQ如8836KV

1.5 “?#8221;W号
“^”W号UCؓ“?#8221;W号。如果用在方括号内,“^”表示不想要匹配的字符。例如,囑֛的正则表辑ּ匚w所有单词,但以“X”字母开头的单词除外?

囑֛Q匹配所有单词,?#8220;X”开头的除外

1.6 圆括号和I白W号
假设要从格式?#8220;June 26, 1951”的生日日期中提取出月份部分,用来匚w该日期的正则表达式可以如图五所C:

图五Q匹配所有Moth DD,YYYY格式的日?/p>

新出现的“\s”W号是空白符P匚w所有的I白字符Q包括Tab字符。如果字W串正确匚wQ接下来如何提取出月份部分呢Q只需在月份周围加上一个圆括号创徏一个组Q然后用ORO APIQ本文后面详l讨论)提取出它的倹{修改后的正则表辑ּ如图六所C:

囑օQ匹配所有Month DD,YYYY格式的日期,定义月䆾gؓW一个组

1.7 其它W号
为简便v见,你可以用一些ؓ常见正则表达式创建的快捷W号。如表二所C:
表二Q常用符?

例如Q在前面C会安全L的例子中Q所有出?#8220;[0-9]”的地Ҏ们都可以使用“\d”。修改后的正则表辑ּ如图七所C:

图七Q匹配所?23-12-1234格式的社会安全号?/p>

二、Jakarta-ORO?/span>
有许多源代码开攄正则表达式库可供JavaE序员用,而且它们中的许多支持Perl 5兼容的正则表辑ּ语法。我在这里选用的是Jakarta-ORO正则表达式库Q它是最全面的正则表辑ּAPI之一Q而且它与Perl 5正则表达式完全兼宏V另外,它也是优化得最好的API之一?
Jakarta-ORO库以前叫做OROMatcherQDaniel Savarese大方地把它赠送给了Jakarta Project。你可以按照本文最后参考资源的说明下蝲它?
我首先将要介l用Jakarta-ORO库时你必d建和讉K的对象,然后介绍如何使用Jakarta-ORO API?
?PatternCompiler对象
首先Q创Z个Perl5Compilercȝ实例Qƈ把它赋值给PatternCompiler接口对象。Perl5Compiler是PatternCompiler接口的一个实玎ͼ允许你把正则表达式编译成用来匚w的Pattern对象?
?Pattern对象
要把正则表达式编译成Pattern对象Q调用compiler对象的compile()ҎQƈ在调用参C指定正则表达式。例如,你可以按照下面这U方式编译正则表辑ּ“t[aeio]n”Q?
默认情况下,~译器创Z个大写敏感的模式(patternQ。因此,上面代码~译得到的模式只匚w“tin”?#8220;tan”?“ten”?#8220;ton”Q但不匹?#8220;Tin”?#8220;taN”。要创徏一个大写不敏感的模式Q你应该在调用编译器的时候指定一个额外的参数Q?
创徏好Pattern对象之后Q你可以通过PatternMatchercȝ该Pattern对象q行模式匚w?
?PatternMatcher对象
PatternMatcher对象ҎPattern对象和字W串q行匚w查。你要实例化一个Perl5Matchercdƈ把结果赋值给PatternMatcher接口。Perl5MatchercLPatternMatcher接口的一个实玎ͼ它根据Perl 5正则表达式语法进行模式匹配:
使用PatternMatcher对象Q你可以用多个方法进行匹配操作,q些Ҏ的第一个参数都是需要根据正则表辑ּq行匚w的字W串Q?
· boolean matches(String input, Pattern pattern)Q当输入字符串和正则表达式要_匚w时用。换句话_正则表达式必d整地描述输入字符丌Ӏ?
· boolean matchesPrefix(String input, Pattern pattern)Q当正则表达式匹配输入字W串起始部分时用?
· boolean contains(String input, Pattern pattern)Q当正则表达式要匚w输入字符串的一部分时用(卻I它必L一个子Ԍ?
另外Q在上面三个Ҏ调用中,你还可以用PatternMatcherInput对象作ؓ参数替代String对象Q这Ӟ你可以从字符串中最后一ơ匹配的位置开始l进行匹配。当字符串可能有多个子串匚wl定的正则表辑ּӞ用PatternMatcherInput对象作ؓ参数很有用了。用PatternMatcherInput对象作ؓ参数替代StringӞ上述三个Ҏ的语法如下:
· boolean matches(PatternMatcherInput input, Pattern pattern)
· boolean matchesPrefix(PatternMatcherInput input, Pattern pattern)
· boolean contains(PatternMatcherInput input, Pattern pattern)
三、应用实?/span>
下面我们来看看Jakarta-ORO库的一些应用实例?
3.1 日志文g处理
dQ分析一个Web服务器日志文Ӟ定每一个用戯在网站上的时间。在典型的BEA WebLogic日志文g中,日志记录的格式如下:
分析q个日志记录Q可以发玎ͼ要从q个日志文g提取的内Ҏ两项QIP地址和页面访问时间。你可以用分l符P圆括P从日志记录提取出IP地址和时间标记?
首先我们来看看IP地址。IP地址?个字节构成,每一个字节的值在0?55之间Q各个字节通过一个句点分隔。因此,IP地址中的每一个字节有臛_一个、最多三个数字。图八显CZ为IP地址~写的正则表辑ּQ?

囑օQ匹配IP地址

IP地址中的句点字符必须q行转义处理Q前面加?#8220;\”Q,因ؓIP地址中的句点h它本来的含义Q而不是采用正则表辑ּ语法中的Ҏ含义。句点在正则表达式中的特D含义本文前面已l介l?
日志记录的时间部分由一Ҏ括号包围。你可以按照如下思\提取出方括号里面的所有内容:首先搜烦起始Ҏ号字W(“[”Q,提取出所有不过l束Ҏ号字W(“]”Q的内容Q向前寻扄x到结束方括号字符。图九显CZq部分的正则表达式?

图九Q匹配至一个字W,直至扑ֈ“]”

现在Q把上述两个正则表达式加上分l符P圆括P后合q成单个表达式,q样可以从日志记录提取出IP地址和时间。注意,Z匚w“- -”Q但不提取它Q,正则表达式中间加入了“\s-\s-\s”。完整的正则表达式如囑֍所C?

囑֍Q匹配IP地址和时间标?/p>

现在正则表达式已l编写完毕,接下来可以编写用正则表辑ּ库的Java代码了?
Z用Jakarta-ORO库,首先创徏正则表达式字W串和待分析的日志记录字W串Q?
q里使用的正则表辑ּ与图十的正则表达式差不多完全相同Q但有一点例外:在Java中,你必d每一个向前的斜杠Q?#8220;\”Q进行{义处理。图十不是Java的表CŞ式,所以我们要在每?#8220;\”前面加上一?#8220;\”以免出现~译错误。遗憄是,转义处理q程很容易出现错误,所以应该小心}慎。你可以首先输入未经转义处理的正则表辑ּQ然后从左到右依ơ把每一?#8220;\”替换?#8220;\\”。如果要复检Q你可以试着把它输出到屏q上?
初始化字W串之后Q实例化PatternCompiler对象Q用PatternCompiler~译正则表达式创Z个Pattern对象Q?
现在Q创建PatternMatcher对象Q调用PatternMatcher接口的contain()Ҏ查匹配情况:
接下来,利用PatternMatcher接口q回的MatchResult对象Q输出匹配的l。由于logEntry字符串包含匹配的内容Q你可以看到cd下面的输出:
3.2 HTML处理实例一
下面一个Q务是分析HTML面内FONT标记的所有属性。HTML面内典型的FONT标记如下所C:
E序按照如下Ş式,输出每一个FONT标记的属性:
在这U情况下Q我你用两个正则表辑ּ。第一个如囑֍一所C,它从字体标记提取?#8220;"face="Arial, Serif" size="+2" color="red"”?

囑֍一Q匹配FONT标记的所有属?/p>

W二个正则表辑ּ如图十二所C,它把各个属性分割成名字-值对?

囑֍二:匚w单个属性,q把它分割成名字-值对

分割l果为:
现在我们来看看完成这个Q务的Java代码。首先创Z个正则表辑ּ字符Ԍ用Perl5Compiler把它们编译成Pattern对象。编译正则表辑ּ的时候,指定Perl5Compiler.CASE_INSENSITIVE_MASK选项Q得匹配操作不区分大小写?
接下来,创徏一个执行匹配操作的Perl5Matcher对象?
假设有一个Stringcd的变量htmlQ它代表了HTML文g中的一行内宏V如果html字符串包含FONT标记Q匹配器返回true。此Ӟ你可以用匚w器对象返回的MatchResult对象获得W一个组Q它包含了FONT的所有属性:
接下来创Z个PatternMatcherInput对象。这个对象允怽从最后一ơ匹配的位置开始l进行匹配操作,因此Q它很适合于提取FONT标记内属性的名字-值对。创建PatternMatcherInput对象Q以参数形式传入待匹配的字符丌Ӏ然后,用匹配器实例提取出每一个FONT的属性。这通过指定PatternMatcherInput对象Q而不是字W串对象Qؓ参数Q反复地调用PatternMatcher对象的contains()Ҏ完成。PatternMatcherInput对象之中的每一ơP代将把它内部的指针向前移动,下一ơ检将从前一ơ匹配位|的后面开始?
本例的输出结果如下:
3.3 HTML处理实例?/strong>
下面我们来看看另一个处理HTML的例子。这一ơ,我们假定Web服务器从widgets.acme.comUd了newserver.acme.com。现在你要修改一些页面中的链接:
执行q个搜烦的正则表辑ּ如图十三所C:

囑֍三:匚w修改前的链接

如果能够匚wq个正则表达式,你可以用下面的内Ҏ换图十三的链接:
注意#字符的后面加上了$1。Perl正则表达式语法用$1?2{表C已l匹配且提取出来的组。图十三的表辑ּ把所有作Z个组匚w和提取出来的内容附加到链接的后面?
现在Q返回Java。就象前面我们所做的那样Q你必须创徏试字符Ԍ创徏把正则表辑ּ~译到Pattern对象所必需的对象,以及创徏一个PatternMatcher对象Q?img style="width: 500px; cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/qg1rzozee4bf.jpg" border="0" />
接下来,用com.oroinc.text.regex包Utilcȝsubstitute()静态方法进行替换,输出l果字符Ԍ
Util.substitute()Ҏ的语法如下:
q个调用的前两个参数是以前创建的PatternMatcher和Pattern对象。第三个参数是一个Substiution对象Q它军_了替换操作如何进行。本例用的是Perl5Substitution对象Q它能够q行Perl5风格的替换。第四个参数是想要进行替换操作的字符Ԍ最后一个参数允许指定是否替换模式的所有匹配子ԌUtil.SUBSTITUTE_ALLQ,或只替换指定的次数?
【结束语?/strong>在这文章中Q我Z介绍了正则表辑ּ的强大功能。只要正运用,正则表达式能够在字符串提取和文本修改中v到很大的作用。另外,我还介绍了如何在JavaE序中通过Jakarta-ORO库利用正则表辑ּ。至于最l采用老式的字W串处理方式Q用StringTokenizerQcharAtQ和substringQ,q是采用正则表达式,q就有待你自己决定了?/td>


fly 2010-07-07 18:05 发表评论
]]>
jvm调优ȝ(?http://www.tkk7.com/jlin/articles/321500.htmlflyflyThu, 20 May 2010 14:11:00 GMThttp://www.tkk7.com/jlin/articles/321500.htmlhttp://www.tkk7.com/jlin/comments/321500.htmlhttp://www.tkk7.com/jlin/articles/321500.html#Feedback0http://www.tkk7.com/jlin/comments/commentRss/321500.htmlhttp://www.tkk7.com/jlin/services/trackbacks/321500.html/Files/jlin/JVM_optimism.pdf

fly 2010-05-20 22:11 发表评论
]]>
javaq接数据库代?http://www.tkk7.com/jlin/articles/320678.htmlflyflyWed, 12 May 2010 03:02:00 GMThttp://www.tkk7.com/jlin/articles/320678.htmlhttp://www.tkk7.com/jlin/comments/320678.htmlhttp://www.tkk7.com/jlin/articles/320678.html#Feedback0http://www.tkk7.com/jlin/comments/commentRss/320678.htmlhttp://www.tkk7.com/jlin/services/trackbacks/320678.html1、Oracle8/8i/9i数据库(thin模式Q?
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
String url="jdbc:oracle:thin:@localhost:1521:orcl";
//orcl为数据库的SID
String user="test";
String password="test";
Connection conn= DriverManager.getConnection(url,user,password);

2、DB2数据?
Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance();
String url="jdbc:db2://localhost:5000/sample";
//sampleZ的数据库?
String user="admin";
String password="";
Connection conn= DriverManager.getConnection(url,user,password);

3、Sql Server7.0/2000数据?
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb";
//mydb为数据库
String user="sa";
String password="";
Connection conn= DriverManager.getConnection(url,user,password);

4、Sybase数据?
Class.forName("com.sybase.jdbc.SybDriver").newInstance();
String url =" jdbc:sybase:Tds:localhost:5007/myDB";
//myDBZ的数据库?
Properties sysProps = System.getProperties();
SysProps.put("user","userid");
SysProps.put("password","user_password");
Connection conn= DriverManager.getConnection(url, SysProps);

5、Informix数据?
Class.forName("com.informix.jdbc.IfxDriver").newInstance();
String url =
"jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver;
user=testuser;password=testpassword";
//myDB为数据库?
Connection conn= DriverManager.getConnection(url);

6、MySQL数据?
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
String url ="jdbc:mysql://localhost/myDB?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1"
//myDB为数据库?
Connection conn= DriverManager.getConnection(url);

7、PostgreSQL数据?
Class.forName("org.postgresql.Driver").newInstance();
String url ="jdbc:postgresql://localhost/myDB"
//myDB为数据库?
String user="myuser";
String password="mypassword";
Connection conn= DriverManager.getConnection(url,user,password);



fly 2010-05-12 11:02 发表评论
]]>
多线E技术下载文Ӟ转)http://www.tkk7.com/jlin/articles/320420.htmlflyflySun, 09 May 2010 14:12:00 GMThttp://www.tkk7.com/jlin/articles/320420.htmlhttp://www.tkk7.com/jlin/comments/320420.htmlhttp://www.tkk7.com/jlin/articles/320420.html#Feedback0http://www.tkk7.com/jlin/comments/commentRss/320420.htmlhttp://www.tkk7.com/jlin/services/trackbacks/320420.html阅读全文

fly 2010-05-09 22:12 发表评论
]]>
常用Java代码Q{Q?/title><link>http://www.tkk7.com/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.tkk7.com/jlin/articles/320418.html</guid><wfw:comment>http://www.tkk7.com/jlin/comments/320418.html</wfw:comment><comments>http://www.tkk7.com/jlin/articles/320418.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/jlin/comments/commentRss/320418.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/jlin/services/trackbacks/320418.html</trackback:ping><description><![CDATA[<p>/**<br />      * 某个日期以固定格式转化成字W串<br />      * <br />      * @param date<br />      * @return String<br />      */<br />     public static String dateToStr(java.util.Date date)<br />     {<br />         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");<br />         String str = sdf.format(date);<br />         return str;<br />     }<br /> ------------------------------------------------------------------------------------------<br />  /**<br />      * 判断L一个整数是否素?br />      * <br />      * @param n<br />      * @return boolean<br />      */<br />     public static boolean isPrimes(int n)<br />     {<br />         for (int i = 2; i <= Math.sqrt(n); i++)<br />         {<br />             if (n % i == 0)<br />             {<br />                 return false;<br />             }<br />         }<br />         return true;<br />     }<br /> ------------------------------------------------------------------------------------------<br /> /**<br />      * 获得L一个整数的阶乘Q递归<br />       * <br />      * @param n<br />      * @return n!<br />      */<br />     public static int factorial(int n)<br />     {<br />         if (n == 1)<br />         {<br />             return 1;<br />         }<br />         return n * factorial(n - 1);<br />     }<br /> --------------------------------------------------------------------------------------------<br /> /**<br />      * 指定byte数组?6q制的Ş式打印到控制?br />      * <br />      * @param hint<br />      *            String<br />      * @param b<br />      *            byte[]<br />      * @return void<br />      */<br />     public static void printHexString(String hint, byte[] b)<br />     {<br />         System.out.print(hint);<br />         for (int i = 0; i < b.length; i++)<br />         {<br />             String hex = Integer.toHexString(b[i] & 0xFF);<br />             if (hex.length() == 1)<br />             {<br />                 hex = '0' + hex;<br />             }<br />             System.out.print(hex.toUpperCase() + " ");<br />         }<br />         System.out.println("");<br />     }<br /> <br /> -----------------------------------------------------------------------------------------<br /> package net.java2000.tools;</p> <p>/**<br />  * Title:        Java Bean 工具<br />  * Description:<br />  * Copyright:    Copyright (c) 2001<br />  * Company:      JAVA世纪|?http://www.java2000.net<br />  * @author 赵学?br />  * @version 1.0<br />  */<br /> import java.util.*;<br /> import java.util.regex.Pattern;</p> <p>public class StrTools {<br />  /**<br />   * 分割字符?br />   * <br />   * @param str<br />   *            String 原始字符?br />   * @param splitsign<br />   *            String 分隔W?br />   * @return String[] 分割后的字符串数l?br />   */<br />  @SuppressWarnings("unchecked")<br />  public static String[] split(String str, String splitsign) {<br />   int index;<br />   if (str == null || splitsign == null)<br />    return null;<br />   ArrayList al = new ArrayList();<br />   while ((index = str.indexOf(splitsign)) != -1) {<br />    al.add(str.substring(0, index));<br />    str = str.substring(index + splitsign.length());<br />    //System.out.println("str is : " +str);<br />   }<br />   al.add(str);<br />   return (String[]) al.toArray(new String[0]);<br />  }</p> <p> /**<br />   * 替换字符?br />   * <br />   * @param from<br />   *            String 原始字符?br />   * @param to<br />   *            String 目标字符?br />   * @param source<br />   *            String 母字W串<br />   * @return String 替换后的字符?br />   */<br />  public static String replace(String from, String to, String source) {<br />   if (source == null || from == null || to == null)<br />    return null;<br />   StringBuffer bf = new StringBuffer("");<br />   int index = -1;<br />   while ((index = source.indexOf(from)) != -1) {<br />    bf.append(source.substring(0, index) + to);<br />    source = source.substring(index + from.length());<br />    index = source.indexOf(from);<br />   }<br />   bf.append(source);<br />   return bf.toString();<br />  }</p> <p> /**<br />   * 替换字符Ԍ能能够在HTML面上直接显C?替换双引号和于?<br />   * <br />   * @param str<br />   *            String 原始字符?br />   * @return String 替换后的字符?br />   */<br />  public static String htmlencode(String str) {<br />   if (str == null) {<br />    return null;<br />   }</p> <p>  return replace("\"", "&quot;", replace("<", "&lt;", str));<br />  }</p> <p> /**<br />   * 替换字符Ԍ被~码的{换成原始码(替换成双引号和小于号Q?br />   * <br />   * @param str<br />   *            String<br />   * @return String<br />   */<br />  public static String htmldecode(String str) {<br />   if (str == null) {<br />    return null;<br />   }</p> <p>  return replace("&quot;", "\"", replace("&lt;", "<", str));<br />  }</p> <p> private static final String _BR = "<br/>";</p> <p> /**<br />   * 在页面上直接昄文本内容Q替换小于号Q空|回RQTAB<br />   * <br />   * @param str<br />   *            String 原始字符?br />   * @return String 替换后的字符?br />   */<br />  public static String htmlshow(String str) {<br />   if (str == null) {<br />    return null;<br />   }</p> <p>  str = replace("<", "&lt;", str);<br />   str = replace(" ", "&nbsp;", str);<br />   str = replace("\r\n", _BR, str);<br />   str = replace("\n", _BR, str);<br />   str = replace("\t", "&nbsp;&nbsp;&nbsp;&nbsp;", str);<br />   return str;<br />  }</p> <p> /**<br />   * q回指定字节长度的字W串<br />   * <br />   * @param str<br />   *            String 字符?br />   * @param length<br />   *            int 指定长度<br />   * @return String q回的字W串<br />   */<br />  public static String toLength(String str, int length) {<br />   if (str == null) {<br />    return null;<br />   }<br />   if (length <= 0) {<br />    return "";<br />   }<br />   try {<br />    if (str.getBytes("GBK").length <= length) {<br />     return str;<br />    }<br />   } catch (Exception ex) {<br />   }<br />   StringBuffer buff = new StringBuffer();</p> <p>  int index = 0;<br />   char c;<br />   length -= 3;<br />   while (length > 0) {<br />    c = str.charAt(index);<br />    if (c < 128) {<br />     length--;<br />    } else {<br />     length--;<br />     length--;<br />    }<br />    buff.append(c);<br />    index++;<br />   }<br />   buff.append("...");<br />   return buff.toString();<br />  }</p> <p> /**<br />   * 判断是否为整?br />   * <br />   * @param str<br />   *            传入的字W串<br />   * @return 是整数返回true,否则q回false<br />   */<br />  public static boolean isInteger(String str) {<br />   Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");<br />   return pattern.matcher(str).matches();<br />  }</p> <p> /**<br />   * 判断是否为QҎQ包括double和float<br />   * <br />   * @param str<br />   *            传入的字W串<br />   * @return 是QҎq回true,否则q回false<br />   */<br />  public static boolean isDouble(String str) {<br />   Pattern pattern = Pattern.compile("^[-\\+]?[.\\d]*$");<br />   return pattern.matcher(str).matches();<br />  }</p> <p> /**<br />   * 判断输入的字W串是否W合Email样式.<br />   * <br />   * @param str<br />   *            传入的字W串<br />   * @return 是Email样式q回true,否则q回false<br />   */<br />  public static boolean isEmail(String str) {<br />   Pattern pattern = Pattern<br />     .compile("^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$");<br />   return pattern.matcher(str).matches();<br />  }</p> <p> /**<br />   * 判断输入的字W串是否为纯汉字<br />   * <br />   * @param str<br />   *            传入的字W窜<br />   * @return 如果是纯汉字q回true,否则q回false<br />   */<br />  public static boolean isChinese(String str) {<br />   Pattern pattern = Pattern.compile("[\u0391-\uFFE5]+$");<br />   return pattern.matcher(str).matches();<br />  }</p> <p> /**<br />   * 是否为空?包括null?"<br />   * <br />   * @param str<br />   * @return<br />   */<br />  public static boolean isBlank(String str) {<br />   return str == null || str.trim().length() == 0;<br />  }</p> <p> /**<br />   * 判断是否?br />   * <br />   * @param x<br />   * @return<br />   */<br />  public static boolean isPrime(int x) {<br />   if (x <= 7) {<br />    if (x == 2 || x == 3 || x == 5 || x == 7)<br />     return true;<br />   }<br />   int c = 7;<br />   if (x % 2 == 0)<br />    return false;<br />   if (x % 3 == 0)<br />    return false;<br />   if (x % 5 == 0)<br />    return false;<br />   int end = (int) Math.sqrt(x);<br />   while (c <= end) {<br />    if (x % c == 0) {<br />     return false;<br />    }<br />    c += 4;<br />    if (x % c == 0) {<br />     return false;<br />    }<br />    c += 2;<br />    if (x % c == 0) {<br />     return false;<br />    }<br />    c += 4;<br />    if (x % c == 0) {<br />     return false;<br />    }<br />    c += 2;<br />    if (x % c == 0) {<br />     return false;<br />    }<br />    c += 4;<br />    if (x % c == 0) {<br />     return false;<br />    }<br />    c += 6;<br />    if (x % c == 0) {<br />     return false;<br />    }<br />    c += 2;<br />    if (x % c == 0) {<br />     return false;<br />    }<br />    c += 6;<br />   }<br />   return true;<br />  }</p> <p> public static void main(String[] args) {<br />   String[] numbers = { "12345", "-12345", "123.45", "-123.45", ".12345",<br />     "-.12345", "a12345", "12345a", "123.a45" };<br />   for (String str : numbers) {<br />    System.out<br />      .println(str + "=" + isInteger(str) + " " + isDouble(str));<br />   }</p> <p>  String[] emails = { "1@2.com", "1.2@3.com", "1@3.4.5.com" };<br />   for (String str : emails) {<br />    System.out.println(str + "=" + isEmail(str));<br />   }<br />   String[] chineses = { "中国", "1中国", "中国1", "1中国2", "?? };<br />   for (String str : chineses) {<br />    System.out.println(str + "=" + isChinese(str));<br />   }<br />    String str = "lin@san@fu@2009";<br />    String[] strArray =split(str,"@");<br />    for(String s: strArray)<br />    System.out.println(s);<br />  }<br /> }<br /> -------------------------------------------------------------------------------------------------<br /> <span style="color: #008000">/*</span><span style="color: #008000"> * Db.java<br /> Created on 2007q??0? 上午 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 />     </span><span style="color: #0000ff">private</span><span style="color: #000000"> String driver;<br />     </span><span style="color: #0000ff">private</span><span style="color: #000000"> String url;<br />     </span><span style="color: #0000ff">private</span><span style="color: #000000"> String user;<br />     </span><span style="color: #0000ff">private</span><span style="color: #000000"> String password;<br />     </span><span style="color: #0000ff">private</span><span style="color: #000000"> Connection conn;<br />     </span><span style="color: #0000ff">private</span><span style="color: #000000"> Statement stm;<br />     </span><span style="color: #0000ff">private</span><span style="color: #000000"> ResultSet rs;<br />     </span><span style="color: #0000ff">public</span><span style="color: #000000"> Db(){<br />         </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 />     }<br />     </span><span style="color: #0000ff">public</span><span style="color: #000000"> Db(String conf) {<br />         loadProperties(conf);<br />         setConn();<br />     }<br />     </span><span style="color: #0000ff">public</span><span style="color: #000000"> Connection getConn(){<br />         </span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #0000ff">this</span><span style="color: #000000">.conn;<br />     }<br />   </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">    </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 />         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 />         </span><span style="color: #0000ff">try</span><span style="color: #000000"> {<br />             props.load(</span><span style="color: #0000ff">new</span><span style="color: #000000"> FileInputStream(conf));<br />         } </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (FileNotFoundException e) {<br />             e.printStackTrace();<br />         } </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (IOException e) {<br />             e.printStackTrace();<br />         }<br />         </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 />         </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 />         </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 />         </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 />     }<br />     </span><span style="color: #008000">//</span><span style="color: #008000">implement the Connection</span><span style="color: #008000"><br /> </span><span style="color: #000000">    </span><span style="color: #0000ff">private</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> setConn(){<br />         </span><span style="color: #0000ff">try</span><span style="color: #000000"> {<br />             Class.forName(driver);<br />             </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 />         } </span><span style="color: #0000ff">catch</span><span style="color: #000000">(ClassNotFoundException classnotfoundexception) {<br />               classnotfoundexception.printStackTrace();<br />             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 />         } </span><span style="color: #0000ff">catch</span><span style="color: #000000">(SQLException sqlexception) {<br />             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 />         }<br />     }<br />        </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 />         </span><span style="color: #0000ff">try</span><span style="color: #000000"> {<br />             Statement statement </span><span style="color: #000000">=</span><span style="color: #000000"> conn.createStatement();<br />             </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 />         } </span><span style="color: #0000ff">catch</span><span style="color: #000000">(SQLException sqlexception) {<br />             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 />         }<br />     }<br />     </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 />         </span><span style="color: #0000ff">try</span><span style="color: #000000"> {<br />             stm </span><span style="color: #000000">=</span><span style="color: #000000"> conn.createStatement();<br />             </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 />         } </span><span style="color: #0000ff">catch</span><span style="color: #000000">(SQLException sqlexception) {<br />             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 />         }<br />     }<br />     </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 />         </span><span style="color: #0000ff">try</span><span style="color: #000000"> {<br />             stm </span><span style="color: #000000">=</span><span style="color: #000000"> conn.createStatement();<br />             </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 />         } </span><span style="color: #0000ff">catch</span><span style="color: #000000">(SQLException sqlexception) {<br />             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 />         }<br />     }<br />     <br />     </span><span style="color: #0000ff">public</span><span style="color: #000000"> ResultSet doSelect(String sql) {<br />         </span><span style="color: #0000ff">try</span><span style="color: #000000"> {<br />             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 />             rs </span><span style="color: #000000">=</span><span style="color: #000000"> stm.executeQuery(sql);<br />         } </span><span style="color: #0000ff">catch</span><span style="color: #000000">(SQLException sqlexception) {<br />             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 />         }<br />         </span><span style="color: #0000ff">return</span><span style="color: #000000"> rs;<br />     }<br />     </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 />         </span><span style="color: #0000ff">try</span><span style="color: #000000">{<br />             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 />             Connection conn </span><span style="color: #000000">=</span><span style="color: #000000"> db.getConn();<br />             </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">&&</span><span style="color: #000000"> </span><span style="color: #000000">!</span><span style="color: #000000">conn.isClosed()) {<br />                 System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">連結成功</span><span style="color: #000000">"</span><span style="color: #000000">);<br />                 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 />                 </span><span style="color: #0000ff">while</span><span style="color: #000000">(rs.next()){<br />                     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 />                   }<br />                 rs.close();<br />                 conn.close();<br />             }<br />         }</span><span style="color: #0000ff">catch</span><span style="color: #000000">(SQLException e) {<br />             e.printStackTrace();<br />         }<br />     }  <br /> }<br /> </span><br /> </p> <img src ="http://www.tkk7.com/jlin/aggbug/320418.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/jlin/" target="_blank">fly</a> 2010-05-09 21:43 <a href="http://www.tkk7.com/jlin/articles/320418.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA里面如何让一个线E死亡或l束Q{Q?/title><link>http://www.tkk7.com/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.tkk7.com/jlin/articles/318201.html</guid><wfw:comment>http://www.tkk7.com/jlin/comments/318201.html</wfw:comment><comments>http://www.tkk7.com/jlin/articles/318201.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/jlin/comments/commentRss/318201.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/jlin/services/trackbacks/318201.html</trackback:ping><description><![CDATA[<p>q问题也是很常见的问题,自打 stop不推荐用后Q我们还有别的可以选择的方法吗Q?br /> 讄一个标志,让其自动return最安全?</p> <p>/**<br />  * JAVA里面如何使用一个线E死亡或l束.<br />  * @author 赵学庆,Java世纪|?java2000.net)<br />  *<br />  */<br /> public class T {<br />   public static void main(String[] args) {<br />     // 启动U程<br />     MyThread thread = new MyThread();<br />     new Thread(thread).start();</p> <p><br />     // 你的其它的工作,此时U程在运行中</p> <p><br />     // 你不惌U程q活了,停掉?br />     // 注意Q这只是一个标志,具体U程何时停,q不能精控?br />     thread.allDone = true;</p> <p><br />   }</p> <p><br /> }</p> <p><br /> class MyThread implements Runnable {<br />   boolean volatile allDone = false;</p> <p><br />   public void run() {<br />     // 每次循环都检标?br />     // 如果讄停止标志时已l在循环?br />     // 则最镉K要等待一个@环的旉才能l止<br />     while (!allDone) {<br />       // 循环里的工作<br />     }<br />   }<br /> }</p> <p><br /> 本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/phphot/archive/2008/10/30/3187042.aspx</p> <img src ="http://www.tkk7.com/jlin/aggbug/318201.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/jlin/" target="_blank">fly</a> 2010-04-13 22:28 <a href="http://www.tkk7.com/jlin/articles/318201.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java URL 讉Khttp://www.tkk7.com/jlin/articles/317247.htmlflyflyThu, 01 Apr 2010 17:14:00 GMThttp://www.tkk7.com/jlin/articles/317247.htmlhttp://www.tkk7.com/jlin/comments/317247.htmlhttp://www.tkk7.com/jlin/articles/317247.html#Feedback0http://www.tkk7.com/jlin/comments/commentRss/317247.htmlhttp://www.tkk7.com/jlin/services/trackbacks/317247.html/**
 *
 */
package com.lin;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;

import javax.net.ssl.SSLHandshakeException;

/**
 * @author lin
 *
 */
public class TestURL {

 /**
  * @param args
  */
 public static void main(String[] args)   {
  String result = "";
  try {
   java.net.URL url = new java.net.URL("    HttpURLConnection httpConn = (HttpURLConnection) url
     .openConnection();
   httpConn.setDoOutput(true);
   httpConn.setDoInput(true);
   httpConn.setRequestMethod("POST");
   PrintWriter out = new PrintWriter(httpConn.getOutputStream());
   out.println("Email=test@gmail.com" +"password=123456");
   out.flush();
   out.close();
   BufferedReader in = new BufferedReader(new InputStreamReader(
     httpConn.getInputStream(), "UTF-8"));
   String line;
   while ((line = in.readLine()) != null) {
    result += line + "\n";
   }
   System.out.println("result: " + result);
   in.close();
    }catch(SSLHandshakeException se){
   System.out.println("error is open");
  }
  catch (Exception e) {
   System.out.println("sucess " + e);
  }

 }
}



fly 2010-04-02 01:14 发表评论
]]>
Java反射l典实例 Java Reflection Cookbookhttp://www.tkk7.com/jlin/articles/311378.htmlflyflySun, 31 Jan 2010 05:06:00 GMThttp://www.tkk7.com/jlin/articles/311378.htmlhttp://www.tkk7.com/jlin/comments/311378.htmlhttp://www.tkk7.com/jlin/articles/311378.html#Feedback0http://www.tkk7.com/jlin/comments/commentRss/311378.htmlhttp://www.tkk7.com/jlin/services/trackbacks/311378.htmlJava提供了一套机制来动态执行方法和构造方法,以及数组操作{,q套机制叫——反。反机制是如今很多行框架的实现基Q其中包括Spring、Hibernate{。原理性的问题不是本文的重点,接下来让我们在实例中学习q套_ֽ的机制?/p>

1. 得到某个对象的属?/p>

1 public Object getProperty(Object owner, String fieldName) throws Exception {
2     Class ownerClass = owner.getClass();
3
4     Field field = ownerClass.getField(fieldName);
5
6     Object property = field.get(owner);
7
8     return property;
9 }
Class ownerClass = owner.getClass()Q得到该对象的Class?/p>

Field field = ownerClass.getField(fieldName)Q通过Class得到cd明的属性?/p>

Object property = field.get(owner)Q通过对象得到该属性的实例Q如果这个属性是非公有的Q这里会报IllegalAccessException?/p>

 

2. 得到某个cȝ静态属?/p>

 1 public Object getStaticProperty(String className, String fieldName)
 2             throws Exception {
 3     Class ownerClass = Class.forName(className);
 4
 5     Field field = ownerClass.getField(fieldName);
 6
 7     Object property = field.get(ownerClass);
 8
 9     return property;
10 }

Class ownerClass = Class.forName(className) Q首先得到这个类的Class?/p>

Field field = ownerClass.getField(fieldName)Q和上面一P通过Class得到cd明的属性?/p>

Object property = field.get(ownerClass) Q这里和上面有些不同Q因属性是静态的Q所以直接从cȝClass里取?/p>


3. 执行某对象的Ҏ

 1 public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception {
 2
 3     Class ownerClass = owner.getClass();
 4
 5     Class[] argsClass = new Class[args.length];
 6
 7     for (int i = 0, j = args.length; i < j; i++) {
 8         argsClass[i] = args[i].getClass();
 9     }
10
11     Method method = ownerClass.getMethod(methodName, argsClass);
12
13     return method.invoke(owner, args);
14 }
Class owner_class = owner.getClass() Q首先还是必d到这个对象的Class?/p>

5?行:配置参数的Class数组Q作为寻找Method的条件?/p>

Method method = ownerClass.getMethod(methodName, argsClass)Q通过Method名和参数的Class数组得到要执行的Method?/p>

method.invoke(owner, args)Q执行该MethodQinvokeҎ的参数是执行q个Ҏ的对象,和参数数l。返回值是ObjectQ也既是该方法的q回倹{?/p>


4. 执行某个cȝ静态方?/p>

 1 public Object invokeStaticMethod(String className, String methodName,
 2             Object[] args) throws Exception {
 3     Class ownerClass = Class.forName(className);
 4
 5     Class[] argsClass = new Class[args.length];
 6
 7     for (int i = 0, j = args.length; i < j; i++) {
 8         argsClass[i] = args[i].getClass();
 9     }
10
11     Method method = ownerClass.getMethod(methodName, argsClass);
12
13     return method.invoke(null, args);
14 }

基本的原理和实例3相同Q不同点是最后一行,invoke的一个参数是nullQ因是静态方法,不需要借助实例q行?/p>

 

5. 新徏实例
 1
 2 public Object newInstance(String className, Object[] args) throws Exception {
 3     Class newoneClass = Class.forName(className);
 4
 5     Class[] argsClass = new Class[args.length];
 6
 7     for (int i = 0, j = args.length; i < j; i++) {
 8         argsClass[i] = args[i].getClass();
 9     }
10
11     Constructor cons = newoneClass.getConstructor(argsClass);
12
13     return cons.newInstance(args);
14
15 }

q里说的Ҏ是执行带参数的构造函数来新徏实例的方法。如果不需要参敎ͼ可以直接使用newoneClass.newInstance()来实现?/p>

Class newoneClass = Class.forName(className)Q第一步,得到要构造的实例的Class?/p>

W?~第9行:得到参数的Class数组?/p>

Constructor cons = newoneClass.getConstructor(argsClass)Q得到构造子?/p>

cons.newInstance(args)Q新建实例?/p>


6. 判断是否为某个类的实?/p>

1 public boolean isInstance(Object obj, Class cls) {
2     return cls.isInstance(obj);
3 }


7. 得到数组中的某个元素
1 public Object getByArray(Object array, int index) {
2     return Array.get(array,index);
3 }


附完整源码:

import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;


/**
 * Java Reflection Cookbook
 *
 * @author Michael Lee
 * @since 2006-8-23
 * @version 0.1a
 */

public class Reflection {
    /**
     * 得到某个对象的公共属?br />      *
     * @param owner, fieldName
     * @return 该属性对?br />      * @throws Exception
     *
     */
    public Object getProperty(Object owner, String fieldName) throws Exception {
        Class ownerClass = owner.getClass();

        Field field = ownerClass.getField(fieldName);

        Object property = field.get(owner);

        return property;
    }

    /**
     * 得到某类的静态公共属?br />      *
     * @param className   cd
     * @param fieldName   属性名
     * @return 该属性对?br />      * @throws Exception
     */
    public Object getStaticProperty(String className, String fieldName)
            throws Exception {
        Class ownerClass = Class.forName(className);

        Field field = ownerClass.getField(fieldName);

        Object property = field.get(ownerClass);

        return property;
    }


    /**
     * 执行某对象方?br />      *
     * @param owner
     *            对象
     * @param methodName
     *            Ҏ?br />      * @param args
     *            参数
     * @return Ҏq回?br />      * @throws Exception
     */
    public Object invokeMethod(Object owner, String methodName, Object[] args)
            throws Exception {

        Class ownerClass = owner.getClass();

        Class[] argsClass = new Class[args.length];

        for (int i = 0, j = args.length; i < j; i++) {
            argsClass[i] = args[i].getClass();
        }

        Method method = ownerClass.getMethod(methodName, argsClass);

        return method.invoke(owner, args);
    }


      /**
     * 执行某类的静态方?br />      *
     * @param className
     *            cd
     * @param methodName
     *            Ҏ?br />      * @param args
     *            参数数组
     * @return 执行Ҏq回的结?br />      * @throws Exception
     */
    public Object invokeStaticMethod(String className, String methodName,
            Object[] args) throws Exception {
        Class ownerClass = Class.forName(className);

        Class[] argsClass = new Class[args.length];

        for (int i = 0, j = args.length; i < j; i++) {
            argsClass[i] = args[i].getClass();
        }

        Method method = ownerClass.getMethod(methodName, argsClass);

        return method.invoke(null, args);
    }

 

    /**
     * 新徏实例
     *
     * @param className
     *            cd
     * @param args
     *            构造函数的参数
     * @return 新徏的实?br />      * @throws Exception
     */
    public Object newInstance(String className, Object[] args) throws Exception {
        Class newoneClass = Class.forName(className);

        Class[] argsClass = new Class[args.length];

        for (int i = 0, j = args.length; i < j; i++) {
            argsClass[i] = args[i].getClass();
        }

        Constructor cons = newoneClass.getConstructor(argsClass);

        return cons.newInstance(args);

    }


   
    /**
     * 是不是某个类的实?br />      * @param obj 实例
     * @param cls c?br />      * @return 如果 obj 是此cȝ实例Q则q回 true
     */
    public boolean isInstance(Object obj, Class cls) {
        return cls.isInstance(obj);
    }
   
    /**
     * 得到数组中的某个元素
     * @param array 数组
     * @param index 索引
     * @return q回指定数组对象中烦引组件的?br />      */
    public Object getByArray(Object array, int index) {
        return Array.get(array,index);
    }
}

本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/nomads/archive/2006/09/05/1178867.aspx



fly 2010-01-31 13:06 发表评论
]]>
Spring-搞定bean加蝲( ?http://www.tkk7.com/jlin/articles/298269.htmlflyflyWed, 14 Oct 2009 10:01:00 GMThttp://www.tkk7.com/jlin/articles/298269.htmlhttp://www.tkk7.com/jlin/comments/298269.htmlhttp://www.tkk7.com/jlin/articles/298269.html#Feedback0http://www.tkk7.com/jlin/comments/commentRss/298269.htmlhttp://www.tkk7.com/jlin/services/trackbacks/298269.htmlspring的IOC非常的强大。。特别是理Web目中的自动加蝲?/p>

但是实际应用中,可能会碰到这样两cȝ问题Q?/p>

1.写UnitTest的时候,需要脱d器,手动dxml文g加蝲bean?/p>

2.在一个Web容器中,可能某个q了spring理Q也是一个非beanQ的c,需要感知ƈd某个springҎ的bean?/p>

 

下面转了2文章,分别是对应上?个问题的解决Ҏ

 

http://hi.baidu.com/%C9%CF%B5%DB%D2%B2%B7%B8%C0%A7/blog/item/f934474a104c3e2008f7ef66.html

Spring中读取bean配置文g的几U方?nbsp;   

BeanFactory允许InputStream作ؓ构造函数的参数Q也可以org.springframework.core.io.Resource接口。下面这个例子是用ClassPathResource作ؓ参数Q?br /> Resource resource = new ClassPathResource("bean.xml");
BeanFactory factory = new XmlBeanFactory(resource);
ActionBean action = (ActionBean) factory.getBean("actionBean");

如果同一个Bean在配|文件有多个bean的定义,则用下面的方法取得所有的对象Q?br /> Resource resource = new ClassPathResource("bean.xml");
ListableBeanFactory factory = new XmlBeanFactory(resource);
      
Map helloBeans = factory.getBeansOfType(ActionBean.class, false, false);


    一个应用程序中往往有很多的Bean要放在配|文Ӟ如果所有的Bean都放在一个文件中Q维护v来就相当的麻烦,q时我们可以按照模块把每个模块用到Bean攑ֈ不同的配|文ӞSpring提供了相应的ҎQ?br /> BeanDefinitionRegistry reg = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(reg);
  
// 載入bean定義?nbsp; 
reader.loadBeanDefinitions(new ClassPathResource("bean1.xml"));
reader.loadBeanDefinitions(new ClassPathResource("bean2.xml"));
....

// 取得Bean
BeanFactory bf = (BeanFactory) reg;
Object o = bf.getBean("actionBean");

===================================================================

d配置文g的几U方?br /> 在读spring in aciton Ӟ他用的BeanFactory factory = new XmlBeanFactory(new FileInputStream("hello.xml"));
可是现在的用?.2.6版本的构造器(XmlBeanFactory)只能接收Resource接口了,所以调不出来是正常的事情,假设现在有一个文件hello.xml

1:ApplicationContext cx=new FileSystemXmlApplicationContext("hello.xml");//指定的\径去找文?br /> 2:ApplicationContext factory = new ClassPathXmlApplicationContext("hello.xml");//q会在classpathL
3:Resource fa = new FileSystemResource("hello.xml");
BeanFactory factory=new XmlBeanFactory(fa);
4:q个要设制classpath了,ȝ
  Resource res = new ClassPathResource("com/springinaction/chapter01/hello/hello.xml");
  BeanFactory factory=new XmlBeanFactory(res);
好了Q用了上面那U方法都可以调用getBean("your bean name")了,
eg: BeanFactory factory=new XmlBeanFactory(fa);
      hello he=(hello)factory.getBean("hello");
              he.getHello();

================================================================================

 

 

 

 

贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰?/p>

http://babycountry.spaces.live.com/blog/cns!18767b1e2eb6d0e1!236.entry

spring d注册bean的一些方??
       我现在在做的东西,主要用到了框架是struts2+hibernate+spring开发一个上?下蝲,播放视频,听歌的东?在做到获得到注册bean的时?我想通过在web.xml配置context-param中获?但老也不成?后来在网站上看到别h写的,共同分n:
          通过几个目的实跉|ȝ一下几U获得spring里注册Bean的方法:
一Q方法一Q多在struts框架中)l承BaseDispatchAction
1234567891011121314151617181920212223242526272829303132333435363738394041 package com.mas.wawacommunity.wap.web.action;
 
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionServlet;
import org.apache.struts.actions.DispatchAction;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
 
import com.mas.wawacommunity.wap.service.UserManager;
 
public class BaseDispatchAction extends DispatchAction {
    /**
    * web应用上下文环境变?br />     */
    protected WebApplicationContext ctx;
 
    protected UserManager userMgr;
 
    /**
    * 获得注册Bean    
    * @param beanName String 注册Bean的名U?br />     * @return
    */
    protected final Object getBean(String beanName) {
        return ctx.getBean(beanName);
    }
 
    protected ActionForward unspecified(ActionMapping mapping, ActionForm form,
              javax.servlet.http.HttpServletRequest request,
              javax.servlet.http.HttpServletResponse response) {    
        return mapping.findForward("index");
    }
 
    public void setServlet(ActionServlet servlet) {
        this.servlet = servlet;
        this.ctx = WebApplicationContextUtils.getWebApplicationContext(servlet.getServletContext());
        this.userMgr = (UserManager) getBean("userManager");
    }        
}
 

action调用Q?
123456789101112131415161718192021222324252627282930313233343536373839 package com.mas.wawacommunity.wap.web.action;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionServlet;
 
import com.mas.wawacommunity.wap.model.News;
import com.mas.wawacommunity.wap.service.NewsManager;
 
public class NewsAction extends BaseDispatchAction {
  NewsManager newsManager;      
   
    public void setServlet(ActionServlet servlet) {
        super.setServlet(servlet);
        newsManager = (NewsManager) this.getBean("newsManager");        
  }
   
    /**
    * 得到新闻列表
    * @param mapping
    * @param form
    * @param request
    * @param resp
    * @return
    */
    public ActionForward getNewsList(ActionMapping mapping, ActionForm form,
        HttpServletRequest request, HttpServletResponse resp) {
        int category = Text.parseInt(request, "category", 0);
        int pageNo = Text.parseInt(request, "pageNo", 1);
        int pageSize = Text.parseInt(request, "pageSize", 9);
        PageRoll pageRoll = newsManager.getAllNews(category, pageNo, pageSize);              
        request.setAttribute("pageRoll", pageRoll);
        return mapping.findForward("news.list");
    }
}
 


二:Ҏ二实现BeanFactoryAware
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 package com.anymusic.oa.commons.service;
 
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
 
/**
* Created by IntelliJ IDEA.
* User: Weany
* Date: 2006-4-2
* Time: 2:46:51
* To change this template use File | Settings | File Templates.
*/
public class ServiceLocator implements BeanFactoryAware {
    private static BeanFactory beanFactory = null;
 
    private static ServiceLocator servlocator = null;
 
    public void setBeanFactory(BeanFactory factory) throws BeansException {
        this.beanFactory = factory;
    }
 
    public BeanFactory getBeanFactory() {
        return beanFactory;
    }
 
    /**
    * 创徏dBean服务cd?从spring.xml中加?
    * <bean id="serviceLocator" class="com.am.oa.commons.service.ServiceLocator" singleton="true" />
    */
    public static ServiceLocator getInstance() {
        if (servlocator == null)
              servlocator = (ServiceLocator) beanFactory.getBean("serviceLocator");
        return servlocator;
    }
 
    /**
    * Ҏ提供的bean名称得到相应的服务类    
    * @param servName bean名称    
    */
    public static Object getService(String servName) {
        return beanFactory.getBean(servName);
    }
 
    /**
    * Ҏ提供的bean名称得到对应于指定类型的服务c?br />     * @param servName bean名称
    * @param clazz q回的beancd,若类型不匚w,抛出异?br />     */
    public static Object getService(String servName, Class clazz) {
        return beanFactory.getBean(servName, clazz);
    }
}
 


action调用:
1234567891011121314151617181920212223242526272829303132333435363738 package com.anymusic.oa.webwork;
 
import java.util.List;
import java.util.Map;
 
import javax.servlet.http.HttpServletRequest;
 
import com.anymusic.oa.commons.service.ServiceLocator;
import com.anymusic.oa.hibernate.pojo.Role;
import com.anymusic.oa.hibernate.pojo.Users;
import com.anymusic.oa.spring.IUserService;
import com.opensymphony.webwork.ServletActionContext;
import com.opensymphony.xwork.Action;
import com.opensymphony.xwork.ActionContext;
import com.opensymphony.xwork.ModelDriven;
 
public class UserAction extends BaseAction implements Action,ModelDriven{
   
    private Users user = new Users();
    protected ServiceLocator service = ServiceLocator.getInstance();
    UserService userService = (UserService)service.getService("userService");
 
    public String execute() throws Exception {        
        return SUCCESS;
    }
 
  public Object getModel() {
        return user;
    }    
   
    public String getAllUser(){
        HttpServletRequest request = ServletActionContext.getRequest();        
        List ls=userService.LoadAllObject( Users.class );
        request.setAttribute("user",ls);    
        this.setUrl("/yonghu.jsp");
        return SUCCESS;
    }
}
 


三:Ҏ三实现ApplicationContextAware

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 package com.easou.framework.common.util;
 
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
 
public class SpringContextUtil implements ApplicationContextAware {
  private static ApplicationContext applicationContext;     //Spring应用上下文环?br />  
  /**
  * 实现ApplicationContextAware接口的回调方法,讄上下文环?nbsp; 
  * @param applicationContext
  * @throws BeansException
  */
  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    SpringContextUtil.applicationContext = applicationContext;
  }
 
  /**
  * @return ApplicationContext
  */
  public static ApplicationContext getApplicationContext() {
    return applicationContext;
  }
 
  /**
  * 获取对象  
  * @param name
  * @return Object 一个以所l名字注册的bean的实?br />   * @throws BeansException
  */
  public static Object getBean(String name) throws BeansException {
    return applicationContext.getBean(name);
  }
 
  /**
  * 获取cd为requiredType的对?br />   * 如果bean不能被类型{换,相应的异常将会被抛出QBeanNotOfRequiredTypeExceptionQ?br />   * @param name       bean注册?br />   * @param requiredType q回对象cd
  * @return Object q回requiredTypecd对象
  * @throws BeansException
  */
  public static Object getBean(String name, Class requiredType) throws BeansException {
    return applicationContext.getBean(name, requiredType);
  }
 
  /**
  * 如果BeanFactory包含一个与所l名U匹配的bean定义Q则q回true
  * @param name
  * @return boolean
  */
  public static boolean containsBean(String name) {
    return applicationContext.containsBean(name);
  }
 
  /**
  * 判断以给定名字注册的bean定义是一个singletonq是一个prototype?br />   * 如果与给定名字相应的bean定义没有被找刎ͼ会抛出一个异常(NoSuchBeanDefinitionExceptionQ?nbsp; 
  * @param name
  * @return boolean
  * @throws NoSuchBeanDefinitionException
  */
  public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
    return applicationContext.isSingleton(name);
  }
 
  /**
  * @param name
  * @return Class 注册对象的类?br />   * @throws NoSuchBeanDefinitionException
  */
  public static Class getType(String name) throws NoSuchBeanDefinitionException {
    return applicationContext.getType(name);
  }
 
  /**
  * 如果l定的bean名字在bean定义中有别名Q则q回q些别名  
  * @param name
  * @return
  * @throws NoSuchBeanDefinitionException
  */
  public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {
    return applicationContext.getAliases(name);
  }
}
 

 

action调用Q?
1234567891011121314151617181920212223242526272829303132333435363738 package com.anymusic.oa.webwork;
 
import java.util.List;
import java.util.Map;
 
import javax.servlet.http.HttpServletRequest;
 
import com.anymusic.oa.commons.service.ServiceLocator;
import com.anymusic.oa.hibernate.pojo.Role;
import com.anymusic.oa.hibernate.pojo.Users;
import com.anymusic.oa.spring.IUserService;
import com.opensymphony.webwork.ServletActionContext;
import com.opensymphony.xwork.Action;
import com.opensymphony.xwork.ActionContext;
import com.opensymphony.xwork.ModelDriven;
 
public class UserAction extends BaseAction implements Action,ModelDriven{
   
    private Users user = new Users();    
    UserService userService = (UserService) SpringContextUtil.getBean("userService");
   
    public String execute() throws Exception {        
        return SUCCESS;
    }
 
  public Object getModel() {
        return user;
    }    
   
    public String getAllUser(){
        HttpServletRequest request = ServletActionContext.getRequest();        
        List ls=userService.LoadAllObject( Users.class );
        request.setAttribute("user",ls);    
        this.setUrl("/yonghu.jsp");
        return SUCCESS;
    }
}
 


本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/d8111/archive/2008/08/31/2856601.aspx



fly 2009-10-14 18:01 发表评论
]]>
Java对象排序Q{Q?/title><link>http://www.tkk7.com/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.tkk7.com/jlin/articles/293760.html</guid><wfw:comment>http://www.tkk7.com/jlin/comments/293760.html</wfw:comment><comments>http://www.tkk7.com/jlin/articles/293760.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/jlin/comments/commentRss/293760.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/jlin/services/trackbacks/293760.html</trackback:ping><description><![CDATA[<div id="kgu8sg6" class="tit">Java对象排序?U实现方?/div> <div id="aicoeyu" class="date">2009-05-01 23:13</div> <table style="table-layout: fixed; width: 100%"> <tbody> <tr> <td> <div id="6c6ywww" class="cnt" id="blog_text">/*** Java对象排序?U实现方?/ <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)实现Q必d现Comparator的一个比较器q复写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<Person1> pl = new ArrayList<Person1>();<br /> for(int i = 0; i < 10; i++){<br /> System.out.print(ps[i].getAge());<br /> pl.add(ps[i]);<br /> }<br /> System.out.println("n使用Collections.sort(List, Comparator)cL比较Q?);<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接口q复写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[])cL比较Q?);<br /> long l2 = System.currentTimeMillis();<br /> Arrays.sort(ps2);<br /> System.out.println("time: " + (System.currentTimeMillis() - l2));<br /> <br /> for(int i = 0; i < 10; i++){<br /> System.out.print(ps2[i].getAge());<br /> }<br /> </code>    /**Ҏ3</p> <p>  * 使用Collections.sort(List)实现Q对象必d现Comparable接口q复写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<Person2> pl3 = new ArrayList<Person2>();<br /> for(int i = 0; i < 10; i++){<br /> pl3.add(ps3[i]);<br /> }<br /> System.out.println("n使用Collections.sort(List)cL比较Q?);<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() < 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 < 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.tkk7.com/jlin/aggbug/293760.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/jlin/" target="_blank">fly</a> 2009-09-03 17:06 <a href="http://www.tkk7.com/jlin/articles/293760.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jcom打印http://www.tkk7.com/jlin/articles/265783.htmlflyflyWed, 15 Apr 2009 08:36:00 GMThttp://www.tkk7.com/jlin/articles/265783.htmlhttp://www.tkk7.com/jlin/comments/265783.htmlhttp://www.tkk7.com/jlin/articles/265783.html#Feedback0http://www.tkk7.com/jlin/comments/commentRss/265783.htmlhttp://www.tkk7.com/jlin/services/trackbacks/265783.htmljcom打印 /Files/jlin/jcom224.rar

Setup

Extract "jcom222.zip". And copy jcom.jar and jcom.dll to the following directories
jcom.dll -> (java.home)/bin/
jcom.jar -> (java.home)/lib/ext/
make sure the JAVA_HOME evironmental variable has been set, ie.
(java.home) == java.lang.System.getProperty("java.home");

import jp.ne.so_net.ga2.no_ji.jcom.ReleaseManager;
import jp.ne.so_net.ga2.no_ji.jcom.excel8.ExcelApplication;
import jp.ne.so_net.ga2.no_ji.jcom.excel8.ExcelWorkbook;
import jp.ne.so_net.ga2.no_ji.jcom.excel8.ExcelWorkbooks;
import jp.ne.so_net.ga2.no_ji.jcom.excel8.ExcelWorksheet;

public class JCom {

 public boolean print(String fname) {
  ReleaseManager rm = new ReleaseManager();
  try {
   ExcelApplication excel = new ExcelApplication(rm);

   ExcelWorkbooks xlBooks = excel.Workbooks();
   ExcelWorkbook xlBook = xlBooks.Open(fname);
   ExcelWorksheet xlSheet = excel.ActiveSheet();

   xlSheet.PrintOut();

   xlBook.Close(false, null, false);
   excel.Quit();
  } catch (Exception e) {
   e.printStackTrace();
   return false;
  } finally {
   rm.release();
  }
  return true;
 }

 public static void main(String[] args) {
  JCom test = new JCom();

  try {
   //test.p
   test.print("d:/test.xls");
   
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}



fly 2009-04-15 16:36 发表评论
]]>
Java~程思想学习心得http://www.tkk7.com/jlin/articles/245828.htmlflyflyFri, 12 Dec 2008 00:59:00 GMThttp://www.tkk7.com/jlin/articles/245828.htmlhttp://www.tkk7.com/jlin/comments/245828.htmlhttp://www.tkk7.com/jlin/articles/245828.html#Feedback0http://www.tkk7.com/jlin/comments/commentRss/245828.htmlhttp://www.tkk7.com/jlin/services/trackbacks/245828.htmlJava~程思想学习心得
-----------------------------------------------------------------------------------
2008-12-4
1.java对象存储在栈中基本类型存储在堆栈?br /> 2.作ؓ一个类的成员用时Qjava才确保给定其默认倹{(局部变量不是适应Q?br /> 3.javadoc命o只能始于/** ...*/  为public和protected成员q行文档注释Q?br /> private?#8220;包内可访问成?#8221;的注释会被忽略掉Q但是可以用-private标记来输出?br /> 4.关系操作W?=?=适应所有的对象Q但是他们比较对象的引用是不是相同,如果要比较对象的内容
是否相等的话要用equals()ҎQ如果自己没有改写这个方法的话,q是比较对象的引用?br /> 5.for(int i=0,j=0;i<10&&j!=11;i++,j++),只有for循环才具备在控制表达式里定义变量的能力。其?br /> M条g或@环语句,都不可以采用q种Ҏ?br /> ------------------------------------------------------------------------------------------------
2008-12-5
1.this:关键字的作用。返回本对象的引用,在构造器中调用构造器?br /> 2.所有的对象放于String表达式之中,可以轻易的他们强制{换ؓString的表辑Ş式?br /> 3.如果~译单元完全不带publiccM是可能的Q在q种情况下,你可以随意对文g命名?br /> 4.h意,cL不可以是private的,也不可以是protected的。所以对于类的访问权限,你仅有两个选择Q?br /> 包访问权或者是public。(内部cd以是private或是protected的,q是特例。)
5.Java允许生成I白finalQ是指被声明为final但又未给定初值的数据成员?br /> 如:private final int j;//Blank final 你必d构造方法中Ҏfinalq行赋倹{?br /> cM所有的privateҎ读被隐含是final的?你可以对privateҎ增加final修饰W,但这是无意义的?
6.只有非privateҎ才可以被重蝲Q但是我们要密切注意重蝲privateҎ的现象,虽然~译不会出错Q但?br /> 不回按我们所期望的来执行。在子类中,对于基类中的privateҎQ我们最好用一个不同的名字?br /> ------------------------------------------------------------------------------------------------
2008-12-8
内部cȝҎ:一个类的定义放到另一个类的定义内部?br />   1.如果你想从外部类的非静态方法之外的L位置创徏某个内部cd象你必须象main()Ҏ中的那样Q具体地
  指明q个对象的类型:OuterClassName.InnerClassName?br />   2.可以创徏l承接口的内部匿名类对象?br /> 嵌套c:如果你不需要内部类对象与其外围cd象之间的联系Q你可以内部类声明为static?br />   普通的内部cd象隐含地保存了一个引用,指向它的外围cd象。然而,当内部类为staticӞ情况׃一样了
  嵌套cM为着Q?br />   a. 要创建嵌套类对象Qƈ不需要v外围cȝ对象?br />   b.不能从嵌套类的对象中讉K非静态的外围cd象?br />   c.普通内部类的属性与ҎQ只能放在类的外部层ơ上Q所以普通的内部cM能有static数据和static属性,也不  能包含嵌套类?br /> 局部类部类Q在代码块里创徏的内部类Q局部内部类不能有访问说明符Q它可以讉K当前代码块内的常量,和次外围cL有的成员?br /> 每个内部c都能独立地l承自一个(接口Q实玎ͼ所以无论外围类是否已经l承了某个实玎ͼ对于内部c都无媄响?br /> ------------------------------------------------------------------------------------------------
2008-12-9
1.重新抛出异常会把异常抛给上一U环境中的异常处理程序。同一个try块的后箋catch字句被忽略。此外,异常对象的所有信息读得以保持Q高一U环境中捕获ơ异常的处理E序可以从这里的异常对象中得到所有信息?br /> 2.异常链:捕获一个异常然后抛出另有个异常Qƈ且希望把原始异常的信息保存下来?br /> 3.一个出现在基类Ҏ中的异常说明中的异常Q不一定回出现在派生类Ҏ的异常说明里Q这点同l承的规则不同在l承中,基类的方法必d现在zc里Q在l承和重载过E中Q方法的“异常说明的接?#8221;不是变大了而是变小了?br /> 4.当你重写ҎӞ你只能抛出在父类Ҏ的异常说明里列出的那些异常。因L话,对父c能工作的代码应用到字类对象的时候,一栯工作Q这是面向对象的基本概念Q,异常也不例外?br /> ------------------------------------------------------------------------------------------------
2008-12-10
复制数组Q用System.arraycopy()Q比用for循环复制要快很多?br /> Java提供两种比较功能Q?br /> 1.实现java.lang.Comparable接口?br /> 2.实现java.util.comparator接口?br /> collectionQ一l独立的元素?br /> mapQ一l成对的键值对(key-value)对象
容器的缺点:未知cd。容器只保存object型的引用?br /> ListQ保证维护元素特定的序?br /> ArrayList:数组实现的listQ允许对元素q行快速随问,但是向list中间插入与移除元素很慢?br /> LinkedList:双向链表实现Q向list中间插入与移除元素很快,随机讉K则相对较慢?br /> Set:不保存重复的元素。每个元素都上唯一的,不保证元素的ơ序?br /> HashSet:为快速查找设计的setQ存入Hashset的对象必d义了hashCode().
TreeSet:保持ơ序的Set,底层为数l构。用它可以从Set中提取有序的序列?br /> LinkedHashSetQ具有HashSet的查询速度Q内部用链表维护元素的序Q在使用q代器遍历SetӞ
l果会按元素插入的次序显C?br /> ------------------------------------------------------------------------------------------------
正确的equals()Ҏ必须满下列5个条件?br /> 1.自反性:对Q意的xQx.equals(x)一定返回true?br /> 2.对称性:对于L的xQyQ若y.equals(x)为trueQ则x.equals(y)也ؓture?br /> 3.传递性:对于M非空引用?x、y ?zQ如?x.equals(y) q回 trueQƈ?y.equals(z) q回 trueQ那?x.equals(z) 应返?true?
4.一致性:对于M非空引用?x ?yQ多ơ调?x.equals(y) 始终q回 true 或始l返?falseQ前提是对象?equals 比较中所用的信息没有被修攏V?
5.对于M非空引用?xQx.equals(null) 都应q回 false?
------------------------------------------------------------------------------------------------
2008-12-11
1.匿名内部cL可以实现一个接口,又可以承类(具体cL者抽象类)?br /> 2.如果定义一个匿名内部类Q它要访问在它外部定义的一个变量,q个变量必须使用final关键字来修饰?br /> 如下面的例子:

import java.io.File;
import java.io.FilenameFilter;
import java.util.regex.Pattern;

/**
 * @author lin
 *
 */
public class DirList {
   //not using final in anonymous inner class
   public static FilenameFilter filter(final String regex){//注意此处?final
    return new FilenameFilter(){
  private Pattern pattern = Pattern.compile(regex);
  public boolean accept(File dir, String name) {
          return  pattern.matcher(
         new File(name).getName()).matches();
  }   
    };
   }
 /**
  * @param args
  */
 public static void main(String[] args) {
  File path = new File(".");
  String [] list;
  if(args.length==0)
   list=path.list();
  else
   list=path.list(filter(args[0]));
  for(int i=0;i<list.length;i++)
   System.out.println(list[i]);
 }
}


 



fly 2008-12-12 08:59 发表评论
]]>
Java试题库_Basic2.dochttp://www.tkk7.com/jlin/articles/233714.htmlflyflySat, 11 Oct 2008 02:37:00 GMThttp://www.tkk7.com/jlin/articles/233714.htmlhttp://www.tkk7.com/jlin/comments/233714.htmlhttp://www.tkk7.com/jlin/articles/233714.html#Feedback0http://www.tkk7.com/jlin/comments/commentRss/233714.htmlhttp://www.tkk7.com/jlin/services/trackbacks/233714.html阅读全文

fly 2008-10-11 10:37 发表评论
]]>
Java classpath及package的一Ҏ作(转)http://www.tkk7.com/jlin/articles/233381.htmlflyflyThu, 09 Oct 2008 08:19:00 GMThttp://www.tkk7.com/jlin/articles/233381.htmlhttp://www.tkk7.com/jlin/comments/233381.htmlhttp://www.tkk7.com/jlin/articles/233381.html#Feedback0http://www.tkk7.com/jlin/comments/commentRss/233381.htmlhttp://www.tkk7.com/jlin/services/trackbacks/233381.html public class Hello {
  public static void main(String[] args) {
    System.out.println("Hello, world");
  }

再次保存文g?br /> 在命令行H口中输?br /> cd C:\JavaTest
当前\径{入JavaTest中。然后,输入
javac Hello.java
׃我们是在源代码的当前路径下编译,因此Q不会出现classpath讄有误的问题?br /> 在命令行H口中输入java HelloQ屏q出C
Hello world
因此一切正常。下面我们开始h为地问题复杂化Q在非当前工作\径中~译及运行,看看l果如何?br /> 在命令行H口中输?br /> cd C:
转入到C盘根目录上,当前路径d了存放源码的工作区。输?br /> javac Hello.java
屏幕出现Q?br /> error: cannot read: Hello.java
1 error
找不到Hello.java了。我们要l它指定一个\径,告诉它到C:\JavaTestLHello.java文g。输?br /> javac C:\JavaTest\Hello.java
OKQ这回不报错了,~译成功?br /> 输入
java C:\JavaTest\Hello
q回屏幕出现Q?br /> Exception in thread "main" java.lang.NoClassDefFoundError: C:\JavaTest\Hello
   意思ؓ?#8220;C:\JavaTest\Hello”找不到类的定义。明明C:\JavaTest\Hello是一?class文gQؓ什么就找不到呢Q原来,Java对待.java文g?class文g是有区别的。对.java文g可以直接指定路径l它Q而java命o所需?class文g不能出现扩展名,也不能指定额外的路径l它?br /> 那么Q如何指定\径呢Q对于Java所需?class文gQ必通过classpath来指定?br />    依照W?步,弹出“环境变量”H口Q在用户变量中新Z个变量,变量名ؓ“classpath”Q变量gؓ"C:\JavaTest"。一路按“定”退出。关闭原命o行窗口,打开新的命o行窗口,输入
java Hello
“Hello world”出来了。由此可见,?#8220;环境变量”H口中设|classpath的目的就是告诉JDKQ到哪里d?class文g。这U方法一旦设|好Q以后每ơ运行java或javacӞ在需要调?class文gӞJDK都会自动地来到这里寻找。因此,q是一个全局性的讄?br />
   除了q种在环境变?#8221;H口中设|classpath的方法之外,q有另一U方法,卛_java命o后面加上一个选项classpathQ紧跟着不带扩展名的class文g名。例如,
java -classpath C:\JavaTest Hello
    JDK遇到q种情况Ӟ先根据命令行中的classpath选项中指定的路径d?class文gQ找不到时再到全局的classpath环境变量中去L。这U情况下Q即使是没有讄全局的classpath环境变量Q由于已l在命o行中正确地指定类路径Q也可以q行?br />     Z在下面的例子中更好地演示classpath的问题,我们先将全局的classpath环境变量删除Q而在必要时代之以命o行选项-classpath。弹?#8220;环境变量”H口Q选中“classpath”的变量名Q按“删除”键?br />     此外Qjava命o中还可以用cpQ即classpath的羃写来代替classpathQ如java -cp C:\JavaTest Hello。特别注意的是,JDK 1.5.0之前Qjavac命o不能用cp来代替classpathQ而只能用classpath。而在JDK 1.5.0中,java及javac都可以用cp及classpath。因此,Z持一_一概用classpath作ؓ选项名称?br />
  我们再次Zؓ地复杂化问题。关闭正在编辑Hello.java的记事本Q然后将JavaTest文g夹名U改为带I格?#8220;Java Test”。在命o行中输入
javac C:\Java Test\Hello.java
镉K的洋文又出来了,但这回却是报错了Q?br /> javac: invalid flag: C:\Java
    JDK带有空格的C:\Java Test分隔Z部分"C:\Java"?Test\Hello.java"QƈC:\Java视作Z个无效的选项了。这U情况下Q我们需要将整个路径都加上双引号Q即
javac "C:\Java Test\Hello.java"
q回JDK知道Q引号里面的是一个完整的路径Q因此就不会报错了。同P对java命o也需要如此,?br /> java -classpath "C:\Java Test" Hello
    对于长文件名及中文的文g夹,XP下面可以不加双引受但一般来_加双引号不容易出错,也容易理解,因此Q徏议在classpath选项中用双引号?nbsp;  我们再来?java文g使用了其他类的情c在C:\Java Test中新Z个Person.java文gQ内容如下:
   public class Person {
   private String name;
   public Person(String name) {
    this.name = name;
   }
   public String getName() {
    return name;
   }
 }
然后Q修改Hello.javaQ内容如下:
public class Hello {
  public static void main(String[] args) {
    Person person = new Person("Mike");
    System.out.println(person.getName());
  }

在命令行输入
javac "C:\Java Test\Hello.java"
错误来了Q?br /> C:\Java Test\Hello.java:3: cannot find symbol
symbol: class Person
JDK提示找不到PersoncRؓ什?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)">javac "C:\Java Test\Hello.java"在第14步中可行Q而在q里却不行了呢?W?4步中的Hello.java文gq没有用来其他类Q因此,JDK不需要去L其他c,而到了这里,我们修改了Hello.javaQ让其用了一个PersoncR?/clk>  ҎW?1步,我们需要告诉JDKQ到哪里L所用到的类Q即使这个被使用的类׃Hello.java一P同在C:\Java Test下面Q输?br /> javac -classpath "C:\Java Test" "C:\Java Test\Hello.java"
~译通过QJDK在C:\Java Test文g夹下同时生成了Hello.class及Person.class两个文g。实际上Q由于Hello.java使用了Person.javac,JDK先编译生成了Person.classQ然后再~译生成Hello.class。因此,不管Hello.javaq个ȝ使用了多个其他c,只要~译q个c,JDK׃自动~译其他c,很方ѝ输?br /> java -classpath "C:\Java Test" Hello
屏幕出现?br /> Mike
成功?br />    说明了在Hello.java中如何用一个我们自己创建的Person.javaQ而且q个cMHello.java是同在一个文件夹下。在q一步中Q我们将考查Person.java如果攑֜不同文g夹下面的情况?br /> 先将C:\Java Test文g夹下的Person.class文g删除Q然后在C:\Java Test文g夹下新徏一个名为DF的文件夹QƈC:\Java Test文g夹下的Person.javaUd到其下面。在命o行输?br /> javac -classpath "C:\Java Test\DF" "C:\Java Test\Hello.java" Q注意这里不用;区分Q用I格可以!Q?/span>
~译通过。这时javac命o没有什么不同,只需classpathҎC:\Java Test\DFp了?br /> 在命令行输入
java -classpath "C:\Java Test" Hello
    q时׃Java需要找在不同文件夹下的两个.class文gQ而命令行中只告诉JDK一个\径,即C:\Java TestQ在此文件夹下,只能扑ֈHello.classQ找不到Person.class文gQ因此,错误是可以预料得到的Q?br /> Exception in thread "main" java.lang.NoClassDefFoundError: Person
        at Hello.main(Hello.java:3)
    果真找不到Person.class?span style="color: red">在设|两个以上的classpathӞ先将每个路径以双引号引v来,再将q些路径?#8220;;”号隔开Qƈ且每个\径与“;”之间不能带有I格。因此,我们在命令行重新输入Q?br />
java -classpath "C:\Java Test";"C:\Java Test\DF" Hello
    ~译成功。但也暴露出一个问题,如果我们需要用到许多分处于不同文g夹下的类Q那q个classpath的设|岂不是很长Q有没有办法Q对于一个文件夹下的所?class文gQ只指定q个文g夹的classpathQ然后让JDK自动搜烦此文件夹下面所有相应的路径Q有Q只要用package?br />     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)">解决命名冲突的问题。比如说Q在我们的例子中Q我们设计了一个很单的Personc,如果某h开发了一个类库,其中恰y也有一个Personc,当我们用这个类库时Q两个PersoncdC命名冲突QJDK不知道我们到底要使用哪个PersoncR更有甚者,当我们也开发了一个很庞大的类库,无可避免圎ͼ我们的类库中与其他h开发的cd中命名冲H的情况׃来多。M能ؓ了避免自qcd与其他h开发的cd相同Q而让每个~程人员都绞脑汁地一个本应叫Writer的类改名为SarkuyaWriterQMikeWriter, SmithWriter吧?
   自定义package的名U可以由各个E序员自由创建。作为避免命名冲H的手段Qpackage的名U最好以与其他E序员的区别开来。在互联|上Q每个域名都是唯一的,因此QSun推荐你自己的域名倒写后作为package的名U。如果你没有自己的域名,很可能只是因为囊中羞涩而不ȝLŞ了,q不见得你假想的域名与其他域名发生冲H。例如,W者假想的域名是sarkuya.comQ目前就是唯一的,因此我的package可以定名ؓcom.sarkuya。谢谢Javal了我们一个免费用我们自己域名的ZQ唯一的前提是倒着写。当Ӟ每个package下面q可以带有不同的子packageQ如com.sarkuya.utilQcom.sarkuya.swingQ等{?br />     定义package的方式是在相应的.java文g的第一行加?#8220;package packagename;”的字P而且每个.java文g只能有一个package。实际上QJava中的package的实现是与计机文gpȝ相结合的Q即你有什么样的packageQ在上就有什么样的存放\径。例如,某个cȝpackage名ؓcom.sarkuya.utilQ那么,q个cd应该必须存放在com/sarkuya/util的\径下面。至于这个com/sarkuya/util又是哪个文g夹的子\径,
    package除了有避免命名冲H的问题外,q引甛_一个保护当前package下所有类文g的功能,主要通过为类定义几种可视度不同的修饰W来实现Qpublic, protected, private, 另外加上一个ƈ不真实存在的friendlycd?br />
    对于冠以public的类、类属变量及ҎQ包内及包外的Q何类均可以访问;protected的类、类属变量及ҎQ包内的Mc,及包外的那些l承了此cȝ子类才能讉KQprivate的类、类属变量及ҎQ包内包外的Mcd不能讉KQ如果一个类、类属变量及Ҏ不以q三U修饰符来修饎ͼ它就是friendlycd的,那么包内的Q何类都可以访问它Q而包外的Mc都不能讉K?包括包外l承了此cȝ子类)Q因此,q种cR类属变量及Ҏ对包内的其他cL友好的,开攄Q而对包外的其他类是关闭的?br />
    前面说过Qpackage主要是ؓ了解军_名冲H的问题Q因此,处在不同的包里面的类Ҏ不用担心与其他包的类名发生冲H,因ؓJDK在默认情况下只用本包下面的c,对于其他包,JDK一概视而不见:“g见心不烦”。如果要引用其他包的c,必通过import来引入其他包中相应的cR只有在q时QJDK才会q行q一步的审查Q即Ҏ其他包中的这些类、类属变量及Ҏ的可视度来审查是否符合用要求。如果此审查通不q,~译此卡住Q直至你攑ּ使用q些cR类属变量及ҎQ或者将被引入的cR类属变量及Ҏ的修饰符改ؓW合要求为止。如果此审查通过QJDK最后进行命名是否冲H的审查。如果发现命名冲H,你可以通过在代码中引用全名的方式来昑ּ地引用相应的c,如?br /> java.util.Date = new java.util.Date()
  package的第三大作用是简化classpath的设|。还C面的命oQ这里重新引用其java命oQ?br /> java -classpath "C:\Java Test";"C:\Java Test\DF" Hello

    我们必须所有的.class文g的\径一一告诉JDKQ而不DF其实是C:\Java Test的子目录。如果要用到100个不同\径的.class文gQ我们就得将classpath讄Z个特别长的字W串Q很累。package的引入,很好地解决了q个问题。package的与classpath相结合,通过import指oZ介,原来必ȝclasspath完成的类路径搜烦功能Q很巧妙地{Udimport的n上,从而classpath的设|简z明了。我们先看下面的例子?br />  先在Hello.java中导入DF.Person。代码修改如下:
  import DF.Person;
 public class Hello {
  public static void main(String[] args) {
    Person person = new Person("Mike");
    System.out.println(person.getName());
  }

再将DF子文件夹中的Person.java讄一个DF包。代码修改如下:
package DF;
public class Person {
  private String name;
  public Person(String name) {
    this.name = name;
  }
  public String getName() {
    return name;
  }

好了Q神奇的命o行出CQ?br />
javac -classpath "C:\Java Test" "C:\Java Test\Hello.java"
java -classpath "C:\Java Test" Hello
Q在我的jdk1.6上,没有讄classpathQ上面的两条命o可以化ؓQ?br />    javac  Hello.java
   java    Hello
 呵呵Q不知道是什么原因啊Q?br /> Q?br />


fly 2008-10-09 16:19 发表评论
]]>
վ֩ģ壺 ӰԺ߲| 2048޾Ʒ| ĻСۺ| Ƶ| av߲| ƷСƵapp| ޾Ʒþþ| caopormѹƵ| ߹ۿ| ³ѲƵ㽶| ¹AVר| þ99ëƬѹۿ| һ| hƵ߹ۿ| ޾ƷۺϾþþþý| һëƬһëƬaa| gogo߹ۿ| ҹƷһ| ŮߵƵѹۿڵ| Ʒպþ| ѿƬ| Ƶ| ӰԺ߹ۿ| Ƶվ| ˳ɳƵ| ޹Ʒ߹ۿ| ëƬ| ɫͷۺƵ| þҹɫƷAV̬ͼ| ѿƵվ| ˬָ߳ˮƵ| ޾ƷĻþò| 㽶ѾƷƵ| ɫëƬƵ| Ƶ߹ۿַ| aƵapp| aëƬȫ| պ޹ۺϸ| ߾Ʒһ | ձþþѸ| þѹۿƵ|