﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-点点黑黑</title><link>http://www.blogjava.net/cx361/</link><description>黑黑博客</description><language>zh-cn</language><lastBuildDate>Mon, 06 Apr 2026 14:12:44 GMT</lastBuildDate><pubDate>Mon, 06 Apr 2026 14:12:44 GMT</pubDate><ttl>60</ttl><item><title>Java编程中“为了性能”要做的几点 </title><link>http://www.blogjava.net/cx361/archive/2012/04/05/373377.html</link><dc:creator>脉凌网络</dc:creator><author>脉凌网络</author><pubDate>Thu, 05 Apr 2012 08:07:00 GMT</pubDate><guid>http://www.blogjava.net/cx361/archive/2012/04/05/373377.html</guid><wfw:comment>http://www.blogjava.net/cx361/comments/373377.html</wfw:comment><comments>http://www.blogjava.net/cx361/archive/2012/04/05/373377.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cx361/comments/commentRss/373377.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cx361/services/trackbacks/373377.html</trackback:ping><description><![CDATA[<span style="color: #000000">最近的机器内存又爆满了，除了新增机器内存外，还应该好好review一下我们的代码，有很多代码编写过于随意化，这些不好的习惯或对程序语言的不了解是应该好好打压打压了。</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 下面是参考网络资源总结的一些在</span><font color="#0000ff"><span style="color: #000000">Java</span></font><span style="color: #000000">编程中尽可能要做到的一些地方。</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 1. 尽量在合适的场合使用单例</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 使用单例可以减轻加载的负担，缩短加载的时间，提高加载的效率，但并不是所有地方都适用于单例，简单来说，单例主要适用于以下三个方面：</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 第一，控制资源的使用，通过线程同步来控制资源的并发访问；</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 第二，控制实例的产生，以达到节约资源的目的；</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 第三，控制数据共享，在不建立直接关联的条件下，让多个不相关的进程或线程之间实现通信。</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 2. 尽量避免随意使用静态变量</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 要知道，当某个对象被定义为stataic变量所引用，那么gc通常是不会回收这个对象所占有的内存，如</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; public class A{&nbsp; static B b = new B（）；&nbsp; } 此时静态变量b的生命周期与A类同步，如果A类不会卸载，那么b对象会常驻内存，直到程序终止。</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 3. 尽量避免过多过常的创建</span><font color="#0000ff"><span style="color: #000000">Java</span></font><span style="color: #000000">对象</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 尽量避免在经常调用的方法，循环中new对象，由于系统不仅要花费时间来创建对象，而且还要花时间对这些对象进行垃圾回收和处理，在我们可以控制的范围内，最大限度的重用对象，最好能用基本的数据类型或数组来替代对象。</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 4. 尽量使用final修饰符</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 带有final修饰符的类是不可派生的。在Java核心API中，有许多应用final的例子，例如java.lang.String.为String类指定final防止了使用者覆盖length（）方法。另外，如果一个类是final的，则该类所有方法都是final的。Java编译器会寻找机会内联（inline）所有的final方法（这和具体的编译器实现有关）。此举能够使性能平均提高50%.</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 5. 尽量使用局部变量</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 调用方法时传递的参数以及在调用中创建的临时变量都保存在栈（Stack）中，速度较快。其他变量，如静态变量、实例变量等，都在堆（Heap）中创建，速度较慢。</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 6. 尽量处理好包装类型和基本类型两者的使用场所</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 虽然包装类型和基本类型在使用过程中是可以相互转换，但它们两者所产生的内存区域是完全不同的，基本类型数据产生和处理都在栈中处理，包装类型是对象，是在堆中产生实例。</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 在集合类对象，有对象方面需要的处理适用包装类型，其他的处理提倡使用基本类型。</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 7. 慎用synchronized,尽量减小synchronize的方法</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 都知道，实现同步是要很大的系统开销作为代价的，甚至可能造成死锁，所以尽量避免无谓的同步控制。synchronize方法被调用时，直接会把当前对象锁 了，在方法执行完之前其他线程无法调用当前对象的其他方法。所以synchronize的方法尽量小，并且应尽量使用方法同步代替代码块同步。</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 8. 尽量使用StringBuilder和StringBuffer进行字符串连接</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 这个就不多讲了。</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 9. 尽量不要使用finalize方法</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 实际上，将资源清理放在finalize方法中完成是非常不好的选择，由于GC的工作量很大，尤其是回收Young代内存时，大都会引起应用程序暂停，所以再选择使用finalize方法进行资源清理，会导致GC负担更大，程序运行效率更差。</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 10. 尽量使用基本数据类型代替对象</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; String str = "hello"; 上面这种方式会创建一个"hello"字符串，而且JVM的字符缓存池还会缓存这个字符串；</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; String str = new String（"hello"）； 此时程序除创建字符串外，str所引用的String对象底层还包含一个char[]数组，这个char[]数组依次存放了h,e,l,l,o</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 11. 单线程应尽量使用HashMap、ArrayList</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; HashTable、Vector等使用了同步机制，降低了性能。</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 12. 尽量合理的创建HashMap</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 当你要创建一个比较大的hashMap时，充分利用另一个构造函数</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; public HashMap（int initialCapacity, float loadFactor） 避免HashMap多次进行了hash重构，扩容是一件很耗费性能的事，在默认中initialCapacity只有16,而loadFactor是 0.75,需要多大的容量，你最好能准确的估计你所需要的最佳大小，同样的Hashtable,Vectors也是一样的道理。</span><br /><span style="color: #000000">13. 尽量减少对变量的重复计算</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 如</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; for（int i=0;i&lt;list.size（）；i++） 应该改为</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; for（int i=0,len=list.size（）；i&lt;len;i++） 并且在循环中应该避免使用复杂的表达式，在循环中，循环条件会被反复计算，如果不使用复杂表达式，而使循环条件值不变的话，程序将会运行的更快。</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 14. 尽量避免不必要的创建</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 如</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; A a = new A（）；&nbsp; if（i==1）{list.add（a）；} 应该改为</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; if（i==1）{&nbsp; A a = new A（）；&nbsp; list.add（a）；} 15. 尽量在finally块中释放资源</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 程序中使用到的资源应当被释放，以避免资源泄漏。这最好在finally块中去做。不管程序执行的结果如何，finally块总是会执行的，以确保资源的正确关闭。</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 16. 尽量使用移位来代替'a/b'的操作</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; "/"是一个代价很高的操作，使用移位的操作将会更快和更有效</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 如</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; int num = a / 4;&nbsp; int num = a / 8; 应该改为</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; int num = a 》 2;&nbsp; int num = a 》 3; 但注意的是使用移位应添加注释，因为移位操作不直观，比较难理解</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 17.尽量使用移位来代替'a*b'的操作</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 同样的，对于'*'操作，使用移位的操作将会更快和更有效</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 如</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; int num = a * 4;&nbsp; int num = a * 8; 应该改为</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; int num = a 《 2;&nbsp; int num = a 《 3; 18. 尽量确定StringBuffer的容量</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; StringBuffer 的构造器会创建一个默认大小（通常是16）的字符数组。在使用中，如果超出这个大小，就会重新分配内存，创建一个更大的数组，并将原先的数组复制过来，再 丢弃旧的数组。在大多数情况下，你可以在创建 StringBuffer的时候指定大小，这样就避免了在容量不够的时候自动增长，以提高性能。</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 如：</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; StringBuffer buffer = new StringBuffer（1000）； 19. 尽量早释放无用对象的引用</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 大部分时，方法局部引用变量所引用的对象 会随着方法结束而变成垃圾，因此，大部分时候程序无需将局部，引用变量显式设为null.</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 例如：</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; Public void test（）{&nbsp; Object obj = new Object（）；&nbsp; &#8230;&#8230;&nbsp; Obj=null;&nbsp; } 上面这个就没必要了，随着方法test（）的执行完成，程序中obj引用变量的作用域就结束了。但是如果是改成下面：</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; Public void test（）{&nbsp; Object obj = new Object（）；&nbsp; &#8230;&#8230;&nbsp; Obj=null;&nbsp; //执行耗时，耗内存操作；或调用耗时，耗内存的方法&nbsp; &#8230;&#8230;&nbsp; } 这时候就有必要将obj赋值为null,可以尽早的释放对Object对象的引用。</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 20. 尽量避免使用二维数组</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 二维数据占用的内存空间比一维数组多得多，大概10倍以上。</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 21. 尽量避免使用split</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 除非是必须的，否则应该避免使用split,split由于支持正则表达式，所以效率比较低，如果是频繁的几十，几百万的调用将会耗费大量资源，如果确实需 要频繁的调用split,可以考虑使用apache的StringUtils.split（string,char），频繁split的可以缓存结果。</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 22. ArrayList &amp; LinkedList</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 一 个是线性表，一个是链表，一句话，随机查询尽量使用ArrayList,ArrayList优于LinkedList,LinkedList还要移动指 针，添加删除的操作LinkedList优于ArrayList,ArrayList还要移动数据，不过这是理论性分析，事实未必如此，重要的是理解好2 者得数据结构，对症下药。</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 23. 尽量使用System.arraycopy （）代替通过来循环复制数组</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; System.arraycopy（） 要比通过循环来复制数组快的多</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 24. 尽量缓存经常使用的对象</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 尽可能将经常使用的对象进行缓存，可以使用数组，或HashMap的容器来进行缓存，但这种方式可能导致系统占用过多的缓存，性能下降，推荐可以使用一些第三方的开源工具，如EhCache,Oscache进行缓存，他们基本都实现了FIFO/FLU等缓存算法。</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 25. 尽量避免非常大的内存分配</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 有时候问题不是由当时的堆状态造成的，而是因为分配失败造成的。分配的内存块都必须是连续的，而随着堆越来越满，找到较大的连续块越来越困难。</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 26. 慎用异常</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 当创建一个异常时，需要收集一个栈跟踪（stack track），这个栈跟踪用于描述异常是在何处创建的。构建这些栈跟踪时需要为运行时栈做一份快照，正是这一部分开销很大。当需要创建一个 Exception 时，JVM 不得不说：先别动，我想就您现在的样子存一份快照，所以暂时停止入栈和出栈操作。栈跟踪不只包含运行时栈中的一两个元素，而是包含这个栈中的每一个元素。</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="color: #000000">&nbsp;&nbsp;&nbsp; 如 果您创建一个 Exception ,就得付出代价。好在捕获异常开销不大，因此可以使用 try-catch 将核心内容包起来。从技术上讲，您甚至可以随意地抛出异常，而不用花费很大的代价。招致性能损失的并不是 throw 操作--尽管在没有预先创建异常的情况下就抛出异常是有点不寻常。真正要花代价的是创建异常。幸运的是，好的编程习惯已教会我们，不应该不管三七二十一就 抛出异常。异常是为异常的情况而设计的，使用时也应该牢记这一原则。</span><img src ="http://www.blogjava.net/cx361/aggbug/373377.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cx361/" target="_blank">脉凌网络</a> 2012-04-05 16:07 <a href="http://www.blogjava.net/cx361/archive/2012/04/05/373377.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java编程风格与命名规范整理 </title><link>http://www.blogjava.net/cx361/archive/2012/03/26/Java.html</link><dc:creator>脉凌网络</dc:creator><author>脉凌网络</author><pubDate>Mon, 26 Mar 2012 04:45:00 GMT</pubDate><guid>http://www.blogjava.net/cx361/archive/2012/03/26/Java.html</guid><wfw:comment>http://www.blogjava.net/cx361/comments/372699.html</wfw:comment><comments>http://www.blogjava.net/cx361/archive/2012/03/26/Java.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/cx361/comments/commentRss/372699.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cx361/services/trackbacks/372699.html</trackback:ping><description><![CDATA[<span style="color: #000000">基本命名规范 </span>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 包命名</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 包名按照域名的范围从大到小逐步列出，恰好和Internet上的域名命名规则相反。</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 由一组以&#8220;。&#8221;连接的标识符构成，通常第一个标识符为符合网络域名的两个或者三个英文小写字母。</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; People&nbsp; TestPage&nbsp; XMLExample</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 类，接口命名</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 类的名字必须由大写字母开头而单词中的其他字母均为小写；如果类名称由多个单词组成，则每个单词的首字母均应为大写例如TestPage；如果类名称中包含单词缩写，则这个所写词的每个字母均应大写，如：XMLExample,还有一点命名技巧就是由于类是设计用来代表对象的，所以在命名类时应尽量选择名词。</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; People&nbsp; TestPage&nbsp; XMLExample</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 方法名</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 方法的名字的第一个单词应以小写字母作为开头，后面的单词则用大写字母开头。可以为动词或动词+名词组合。</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 设置/获取某个值的Method，应该遵循setV/getV规范</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 返回长度的Method，应该命名为length</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 测试某个布尔值的Method，应该命名为isV</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 将对象转换为某个特定类型的Mehod应该命名为toF</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; getDate（）；&nbsp; length（）；&nbsp; isReady（）；&nbsp; toOracleFormat（）；</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 变量名</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 1.普通变量命名应该采用首字母小写，其他字母首字母大写的方式。</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 2.final static变量的名字应该都大写，并且指出完整含义。如果一个常量名称由多个单词组成，则应该用下划线来分割这些单词如。</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; NUM_DAYS_IN_WEEK&nbsp; MAX_VALU</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 3. 如果需要对变量名进行缩写时，一定要注意整个代码中缩写规则的一致性</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; context=ctx&nbsp; message=msg</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 4. 通过在结尾处放置一个量词，就可创建更加统一的变量</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; First（一组变量中的第一个）&nbsp; Last（一组变量中的最后一个）&nbsp; Next（一组变量中的下一个变量）&nbsp; Prev（一组变量中的上一个）&nbsp; Cur（一组变量中的当前变量）</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 5. 无论什么时候，均提倡应用常量取代数字、固定字符串。也就是说，程序中除0，1以外，尽量不应该出现其他数字。</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 6. 索引变量：i、j、k等只作为小型循环的循环索引变量。</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 7. 逻辑变量：避免用flag来命名状态变量，用is来命名逻辑变量。</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; if（isClosed）{&nbsp; dosomeworks;&nbsp; return;&nbsp; }</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 数组</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 总是使用以下方式定义数组：</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; int[] arr = new int[10];</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 禁止使用C语言的是形式：</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 禁止&nbsp; int arr[] = new int[10];</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 集合</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 数组或者容器推荐命名方式为名词+s的方式，例如：</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; List&lt;Person&gt; persons = getPerson（）；&nbsp; for（Person person : persons）{&nbsp; dosomeworks;&nbsp; }</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 泛型</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 应该尽量简明扼要（最好是一个字母），以利于与普通的class或interface区分</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; Container中的Element应该用E表示；Map里的key用K表示，value用V；Type用T表示；异常用X表示</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 如果需要接收多个Type类型的参数，应该用邻接T的大写字母&#8212;&#8212;例如S&#8212;&#8212;来依次表示，当然也可以用T1, T2这样的方式</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; public class HashSet&lt;E&gt; extends AbstractSet&lt;E&gt; {&#8230;}&nbsp;&nbsp; public class HashMap&lt;K, V&gt; extends AbstractMap&lt;K, V&gt; {&#8230;}&nbsp;&nbsp; public class ThreadLocal&lt;T&gt; {&#8230;}&nbsp;&nbsp; public interface Functor&lt;T, X extends Throwable&gt; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; T val（） throws X;&nbsp;&nbsp; }</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 推荐的命名</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 1.当要区别接口和实现类的时候，可以在类的后面加上&#8220;Impl&#8221;。</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; interface Container&nbsp; class ContainerImpl</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 2.Exception类最好能用&#8220;Exception&#8221;做为类命名的结尾</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; DataNotFoundException&nbsp; InvalidArgumentException</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 3.抽象类最好能用&#8220;Abstract&#8221;做为类命名的开头</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; AbstractBeanDefinition&nbsp; AbstractBeanFactory</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 4. Test类最好能用&#8220;Test&#8221;做为类命名的结尾</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; ContainerTest</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 5.简称与缩写（不推荐使用）</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; cp代表colorPoint&nbsp;&nbsp; buf代表buffer&nbsp;&nbsp; off代表offset&nbsp;&nbsp; len代表length</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 除非是在循环中，否则一般不推荐使用单个字母作为变量名，不过也有例外，即约定俗成的单个字母</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; b代表byte&nbsp; c代表char&nbsp; d代表double&nbsp; e代表Exception&nbsp;&nbsp; f代表float&nbsp; i, j, k代表整数&nbsp;&nbsp; l代表long&nbsp; o代表Object&nbsp;&nbsp; s代表String&nbsp;&nbsp; v代表某些类型的特定值</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 代码风格</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 花括号</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 花括号统一采用以下格式：</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; if（bool experssion）{&nbsp; dosomework;&nbsp; }</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 除非花括号中为空，不然任何情况下不能省略花括号，并且花括号必须换行，例如：</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; if（i==0）{&nbsp; return;&nbsp; }&nbsp; while（true） {}</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 以下写法禁止出现：</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 禁止&nbsp; if（i != 0） return;&nbsp; 禁止&nbsp; if（i !=0） {return;}</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 括号</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 括号的前，后一个字符不需要空格，例如：</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; Person p = new Person（&#8220;Jack&#8221;， 17）；</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 空格</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 逗号之后紧跟一个空格。</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; Person p = new Person（&#8220;Jack&#8221;， 16, &#8220;China&#8221;）；</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 2.　二元操作符前后跟空格。</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; int i = a + b &#8211; c * d;</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 3. 一元操作符不需要空格，for语句分号后有空格。</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; for（int i = 0; I &lt; 10; i++）{&nbsp; dosomework;&nbsp; }</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 4. 括号前后不需要空格</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 类</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 类的定义结构按照顺序为：</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 1） 常量</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 2） 成员变量</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 3） 构造函数</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 4） 成员函数</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 5） get和set方法</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 各个部分之间留出一个空行。</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 例如：</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 规范类模板：</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; class Person{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private final static int MAX_AGE = 100;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private String firstname = &#8220;Jack&#8221;；&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Person（）{}&nbsp; public Person（String firstname）{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.firstname = firstname;&nbsp; }&nbsp;&nbsp; public void doExercise（）{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dosomeworks;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; run（）；&nbsp; }&nbsp; private void run（）{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dosomeworks;&nbsp; }&nbsp;&nbsp; public getFirstname（）{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return firstname;&nbsp; }&nbsp; public setFirstname（String firstname）{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.firstname = firstname;&nbsp; }&nbsp; }</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 2.构造函数</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 1） 参数为空的构造函数出现在最上方</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 2） 有调用关系的构造函数相邻</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 3） 参数尽量由少到多从上至下排序</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 3.使用成员变量</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 在类的方法内引用成员变量了命名冲突以外，不使用this。非特殊情况在类的方法内都不使用get和set方法存取成员变量。</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 4.方法</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 有调用关系的方法尽量放在相邻的位置，public和private方法可以交叉放置。</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 5.get和set方法，所有需要公开的成员变量都要符合良好的javabean规范，提供get和set方法，尽量使用IDE工具自动生成。</span></p>
<p>&nbsp;&nbsp;&nbsp; <font color="#0000ff"><span style="color: #000000">Java</span></font><span style="color: #000000">doc注释</span></p>
<p><span style="color: #000000">&nbsp;&nbsp;&nbsp; 在每个程序的最开始部分，一般都用</span><font color="#0000ff"><span style="color: #000000">Java</span></font><span style="color: #000000">doc注释对程序的总体描述以及版权信息，之后在主程序中可以为每个类、接口、方法、字段添加 Javadoc注释，每个注释的开头部分先用一句话概括该类、接口、方法、字段所完成的功能，这句话应单独占据一行以突出其概括作用，在这句话后面可以跟随更加详细的描述段落。在描述性段落之后还可以跟随一些以Javadoc注释标签开头的特殊段落，例如上面例子中的@auther和@version，这些段落将在生成文档中以特定方式显示</span></p><img src ="http://www.blogjava.net/cx361/aggbug/372699.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cx361/" target="_blank">脉凌网络</a> 2012-03-26 12:45 <a href="http://www.blogjava.net/cx361/archive/2012/03/26/Java.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java QQ项目详细设计之：登录模块 </title><link>http://www.blogjava.net/cx361/archive/2012/03/20/372321.html</link><dc:creator>脉凌网络</dc:creator><author>脉凌网络</author><pubDate>Tue, 20 Mar 2012 14:36:00 GMT</pubDate><guid>http://www.blogjava.net/cx361/archive/2012/03/20/372321.html</guid><wfw:comment>http://www.blogjava.net/cx361/comments/372321.html</wfw:comment><comments>http://www.blogjava.net/cx361/archive/2012/03/20/372321.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cx361/comments/commentRss/372321.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cx361/services/trackbacks/372321.html</trackback:ping><description><![CDATA[<p style="padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(248,248,248); text-indent: 28px; margin: 10px 0px; padding-left: 0px; padding-right: 0px; font: 14px/28px 宋体; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; padding-top: 0px; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><strong style="text-align: center; font-weight: bold">客户端方面登录模块：</strong></p>
<p style="padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(248,248,248); text-indent: 28px; margin: 10px 0px; padding-left: 0px; padding-right: 0px; font: 14px/28px 宋体; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; padding-top: 0px; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px">对在飞Q登录信息界面中输入的各项信息进行初步检验。若发现错误，输入数据全部清空，以让用户重新输入一次。若未发现错误，转入主界面。其中的错误种类有：</p>
<p style="padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(248,248,248); text-indent: 28px; margin: 10px 0px; padding-left: 0px; padding-right: 0px; font: 14px/28px 宋体; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; padding-top: 0px; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px">1.输入数据不匹配</p>
<p style="padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(248,248,248); text-indent: 28px; margin: 10px 0px; padding-left: 0px; padding-right: 0px; font: 14px/28px 宋体; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; padding-top: 0px; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px">帐号 数据库没有该帐号</p>
<p style="padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(248,248,248); text-indent: 28px; margin: 10px 0px; padding-left: 0px; padding-right: 0px; font: 14px/28px 宋体; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; padding-top: 0px; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px">密码 与对应账号的密码不匹配</p>
<p style="padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(248,248,248); text-indent: 28px; margin: 10px 0px; padding-left: 0px; padding-right: 0px; font: 14px/28px 宋体; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; padding-top: 0px; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px">2 输入数据不能为空</p>
<p style="padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(248,248,248); text-indent: 28px; margin: 10px 0px; padding-left: 0px; padding-right: 0px; font: 14px/28px 宋体; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; padding-top: 0px; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px">if (账号为空)</p>
<p style="padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(248,248,248); text-indent: 28px; margin: 10px 0px; padding-left: 0px; padding-right: 0px; font: 14px/28px 宋体; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; padding-top: 0px; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px">{</p>
<p style="padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(248,248,248); text-indent: 28px; margin: 10px 0px; padding-left: 0px; padding-right: 0px; font: 14px/28px 宋体; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; padding-top: 0px; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px">请输入账号再登陆</p>
<p style="padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(248,248,248); text-indent: 28px; margin: 10px 0px; padding-left: 0px; padding-right: 0px; font: 14px/28px 宋体; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; padding-top: 0px; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px">}</p>
<p style="padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(248,248,248); text-indent: 28px; margin: 10px 0px; padding-left: 0px; padding-right: 0px; font: 14px/28px 宋体; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; padding-top: 0px; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px">else if (账号长度小于6或对于20)</p>
<p style="padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(248,248,248); text-indent: 28px; margin: 10px 0px; padding-left: 0px; padding-right: 0px; font: 14px/28px 宋体; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; padding-top: 0px; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px">{</p>
<p style="padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(248,248,248); text-indent: 28px; margin: 10px 0px; padding-left: 0px; padding-right: 0px; font: 14px/28px 宋体; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; padding-top: 0px; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px">请输入正确的账号,账号可以位数字或Email地址。</p>
<p style="padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(248,248,248); text-indent: 28px; margin: 10px 0px; padding-left: 0px; padding-right: 0px; font: 14px/28px 宋体; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; padding-top: 0px; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px">}</p>
<p style="padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(248,248,248); text-indent: 28px; margin: 10px 0px; padding-left: 0px; padding-right: 0px; font: 14px/28px 宋体; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; padding-top: 0px; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px">else if (密码为空)</p>
<p style="padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(248,248,248); text-indent: 28px; margin: 10px 0px; padding-left: 0px; padding-right: 0px; font: 14px/28px 宋体; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; padding-top: 0px; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px">{</p>
<p style="padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(248,248,248); text-indent: 28px; margin: 10px 0px; padding-left: 0px; padding-right: 0px; font: 14px/28px 宋体; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; padding-top: 0px; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px">请输入密码后再登陆</p>
<p style="padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(248,248,248); text-indent: 28px; margin: 10px 0px; padding-left: 0px; padding-right: 0px; font: 14px/28px 宋体; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; padding-top: 0px; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px">}</p>
<p style="padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(248,248,248); text-indent: 28px; margin: 10px 0px; padding-left: 0px; padding-right: 0px; font: 14px/28px 宋体; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; padding-top: 0px; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px">else</p>
<p style="padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(248,248,248); text-indent: 28px; margin: 10px 0px; padding-left: 0px; padding-right: 0px; font: 14px/28px 宋体; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; padding-top: 0px; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px">{</p>
<p style="padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(248,248,248); text-indent: 28px; margin: 10px 0px; padding-left: 0px; padding-right: 0px; font: 14px/28px 宋体; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; padding-top: 0px; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px">通知服务器 账号为：xxx 密码为：xxx的请求登陆</p>
<p style="padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(248,248,248); text-indent: 28px; margin: 10px 0px; padding-left: 0px; padding-right: 0px; font: 14px/28px 宋体; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; padding-top: 0px; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px">}</p>
<p style="text-align: center; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(248,248,248); text-indent: 28px; margin: 10px 0px; padding-left: 0px; padding-right: 0px; font: 14px/28px 宋体; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; padding-top: 0px; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><img style="text-align: center; border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-image: initial" class="fit-image" border="0" alt="" src="http://java.chinaitlab.com/UploadFiles_8734/201203/20120318121039514.png" width="498" height="487" /></p>
<p style="text-align: left; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(248,248,248); text-indent: 28px; margin: 10px 0px; padding-left: 0px; padding-right: 0px; font: 14px/28px 宋体; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; padding-top: 0px; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><strong style="text-align: center; font-weight: bold">服务器方面：</strong></p>
<p style="padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(248,248,248); text-indent: 28px; margin: 10px 0px; padding-left: 0px; padding-right: 0px; font: 14px/28px 宋体; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; padding-top: 0px; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px">接收数据并存入loginpot中</p>
<p style="padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(248,248,248); text-indent: 28px; margin: 10px 0px; padding-left: 0px; padding-right: 0px; font: 14px/28px 宋体; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; padding-top: 0px; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px">判断接收的密码和服务器中的密码是否相同，相同则返回登录成功，并发送一系列信息（见下），不相同则返回登录失败，有相同的帐号登录的话，会向第一个客户端发送kill指令，当确认第一个客户端下线之后，第二个客户端就可以登录了</p>
<p style="text-align: center; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(248,248,248); text-indent: 28px; margin: 10px 0px; padding-left: 0px; padding-right: 0px; font: 14px/28px 宋体; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; padding-top: 0px; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><img style="text-align: center; border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-image: initial" class="fit-image" border="0" alt="" src="http://java.chinaitlab.com/UploadFiles_8734/201203/20120318121040341.png" width="498" height="703" /></p><img src ="http://www.blogjava.net/cx361/aggbug/372321.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cx361/" target="_blank">脉凌网络</a> 2012-03-20 22:36 <a href="http://www.blogjava.net/cx361/archive/2012/03/20/372321.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java学习路线图 </title><link>http://www.blogjava.net/cx361/archive/2012/03/10/371619.html</link><dc:creator>脉凌网络</dc:creator><author>脉凌网络</author><pubDate>Sat, 10 Mar 2012 05:27:00 GMT</pubDate><guid>http://www.blogjava.net/cx361/archive/2012/03/10/371619.html</guid><wfw:comment>http://www.blogjava.net/cx361/comments/371619.html</wfw:comment><comments>http://www.blogjava.net/cx361/archive/2012/03/10/371619.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cx361/comments/commentRss/371619.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cx361/services/trackbacks/371619.html</trackback:ping><description><![CDATA[<p><img style="width: 438px; height: 746px" border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/generalxu/JAVA%E5%AD%A6%E4%B9%A0%E8%B7%AF%E7%BA%BF%E5%9B%BE.jpg" width="438" height="746" /><br />首先要明白Java体系设计到得三个方面：J2SE,J2EE,J2ME（KJAVA）。J2SE，Java 2 Platform Standard Edition，我们经常说到的JDK，就主要指的这个，它是三者的基础，属于桌面级应用开发，这部分如果学得好很容易拓展J2EE和J2ME。 J2ME，The Micro Edition of the Java 2 Platform。主要用于嵌入式Java，如手机，PDA等等。J2EE，Java 2 Platform，Enterprise Edition，就是所谓的企业级Java，适合企业的大型应用开发。 </p>
<p>　　在学习了J2SE之后，你可以尝试着慢慢过渡到J2EE，当然，学习J2EE海需要很多非JAVA技术的支撑，比如数据库技术，网页编程技术等等，待会我会详细介绍这两方面的内容。J2EE有三个必学的框架，如果你说你学了J2EE，但又不会这三个框架的话，那会让人笑掉大牙，这三个框架分别是 Struts、Spring和Hibernate，虽然这三个框架应用很广，但不代表这三个框架就代表了J2EE，J2EE还有很多其他的东西，比如 EJB，作为一款重量级（此重量级不是指重量级选手那个意思，此重量级非彼重量级）框架，虽然这个应用慢慢的再被其他框架所取代，但EJB3.0的出现也给它带回一些生机，作为一个分布式应用的框架，也是大家要去学习和了解的知识。</p>
<p>　　当然，刚才说到J2EE包含的范围很广，即使我把我所了解的所有技术说出来，也并不能代表J2EE，这是一个很深很广的学问，需要大家以后再工作的时候慢慢去发现了。我所了解的还包括：</p>
<p>　　JDBC:Java数据库连接对象，基础中的基础，Hibernate也只是对它的封装而已</p>
<p>　　JNDI: Java 命名与目录接口，J2EE重要规范之一</p>
<p>　　EJBS: 上面已经提到过了</p>
<p>　　RMI: 提供远程调用方法的支持，主要用于程序分布式开发</p>
<p>　　JMS: Java消息服务，中间件技术</p>
<p>　　JAVA IDL: 提供J2EE平台与CORBA交互能力和互联能力的技术</p>
<p>　　JTS: 组件事务监视器</p>
<p>　　JTA: 事务划分的一个技术</p>
<p>　　JAVAMAIL: Java中的邮件技术</p>
<p>　　JAF: Java启动框架,没研究过</p>
<p>　　Log4j，一款日志处理的框架应用</p>
<p>　　Junit：单元测试的好帮手</p>
<p>　　freemarker、velocity：两款不错的模板引擎</p>
<p>　　与Flash的交互Flex：目前很多的SNS应用就是使用到了这个技术</p>
<p>　　Web services:想知道我们论坛天气预报的效果是怎么做的吗？请关注这个技术</p>
<p>　　SOA:面向服务架构，未来技术发展的趋势之一</p>
<p>　　&#8230;&#8230;</p>
<p>　　不过前面介绍到得这些都不是J2EE的基础,是属于框架应用级别的.要真正把上面说到的知识掌握好,还是的学习J2EE最核心的东西:JDBC、JSP、 servlet和JavaBean,后面三个也是学习SSH的基础(Struts\Spring\Hibernate的简称).鉴于J2EE的内容太过复杂,建议大家最初只学习: JSP, servlet和JavaBean，等这个基础掌握好再把SSH学习了，再对其他J2EE技术有个大致的了解就可以出去找工作了。当然，找工作的前提除了把Java学习好，还会有一些其他的技术也是必须要掌握的<br /></p><img src ="http://www.blogjava.net/cx361/aggbug/371619.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cx361/" target="_blank">脉凌网络</a> 2012-03-10 13:27 <a href="http://www.blogjava.net/cx361/archive/2012/03/10/371619.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>小白学JAVA</title><link>http://www.blogjava.net/cx361/archive/2012/02/26/370789.html</link><dc:creator>脉凌网络</dc:creator><author>脉凌网络</author><pubDate>Sun, 26 Feb 2012 05:44:00 GMT</pubDate><guid>http://www.blogjava.net/cx361/archive/2012/02/26/370789.html</guid><wfw:comment>http://www.blogjava.net/cx361/comments/370789.html</wfw:comment><comments>http://www.blogjava.net/cx361/archive/2012/02/26/370789.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/cx361/comments/commentRss/370789.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cx361/services/trackbacks/370789.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p>&nbsp;对于JAVA，现在的我就是一个小白，跟着视频写着写自己第一个&#8220;Hello world&#8221;的小程序，就已经犯了六七处错了。。。。。。不过我是小白，犯点错是很正常的。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 接下来我就把我犯的错记录下来。</p>
<p>D:\java\day01&gt;javac demo.java<br />demo.java:1: 需要 &lt;标识符&gt;<br />class<br />&nbsp;&nbsp;&nbsp;&nbsp; ^<br />1 错误</p>
<p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这不，我下载了个editplus，先新建了一个JAVA的文本，里面自动生成了一个经典的&#8220;Hello World&#8221;的代码。我还挺高兴，准备先运行看看效果，结果连编译都没有通过。。。 </p>
<p>先看看这段代码吧</p>
<p>&nbsp;class <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Hello World!");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 看了报错，再看代码，错误也就一目了然了。原来我连类名都没有起。。。。。。亏我还在DOS里打了demo......</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 加上类名后，编译没有报错，太好了，至少没有语法错误。可是问题又来了。。。</p>
<p>D:\java\day01&gt;java demo</p>
<p><br />Exception in thread "main" java.lang.NoClassDefFoundError: demo (wrong name: Dem<br />o)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at java.lang.ClassLoader.defineClass1(Native Method)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at java.lang.ClassLoader.defineClass(Unknown Source)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at java.security.SecureClassLoader.defineClass(Unknown Source)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at java.net.URLClassLoader.defineClass(Unknown Source)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at java.net.URLClassLoader.access$000(Unknown Source)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at java.net.URLClassLoader$1.run(Unknown Source)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at java.security.AccessController.doPrivileged(Native Method)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at java.net.URLClassLoader.findClass(Unknown Source)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at java.lang.ClassLoader.loadClass(Unknown Source)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at java.lang.ClassLoader.loadClass(Unknown Source)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at java.lang.ClassLoader.loadClassInternal(Unknown Source)<br />Could not find the main class: demo.&nbsp; Program will exit.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 运行时又出现报错了，而且还是这么篇幅巨大，崩溃~~~ 不过仔细一看发现报错里的(wrong name: Dem<br />o)&nbsp; 好吧，不过这也体现了JAVA严格区分大小写，让我对这一点认识加深了。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;D:\java\day01&gt;java Demo<br />Hello World!</p>
<p>&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; 看见这两单词是真不容易啊，小激动 。当然，这代码是自动生成的，所心我又自己用记事本，照着视频里一个字母一个字母地敲，结果。。。你懂的，又有报错了。。。</p>
<p>&nbsp;</p>
<p>D:\java\day01&gt;javac Demo1.java<br />Demo1.java:5: 需要 ';'<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("hello world")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^<br />1 错误</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp; 这个报错还是很明显的，需要&#8220;;&#8221;，不过，具本&#8220;;&#8221;应该怎么用，我还是需要多多观察。可是加上了以后还是报错了</p>
<p>&nbsp;</p>
<p>D:\java\day01&gt;javac demo1.java<br />demo1.java:5: 软件包 system 不存在<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; system.out.println("hello world");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^<br />1 错误</p>
<p>&nbsp;</p>
<p>&nbsp;仔细对照后才发现，原来是system的首字没有大写。所有都更正后，运行正常。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以上我的第一个JAVA程序的编写过程，只为自己高兴。（顺便吐槽TX的日志排版真让人蛋疼）<br /></p>
<p>&nbsp;</p><img src ="http://www.blogjava.net/cx361/aggbug/370789.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cx361/" target="_blank">脉凌网络</a> 2012-02-26 13:44 <a href="http://www.blogjava.net/cx361/archive/2012/02/26/370789.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java删除和拷贝文件递归实现方法 </title><link>http://www.blogjava.net/cx361/archive/2012/02/21/370402.html</link><dc:creator>脉凌网络</dc:creator><author>脉凌网络</author><pubDate>Tue, 21 Feb 2012 05:29:00 GMT</pubDate><guid>http://www.blogjava.net/cx361/archive/2012/02/21/370402.html</guid><wfw:comment>http://www.blogjava.net/cx361/comments/370402.html</wfw:comment><comments>http://www.blogjava.net/cx361/archive/2012/02/21/370402.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/cx361/comments/commentRss/370402.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cx361/services/trackbacks/370402.html</trackback:ping><description><![CDATA[<p>Java' target='_blank'&gt;java</a>删除和拷贝文件递归实现方法简单点：<br /><br />程序自己调用自己<br /><br />实现文件的删除和拷贝，代码如下：<br /><br />package com.viita;<br />import java.io.BufferedInputStream;<br />import java.io.BufferedOutputStream;<br />import java.io.DataInputStream;<br />import java.io.DataOutputStream;<br />import java.io.File;<br />import java.io.FileInputStream;<br />import java.io.FileOutputStream;<br />import java.io.IOException;<br />public class Dptest {<br /><br />//删除制定文件夹的所有文件及根文件夹<br /><br />public void deleteFile(String path) {<br />// TODO Auto-generated method stub<br />File f = new File(path);<br />if(f.isDirectory())<br />{<br />File[] file = f.listFiles();<br />for (File file2 : file) {<br />this.deleteFile(file2.toString());<br />file2.delete();<br />}<br />}else<br />{<br />f.delete();<br />}<br />f.delete();<br />}<br />//拷贝整个文件夹的方法<br /><br />public void copyFiles(String path1, String path2) throws Exception {<br />// TODO Auto-generated method stub<br />File file = new File(path1);<br />if(file.isDirectory())<br />{<br />File f = new File(path2);<br />if(!f.exists()) f.mkdir();<br />File[] files = file.listFiles();<br />for (File file2 : files) {<br />//System.out.println(file2.toString()+"-----"+path2+"/"+file2.getName());<br />copyFiles(file2.toString(),path2+"/"+file2.getName());<br />}<br />}else<br />{<br />copy(path1,path2);<br />}<br />}<br /><br />//拷贝单个文件的方法<br /><br />public void copy(String path1,String path2) throws IOException {<br />// TODO Auto-generated method stub<br />DataInputStream in = new DataInputStream(<br />new BufferedInputStream(<br />new FileInputStream(path1)));<br />byte[] date = new byte[in.available()];<br />in.read(date);<br />DataOutputStream out = new DataOutputStream(<br />new BufferedOutputStream(<br />new FileOutputStream(path2)));<br />out.write(date);<br />in.close();<br />out.close();<br />}<br />public static void main(String[] args) throws Exception {<br />Dptest dp = new Dptest();<br />dp.deleteFile("c:/wmpub");<br />// dp.copyFiles("c:/新建文件夹", "c:/xiao");<br />}<br />}</p><img src ="http://www.blogjava.net/cx361/aggbug/370402.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cx361/" target="_blank">脉凌网络</a> 2012-02-21 13:29 <a href="http://www.blogjava.net/cx361/archive/2012/02/21/370402.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java线程池分析</title><link>http://www.blogjava.net/cx361/archive/2012/02/17/370207.html</link><dc:creator>脉凌网络</dc:creator><author>脉凌网络</author><pubDate>Fri, 17 Feb 2012 10:51:00 GMT</pubDate><guid>http://www.blogjava.net/cx361/archive/2012/02/17/370207.html</guid><wfw:comment>http://www.blogjava.net/cx361/comments/370207.html</wfw:comment><comments>http://www.blogjava.net/cx361/archive/2012/02/17/370207.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cx361/comments/commentRss/370207.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cx361/services/trackbacks/370207.html</trackback:ping><description><![CDATA[<p>SyndContentImpl.value= 
<p><span style="font-family: 宋体; font-size: small">&nbsp;&nbsp;&nbsp; 在Java 5.0之前启动一个任务是通过调用Thread类的start()方法来实现的，任务的提于交和执行是同时进行的，如果你想对任务的执行进行调度或是控制 同时执行的线程数量就需要额外编写代码来完成。5.0里提供了一个新的任务执行架构使你可以轻松地调度和控制任务的执行，并且可以建立一个类似数据库连接 池的线程池来执行任务。这个架构主要有三个接口和其相应的具体类组成。这三个接口是Executor, ExecutorService、ScheduledExecutorService，让我们先用一个图来显示它们的关系：</span></p>
<p><span style="font-family: 宋体; font-size: small">&nbsp;&nbsp;&nbsp;</span></p>
<p>&nbsp;</p>
<p><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: #000000; word-spacing: 0px; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="text-align: left; line-height: 18px; font-size: 12px" class="Apple-style-span"><span style="font-family: 宋体"><img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/cx361/2012021612175254.jpg" /><br />图的左侧是接口，图的右侧是这些接口的具体类。注意Executor是没有直接具体实现的。</span></span></span></p>
<p><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: #000000; word-spacing: 0px; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="text-align: left; line-height: 18px; font-size: 12px" class="Apple-style-span"><span style="font-family: 宋体"><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: #000000; word-spacing: 0px; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: #000000; word-spacing: 0px; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="text-align: left; line-height: 18px; font-size: 12px" class="Apple-style-span"><span style="font-size: small"><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: #000000; word-spacing: 0px; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="text-align: left; line-height: 18px; font-size: 12px" class="Apple-style-span"><span style="font-family: 宋体"><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: #000000; word-spacing: 0px; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="text-align: left; line-height: 18px; font-size: 12px" class="Apple-style-span">&nbsp;</span></span></span></span></span></span></span></span></span></span></span></span></p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small"><strong style="font-weight: bold"><em style="font-style: italic">Executor</em></strong><strong style="font-weight: bold"><em style="font-style: italic">接口：</em></strong>是用来执行Runnable任务的，它只定义一个方法：</span></p>
<p>&nbsp;</p>
<ul style="padding-bottom: 0px; margin: 0px 0px 1.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px" sizcache0050013322146665096="4" sizset="9"><li style="padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small">execute(<em style="font-style: italic">Runnable command</em>)：执行Ruannable类型的任务 </span></li></ul>
<p>&nbsp;</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small"><strong style="font-weight: bold"><em style="font-style: italic">ExecutorService</em></strong><strong style="font-weight: bold"><em style="font-style: italic">接口：</em></strong>ExecutorService继承了Executor的方法，并提供了执行Callable任务和中止任务执行的服务，其定义的方法主要有：</span></p>
<p>&nbsp;</p>
<ul style="padding-bottom: 0px; margin: 0px 0px 1.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px" sizcache0050013322146665096="4" sizset="10"><li style="padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small">submit(<em style="font-style: italic">task</em>)：可用来提交Callable或Runnable任务，并返回代表此任务的Future对象 </span></li><li style="padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small">invokeAll(<em style="font-style: italic">collection of tasks</em>)：批处理任务集合，并返回一个代表这些任务的Future对象集合 </span></li><li style="padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small">shutdown()：在完成已提交的任务后关闭服务，不再接受新任务 </span></li><li style="padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small">shutdownNow()：停止所有正在执行的任务并关闭服务。 </span></li><li style="padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small">isTerminated()：测试是否所有任务都执行完毕了。 </span></li><li style="padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small">isShutdown()：测试是否该ExecutorService已被关闭 </span></li></ul>
<p>&nbsp;</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small"><strong style="font-weight: bold"><em style="font-style: italic">ScheduledExecutorService</em></strong><strong style="font-weight: bold"><em style="font-style: italic">接口</em></strong>在ExecutorService的基础上，ScheduledExecutorService提供了按时间安排执行任务的功能，它提供的方法主要有：</span></p>
<p>&nbsp;</p>
<ul style="padding-bottom: 0px; margin: 0px 0px 1.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px" sizcache0050013322146665096="4" sizset="16"><li style="padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small">schedule(<em style="font-style: italic">task, initDelay</em>): 安排所提交的Callable或Runnable任务在initDelay指定的时间后执行。 </span></li><li style="padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small">scheduleAtFixedRate()：安排所提交的Runnable任务按指定的间隔重复执行 </span></li><li style="padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small">scheduleWithFixedDelay()：安排所提交的Runnable任务在每次执行完后，等待delay所指定的时间后重复执行。 </span></li></ul>
<p>&nbsp;</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">&nbsp;</p>
<p>&nbsp;</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small"><strong style="font-weight: bold"><em style="font-style: italic">重要的Executors</em></strong><strong style="font-weight: bold"><em style="font-style: italic">类</em></strong></span></p>
<p>&nbsp;</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small">虽然以上提到的接口有其实现的具体类，但为了方便Java 5.0建议使用Executors的工具类来得到Executor接口的具体对象，需要注意的是Executors是一个类，不是Executor的复数 形式。Executors提供了以下一些static的方法：</span></p>
<p>&nbsp;</p>
<ul style="padding-bottom: 0px; margin: 0px 0px 1.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px" sizcache0050013322146665096="4" sizset="19"><li style="padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small">callable(<em style="font-style: italic">Runnable task</em>): 将Runnable的任务转化成Callable的任务 </span></li><li style="padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small">newSingleThreadExecutor: 产生一个ExecutorService对象，这个对象只有一个线程可用来执行任务，若任务多于一个，任务将按先后顺序执行。 </span></li><li style="padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small">newCachedThreadPool(): 产生一个ExecutorService对象，这个对象带有一个线程池，线程池的大小会根据需要调整，线程执行完任务后返回线程池，供执行下一次任务使用。 </span></li><li style="padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small">newFixedThreadPool(<em style="font-style: italic">int poolSize</em>)：产生一个ExecutorService对象，这个对象带有一个大小为poolSize的线程池，若任务数量大于poolSize，任务会被放在一个queue里顺序执行。 </span></li><li style="padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small">newSingleThreadScheduledExecutor：产生一个ScheduledExecutorService对象，这个对象的线程池大小为1，若任务多于一个，任务将按先后顺序执行。 </span></li><li style="padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small">newScheduledThreadPool(<em style="font-style: italic">int poolSize</em>): 产生一个ScheduledExecutorService对象，这个对象的线程池大小为poolSize，若任务数量大于poolSize，任务会在一个queue里等待执行 </span></li></ul>
<p>&nbsp;</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">&nbsp;</p>
<p>&nbsp;</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small">举例说明：</span></p>
<p>&nbsp;</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: x-small"><span style="font-size: small">应用Executors来建立Thread pool</span></span></p>
<p>&nbsp;</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">&nbsp;</p>
<p>&nbsp;</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><small><span style="font-size: x-small"><span style="font-size: small">有时候您需要建立一堆Thread来执行一些小任务，然而频繁的建立Thread有时会是个开销，因为Thread的建立必须与作业系统互动，如果能建立一个Thread pool来管理这些小的Thread并加以重复使用，对于系统效能会是个改善的方式。</p>
<p>您可以使用Executors来建立Thread pool，Executors有几个static方法，列出如下：</span></span></small></p>
<p>&nbsp;</p>
<table style="text-align: left; width: 634px; height: 82px" border="1" cellspacing="2" cellpadding="2">
<tbody>
<tr>
<td style="background-color: #cccccc; width: 236px; font-size: 1em"><small><span style="font-size: x-small">方法</span></small></td>
<td style="background-color: #cccccc; width: 378px; font-size: 1em"><small><span style="font-size: x-small">说明</span></small></td></tr>
<tr>
<td style="width: 236px; font-size: 1em"><small><tt><span style="font-size: x-small"><span style="font-family: 新宋体">newCachedThreadPool</span></span></tt></small></td>
<td style="width: 378px; font-size: 1em"><small><span style="font-size: x-small">建立可以快取的Thread，每个Thread预设可idle 60秒</span></small></td></tr>
<tr>
<td style="width: 236px; font-size: 1em">
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px" class="docText"><small><span style="font-size: x-small"><tt><span style="font-family: 新宋体">newFixedThreadPool</span></tt></span></small></p></td>
<td style="width: 378px; font-size: 1em"><small><span style="font-size: x-small">包括固定数量的Thread</span></small></td></tr>
<tr>
<td style="width: 236px; font-size: 1em">
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px" class="docText"><small><span style="font-size: x-small"><tt><span style="font-family: 新宋体">newSingleThreadExecutor</span></tt></span></small></p></td>
<td style="width: 378px; font-size: 1em"><small><span style="font-size: x-small">只有一个Thread，循序的执行指定给它的每个任务</span></small></td></tr>
<tr>
<td style="width: 236px; font-size: 1em"><small><tt><span style="font-size: x-small"><span style="font-family: 新宋体">newScheduledThreadPool</span></span></tt></small></td>
<td style="width: 378px; font-size: 1em"><small><span style="font-size: x-small">可排程的Thread</span></small></td></tr>
<tr>
<td style="width: 236px; font-size: 1em"><small><tt><span style="font-size: x-small"><span style="font-family: 新宋体">newSingleThreadScheduledExecutor</span></span></tt></small></td>
<td style="width: 378px; font-size: 1em"><small><span style="font-size: x-small">单一可排程的Thread</span></small></td></tr></tbody></table>
<p>&nbsp;</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: x-small"><span style="font-size: small"><span>举个简单的实例，下面的程式使用newFixedThreadPool方法建立Thread pool，当中包括五个可以重复使用的Thread，您可以指定Runnable物件给它，程式中会产生十个Runnable物件，由于Thread pool中只有五个可用的Thread，所以后来建立的五个Runnable必须等待有空闲的Thread才会被执行：</span><br /></span></span></p>
<p>&nbsp;</p>
<ul style="padding-bottom: 0px; margin: 0px 0px 1.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px" sizcache0050013322146665096="4" sizset="25"><li style="padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small">ExecutorDemo.java </span></li></ul>
<p>&nbsp;</p><pre><span style="font-size: small">package onlyfun.caterpillar;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ExecutorDemo {
 public static void main(String[] args) {
  <span style="font-weight: bold">ExecutorService service = Executors.newFixedThreadPool(5);</span>

  for(int i = 0; i &lt; 10; i++) {
   final int count = i;
   <span style="font-weight: bold">service.submit</span>
(new Runnable() {
    public void run() {
     System.out.println(count);
     try {
      Thread.sleep(2000);
     } catch (InterruptedException e) {
      e.printStackTrace();
     }

    }
   });
  }

  <span style="font-weight: bold">service.shutdown(); // 最后记得关闭Thread pool</span>

 }
}</span></pre>
<p>&nbsp;</p><pre><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: #000000; word-spacing: 0px; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="text-align: left; line-height: 15px; font-size: x-small" class="Apple-style-span"><span style="font-size: small">submit()方法也接受实作Callable介面的物件，最后传回Future物件，可以取得Callable执行过后的传回结果。

如果想利用Executors进行排程，例如排定某个工作30秒后执行：</span></span></span></pre>
<p>&nbsp;</p><pre><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: #000000; word-spacing: 0px; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="text-align: left; line-height: 15px; font-size: x-small" class="Apple-style-span"><span style="font-size: small"> ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor( );&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   scheduler.schedule(new Runnable( ) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   public void run() {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   // 排程工作&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   },&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   30, TimeUnit.SECONDS);</span></span></span></pre>
<p>&nbsp;</p><pre><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: #000000; word-spacing: 0px; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="text-align: left; line-height: 15px; font-size: x-small" class="Apple-style-span"><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: #000000; word-spacing: 0px; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="text-align: left; line-height: 15px; font-size: x-small" class="Apple-style-span"><span style="font-size: small">或排定某个工作5秒后执行，之后每30秒执行一次：</span></span></span></span></span></pre>
<p>&nbsp;</p><pre><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: #000000; word-spacing: 0px; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="text-align: left; line-height: 15px; font-size: x-small" class="Apple-style-span"><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: #000000; word-spacing: 0px; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="text-align: left; line-height: 15px; font-size: x-small" class="Apple-style-span"><span style="font-size: small"> ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor( );&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   final ScheduledFuture future = scheduler.scheduleAtFixedRate(new Runnable( ) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   public void run() {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   // 排程工作&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   System.out.println("t");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   },&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   0, 5, TimeUnit.SECONDS);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   // 排定 60 秒后取消future&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   scheduler.schedule(new Runnable( ) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   public void run( ) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   future.cancel(false);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   }, 60, TimeUnit.SECONDS);<span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: #000000; word-spacing: 0px; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="text-align: left; line-height: 15px; font-size: x-small" class="Apple-style-span">如上所示，想要取消排程任务，可以呼叫ScheduledFuture的cancel()方法。</span></span></span></span></span></span></span></pre>
<p>&nbsp;</p><img src ="http://www.blogjava.net/cx361/aggbug/370207.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cx361/" target="_blank">脉凌网络</a> 2012-02-17 18:51 <a href="http://www.blogjava.net/cx361/archive/2012/02/17/370207.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Javascript来生成ftp脚本 </title><link>http://www.blogjava.net/cx361/archive/2012/02/16/370137.html</link><dc:creator>脉凌网络</dc:creator><author>脉凌网络</author><pubDate>Thu, 16 Feb 2012 10:23:00 GMT</pubDate><guid>http://www.blogjava.net/cx361/archive/2012/02/16/370137.html</guid><wfw:comment>http://www.blogjava.net/cx361/comments/370137.html</wfw:comment><comments>http://www.blogjava.net/cx361/archive/2012/02/16/370137.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/cx361/comments/commentRss/370137.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cx361/services/trackbacks/370137.html</trackback:ping><description><![CDATA[昨天闲着没事，又因为工作需要，写了一个脚本，用来做ftp。 
<p>&nbsp;&nbsp;&nbsp; 当然不是直接做ftp，而是产生一个ftp的脚本，供ftp命令使用。</p>
<p>&nbsp;&nbsp;&nbsp; 程序也很简单，就是遍历一下本地目录，然后产生一堆ftp命令。</p>
<p>&nbsp;&nbsp;&nbsp; 为了避免以后再做此类重复劳动，我记在这里。</p>
<p>&nbsp;&nbsp;&nbsp; ----------------------------------------------------------</p>
<p>&nbsp;&nbsp;&nbsp; function matchDemo（strFolderName）</p>
<p>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp; var s;</p>
<p>&nbsp;&nbsp;&nbsp; var re = /200\d{5}/ig;</p>
<p>&nbsp;&nbsp;&nbsp; s = strFolderName.match（re）；</p>
<p>&nbsp;&nbsp;&nbsp; return（s）；</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; function init（）</p>
<p>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp; strScript ="open 192.168.1.32 \n";</p>
<p>&nbsp;&nbsp;&nbsp; strScript+="user sybase 111111 \n";</p>
<p>&nbsp;&nbsp;&nbsp; strScript+="bin\n";</p>
<p>&nbsp;&nbsp;&nbsp; strScript+="prompt\n";</p>
<p>&nbsp;&nbsp;&nbsp; strScript+="cd /hisdata/olddata \n";</p>
<p>&nbsp;&nbsp;&nbsp; dicWhiteList = new ActiveXObject（"Scripting.Dictionary"）；</p>
<p>&nbsp;&nbsp;&nbsp; dicWhiteList.add （"20051205_pihou", ""）；</p>
<p>&nbsp;&nbsp;&nbsp; dicWhiteList.add （"20051206_pihou", ""）；</p>
<p>&nbsp;&nbsp;&nbsp; dicWhiteList.add （"20060701_pihou", ""）；</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; function EnumSubFolder（oSubFolder）</p>
<p>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp; var eFolders=new Enumerator（oSubFolder.SubFolders）；</p>
<p>&nbsp;&nbsp;&nbsp; var s="";</p>
<p>&nbsp;&nbsp;&nbsp; if（eFolders.atEnd（））</p>
<p>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp; return s;</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; else</p>
<p>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp; for （； !eFolders.atEnd（）； eFolders.moveNext（））</p>
<p>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp; s+="lcd \"";</p>
<p>&nbsp;&nbsp;&nbsp; s+=eFolders.item（）；</p>
<p>&nbsp;&nbsp;&nbsp; s+="\"\n";</p>
<p>&nbsp;&nbsp;&nbsp; s+="mput *.*\n";</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; return s;</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; function checkList（strToBeChecked）</p>
<p>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp; return !dicWhiteList.Exists（strToBeChecked）；</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; var strScript,dicWhitList;</p>
<p>&nbsp;&nbsp;&nbsp; var sFolderPath="e:\\";</p>
<p>&nbsp;&nbsp;&nbsp; var oFs=new ActiveXObject（"Scripting.FileSystemObject"）；</p>
<p>&nbsp;&nbsp;&nbsp; init（）；</p>
<p>&nbsp;&nbsp;&nbsp; if （oFs.FolderExists（sFolderPath））</p>
<p>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp; //WScript.Echo（"valid folder"）；</p>
<p>&nbsp;&nbsp;&nbsp; var oFolders=oFs.GetFolder（sFolderPath）；</p>
<p>&nbsp;&nbsp;&nbsp; var eFolders=new Enumerator（oFolders.SubFolders）；</p>
<p>&nbsp;&nbsp;&nbsp; if（eFolders.atEnd（））</p>
<p>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp; strScript += "mkdir \"";</p>
<p>&nbsp;&nbsp;&nbsp; strScript += oFs.GetBaseName（sFolderPath）；</p>
<p>&nbsp;&nbsp;&nbsp; strScript += "\"\n";</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; else</p>
<p>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp; for （； !eFolders.atEnd（）； eFolders.moveNext（））</p>
<p>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp; strTargetFolderName=matchDemo（eFolders.item（）+""）；</p>
<p>&nbsp;&nbsp;&nbsp; if（strTargetFolderName==null || checkList（oFs.GetBaseName（eFolders.item（））））</p>
<p>&nbsp;&nbsp;&nbsp; continue;</p>
<p>&nbsp;&nbsp;&nbsp; strTmpFolderName="\""+oFs.GetBaseName（eFolders.item（））+"\"";</p>
<p>&nbsp;&nbsp;&nbsp; strScript += "mkdir "</p>
<p>&nbsp;&nbsp;&nbsp; strScript += strTargetFolderName;</p>
<p>&nbsp;&nbsp;&nbsp; strScript += "\n";</p>
<p>&nbsp;&nbsp;&nbsp; strScript += "cd ";</p>
<p>&nbsp;&nbsp;&nbsp; strScript += strTargetFolderName;</p>
<p>&nbsp;&nbsp;&nbsp; strScript += "\n";</p>
<p>&nbsp;&nbsp;&nbsp; strScript += EnumSubFolder（eFolders.item（））；</p>
<p>&nbsp;&nbsp;&nbsp; strScript += "lcd "</p>
<p>&nbsp;&nbsp;&nbsp; strScript += eFolders.item（）；</p>
<p>&nbsp;&nbsp;&nbsp; strScript += "\n";</p>
<p>&nbsp;&nbsp;&nbsp; strScript += "mput *.*\n";</p>
<p>&nbsp;&nbsp;&nbsp; strScript += "cd&nbsp; \nlcd \n";</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; strScript+="bye\n";</p>
<p>&nbsp;&nbsp;&nbsp; WScript.Echo（strScript）；</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; else</p>
<p>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp; WScript.Echo（"Bad Folder Name"）；</p>
<p>&nbsp;&nbsp;&nbsp; }</p> <img src ="http://www.blogjava.net/cx361/aggbug/370137.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cx361/" target="_blank">脉凌网络</a> 2012-02-16 18:23 <a href="http://www.blogjava.net/cx361/archive/2012/02/16/370137.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中计算两个日期相差几天</title><link>http://www.blogjava.net/cx361/archive/2012/02/14/369984.html</link><dc:creator>脉凌网络</dc:creator><author>脉凌网络</author><pubDate>Tue, 14 Feb 2012 13:31:00 GMT</pubDate><guid>http://www.blogjava.net/cx361/archive/2012/02/14/369984.html</guid><wfw:comment>http://www.blogjava.net/cx361/comments/369984.html</wfw:comment><comments>http://www.blogjava.net/cx361/archive/2012/02/14/369984.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/cx361/comments/commentRss/369984.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cx361/services/trackbacks/369984.html</trackback:ping><description><![CDATA[<p>public class Test {<br />public void dateDiff(String startTime, String endTime, String format) {<br />//按照传入的格式生成一个simpledateformate对象<br />SimpleDateFormat sd = new SimpleDateFormat(format);<br />long nd = 1000*24*60*60;//一天的毫秒数<br />long nh = 1000*60*60;//一小时的毫秒数<br />long nm = 1000*60;//一分钟的毫秒数<br />long ns = 1000;//一秒钟的毫秒数<br />long diff;<br />try {<br />//获得两个时间的毫秒时间差异<br />diff = sd.parse(endTime).getTime() - sd.parse(startTime).getTime();<br />long day = diff/nd;//计算差多少天<br />long hour = diff%nd/nh;//计算差多少小时<br />long min = diff%nd%nh/nm;//计算差多少分钟<br />long sec = diff%nd%nh%nm/ns;//计算差多少秒<br />//输出结果<br />System.out.println("时间相差："+day+"天"+hour+"小时"+min+"分钟"+sec+"秒。");<br />} catch (ParseException e) {<br />e.printStackTrace();<br />}<br />}</p>
<p>public static void main(String[] args) {<br />new Test().dateDiff(new SimpleDateFormat("yyyy-MM-dd").format(new Date()), "2011-4-28", "yyyy-MM-dd");<br />}<br />}</p><img src ="http://www.blogjava.net/cx361/aggbug/369984.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cx361/" target="_blank">脉凌网络</a> 2012-02-14 21:31 <a href="http://www.blogjava.net/cx361/archive/2012/02/14/369984.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java代码将汉字转换成拼音</title><link>http://www.blogjava.net/cx361/archive/2012/02/11/369795.html</link><dc:creator>脉凌网络</dc:creator><author>脉凌网络</author><pubDate>Sat, 11 Feb 2012 08:56:00 GMT</pubDate><guid>http://www.blogjava.net/cx361/archive/2012/02/11/369795.html</guid><wfw:comment>http://www.blogjava.net/cx361/comments/369795.html</wfw:comment><comments>http://www.blogjava.net/cx361/archive/2012/02/11/369795.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/cx361/comments/commentRss/369795.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cx361/services/trackbacks/369795.html</trackback:ping><description><![CDATA[<p>GUI代码部分：<br />/**<br />* @(#)CnToSpellGUI.java<br />* kindani<br />* 2004-10-25??<br />* */ </p>
<p>import java.awt.*;<br />import java.awt.event.*;<br />import javax.swing.*;<br />import javax.swing.event.*;</p>
<p>/**<br />* </p>
<p><br />* </p>
<p>JDK版本</p>
<p>1.4</p>
<p>* @author KIN<br />* @version 1.0<br />* @see<br />* @since 1.0<br />*/<br />public class CnToSpell2GUI extends JFrame {</p>
<p>private CnToSpell2GUI c = null;</p>
<p>public CnToSpell2GUI () {<br />super("Cn to Spell");<br />setSize(800,100);<br />getContentPane().setLayout(new FlowLayout());<br />// component layout<br />JTextArea from = new JTextArea(5,20);<br />JTextArea to = new JTextArea(5,20);<br />JButton b = new JButton("cn to pinyin");<br />getContentPane().add(new JLabel("From:"));<br />getContentPane().add(from);<br />getContentPane().add(b);<br />getContentPane().add(new JLabel("To:"));<br />getContentPane().add(to);<br />// action handle<br />b.addActionListener(new Cn2PinyinActionListener(from,to));<br />setVisible(true);<br />// set this for pack<br />c = this;<br />}</p>
<p>/**button action listener to convert text to pinyin from one textbox to another textbox*/<br />class Cn2PinyinActionListener implements ActionListener{</p>
<p>private JTextArea from = null;<br />private JTextArea to = null;<br />public Cn2PinyinActionListener(JTextArea from, JTextArea to) {<br />this.from = from;<br />this.to = to;<br />}<br />public void actionPerformed(ActionEvent e) {<br />if (from.getText().length() == 0) {<br />JOptionPane.showMessageDialog(from,"From text is empty!","Warning",JOptionPane.WARNING_MESSAGE);<br />}<br />String text = from.getText();<br />to.setText(CnToSpell.getFullSpell(text));<br />c.pack();<br />}<br />}</p>
<p>public static void main(String [] args) {<br />CnToSpell2GUI g = new CnToSpell2GUI();<br />}<br />}</p>
<p>&nbsp;</p>
<p>------------------------------------------------------------------------<br />/**<br />* @(#)CnToSpell.java <br />* 版权声明 Easydozer 版权所有 违者必究 <br />*<br />* 修订记录:<br />* 1)更改者：Easydozer<br />* 时　间：2004-10-20　<br />* 描　述：创建<br />*/<br />package com.easydozer.commons.util;</p>
<p>import java.util.Iterator;<br />import java.util.LinkedHashMap;<br />import java.util.Set;</p>
<p>/**<br />* <br />汉字转化为全拼<br />* </p>
<p>JDK版本:</p>
<p>1.4</p>
<p>* @author 谢计生<br />* @version 1.0<br />* @see <br />* @since 1.0<br />*/<br />public class CnToSpell<br />{<br />private static LinkedHashMap spellMap = null;</p>
<p>static<br />{<br />if(spellMap == null){<br />spellMap = new LinkedHashMap(400);<br />}<br />initialize();<br />System.out.println("Chinese transfer Spell Done.");<br />}</p>
<p>private CnToSpell()<br />{<br />}</p>
<p>private static void spellPut(String spell,int ascii)<br />{<br />spellMap.put(spell,new Integer(ascii));<br />}</p>
<p>private static void initialize()<br />{<br />spellPut("a", -20319);<br />spellPut("ai", -20317);<br />spellPut("an", -20304);<br />spellPut("ang", -20295);<br />spellPut("ao", -20292);<br />spellPut("ba", -20283);<br />spellPut("bai", -20265);<br />spellPut("ban", -20257);<br />spellPut("bang", -20242);<br />spellPut("bao", -20230);<br />spellPut("bei", -20051);<br />spellPut("ben", -20036);<br />spellPut("beng", -20032);<br />spellPut("bi", -20026);<br />spellPut("bian", -20002);<br />spellPut("biao", -19990);<br />spellPut("bie", -19986);<br />spellPut("bin", -19982);<br />spellPut("bing", -19976);<br />spellPut("bo", -19805);<br />spellPut("bu", -19784);<br />spellPut("ca", -19775);<br />spellPut("cai", -19774);<br />spellPut("can", -19763);<br />spellPut("cang", -19756);<br />spellPut("cao", -19751);<br />spellPut("ce", -19746);<br />spellPut("ceng", -19741);<br />spellPut("cha", -19739);<br />spellPut("chai", -19728);<br />spellPut("chan", -19725);<br />spellPut("chang", -19715);<br />spellPut("chao", -19540);<br />spellPut("che", -19531);<br />spellPut("chen", -19525);<br />spellPut("cheng", -19515);<br />spellPut("chi", -19500);<br />spellPut("chong", -19484);<br />spellPut("chou", -19479);<br />spellPut("chu", -19467);<br />spellPut("chuai", -19289);<br />spellPut("chuan", -19288);<br />spellPut("chuang", -19281);<br />spellPut("chui", -19275);<br />spellPut("chun", -19270);<br />spellPut("chuo", -19263);<br />spellPut("ci", -19261);<br />spellPut("cong", -19249);<br />spellPut("cou", -19243);<br />spellPut("cu", -19242);<br />spellPut("cuan", -19238);<br />spellPut("cui", -19235);<br />spellPut("cun", -19227);<br />spellPut("cuo", -19224);<br />spellPut("da", -19218);<br />spellPut("dai", -19212);<br />spellPut("dan", -19038);<br />spellPut("dang", -19023);<br />spellPut("dao", -19018);<br />spellPut("de", -19006);<br />spellPut("deng", -19003);<br />spellPut("di", -18996);<br />spellPut("dian", -18977);<br />spellPut("diao", -18961);<br />spellPut("die", -18952);<br />spellPut("ding", -18783);<br />spellPut("diu", -18774);<br />spellPut("dong", -18773);<br />spellPut("dou", -18763);<br />spellPut("du", -18756);<br />spellPut("duan", -18741);<br />spellPut("dui", -18735);<br />spellPut("dun", -18731);<br />spellPut("duo", -18722);<br />spellPut("e", -18710);<br />spellPut("en", -18697);<br />spellPut("er", -18696);<br />spellPut("fa", -18526);<br />spellPut("fan", -18518);<br />spellPut("fang", -18501);<br />spellPut("fei", -18490);<br />spellPut("fen", -18478);<br />spellPut("feng", -18463);<br />spellPut("fo", -18448);<br />spellPut("fou", -18447);<br />spellPut("fu", -18446);<br />spellPut("ga", -18239);<br />spellPut("gai", -18237);<br />spellPut("gan", -18231);<br />spellPut("gang", -18220);<br />spellPut("gao", -18211);<br />spellPut("ge", -18201);<br />spellPut("gei", -18184);<br />spellPut("gen", -18183);<br />spellPut("geng", -18181);<br />spellPut("gong", -18012);<br />spellPut("gou", -17997);<br />spellPut("gu", -17988);<br />spellPut("gua", -17970);<br />spellPut("guai", -17964);<br />spellPut("guan", -17961);<br />spellPut("guang", -17950);<br />spellPut("gui", -17947);<br />spellPut("gun", -17931);<br />spellPut("guo", -17928);<br />spellPut("ha", -17922);<br />spellPut("hai", -17759);<br />spellPut("han", -17752);<br />spellPut("hang", -17733);<br />spellPut("hao", -17730);<br />spellPut("he", -17721);<br />spellPut("hei", -17703);<br />spellPut("hen", -17701);<br />spellPut("heng", -17697);<br />spellPut("hong", -17692);<br />spellPut("hou", -17683);<br />spellPut("hu", -17676);<br />spellPut("hua", -17496);<br />spellPut("huai", -17487);<br />spellPut("huan", -17482);<br />spellPut("huang", -17468);<br />spellPut("hui", -17454);<br />spellPut("hun", -17433);<br />spellPut("huo", -17427);<br />spellPut("ji", -17417);<br />spellPut("jia", -17202);<br />spellPut("jian", -17185);<br />spellPut("jiang", -16983);<br />spellPut("jiao", -16970);<br />spellPut("jie", -16942);<br />spellPut("jin", -16915);<br />spellPut("jing", -16733);<br />spellPut("jiong", -16708);<br />spellPut("jiu", -16706);<br />spellPut("ju", -16689);<br />spellPut("juan", -16664);<br />spellPut("jue", -16657);<br />spellPut("jun", -16647);<br />spellPut("ka", -16474);<br />spellPut("kai", -16470);<br />spellPut("kan", -16465);<br />spellPut("kang", -16459);<br />spellPut("kao", -16452);<br />spellPut("ke", -16448);<br />spellPut("ken", -16433);<br />spellPut("keng", -16429);<br />spellPut("kong", -16427);<br />spellPut("kou", -16423);<br />spellPut("ku", -16419);<br />spellPut("kua", -16412);<br />spellPut("kuai", -16407);<br />spellPut("kuan", -16403);<br />spellPut("kuang", -16401);<br />spellPut("kui", -16393);<br />spellPut("kun", -16220);<br />spellPut("kuo", -16216);<br />spellPut("la", -16212);<br />spellPut("lai", -16205);<br />spellPut("lan", -16202);<br />spellPut("lang", -16187);<br />spellPut("lao", -16180);<br />spellPut("le", -16171);<br />spellPut("lei", -16169);<br />spellPut("leng", -16158);<br />spellPut("li", -16155);<br />spellPut("lia", -15959);<br />spellPut("lian", -15958);<br />spellPut("liang", -15944);<br />spellPut("liao", -15933);<br />spellPut("lie", -15920);<br />spellPut("lin", -15915);<br />spellPut("ling", -15903);<br />spellPut("liu", -15889);<br />spellPut("long", -15878);<br />spellPut("lou", -15707);<br />spellPut("lu", -15701);<br />spellPut("lv", -15681);<br />spellPut("luan", -15667);<br />spellPut("lue", -15661);<br />spellPut("lun", -15659);<br />spellPut("luo", -15652);<br />spellPut("ma", -15640);<br />spellPut("mai", -15631);<br />spellPut("man", -15625);<br />spellPut("mang", -15454);<br />spellPut("mao", -15448);<br />spellPut("me", -15436);<br />spellPut("mei", -15435);<br />spellPut("men", -15419);<br />spellPut("meng", -15416);<br />spellPut("mi", -15408);<br />spellPut("mian", -15394);<br />spellPut("miao", -15385);<br />spellPut("mie", -15377);<br />spellPut("min", -15375);<br />spellPut("ming", -15369);<br />spellPut("miu", -15363);<br />spellPut("mo", -15362);<br />spellPut("mou", -15183);<br />spellPut("mu", -15180);<br />spellPut("na", -15165);<br />spellPut("nai", -15158);<br />spellPut("nan", -15153);<br />spellPut("nang", -15150);<br />spellPut("nao", -15149);<br />spellPut("ne", -15144);<br />spellPut("nei", -15143);<br />spellPut("nen", -15141);<br />spellPut("neng", -15140);<br />spellPut("ni", -15139);<br />spellPut("nian", -15128);<br />spellPut("niang", -15121);<br />spellPut("niao", -15119);<br />spellPut("nie", -15117);<br />spellPut("nin", -15110);<br />spellPut("ning", -15109);<br />spellPut("niu", -14941);<br />spellPut("nong", -14937);<br />spellPut("nu", -14933);<br />spellPut("nv", -14930);<br />spellPut("nuan", -14929);<br />spellPut("nue", -14928);<br />spellPut("nuo", -14926);<br />spellPut("o", -14922);<br />spellPut("ou", -14921);<br />spellPut("pa", -14914);<br />spellPut("pai", -14908);<br />spellPut("pan", -14902);<br />spellPut("pang", -14894);<br />spellPut("pao", -14889);<br />spellPut("pei", -14882);<br />spellPut("pen", -14873);<br />spellPut("peng", -14871);<br />spellPut("pi", -14857);<br />spellPut("pian", -14678);<br />spellPut("piao", -14674);<br />spellPut("pie", -14670);<br />spellPut("pin", -14668);<br />spellPut("ping", -14663);<br />spellPut("po", -14654);<br />spellPut("pu", -14645);<br />spellPut("qi", -14630);<br />spellPut("qia", -14594);<br />spellPut("qian", -14429);<br />spellPut("qiang", -14407);<br />spellPut("qiao", -14399);<br />spellPut("qie", -14384);<br />spellPut("qin", -14379);<br />spellPut("qing", -14368);<br />spellPut("qiong", -14355);<br />spellPut("qiu", -14353);<br />spellPut("qu", -14345);<br />spellPut("quan", -14170);<br />spellPut("que", -14159);<br />spellPut("qun", -14151);<br />spellPut("ran", -14149);<br />spellPut("rang", -14145);<br />spellPut("rao", -14140);<br />spellPut("re", -14137);<br />spellPut("ren", -14135);<br />spellPut("reng", -14125);<br />spellPut("ri", -14123);<br />spellPut("rong", -14122);<br />spellPut("rou", -14112);<br />spellPut("ru", -14109);<br />spellPut("ruan", -14099);<br />spellPut("rui", -14097);<br />spellPut("run", -14094);<br />spellPut("ruo", -14092);<br />spellPut("sa", -14090);<br />spellPut("sai", -14087);<br />spellPut("san", -14083);<br />spellPut("sang", -13917);<br />spellPut("sao", -13914);<br />spellPut("se", -13910);<br />spellPut("sen", -13907);<br />spellPut("seng", -13906);<br />spellPut("sha", -13905);<br />spellPut("shai", -13896);<br />spellPut("shan", -13894);<br />spellPut("shang", -13878);<br />spellPut("shao", -13870);<br />spellPut("she", -13859);<br />spellPut("shen", -13847);<br />spellPut("sheng", -13831);<br />spellPut("shi", -13658);<br />spellPut("shou", -13611);<br />spellPut("shu", -13601);<br />spellPut("shua", -13406);<br />spellPut("shuai", -13404);<br />spellPut("shuan", -13400);<br />spellPut("shuang", -13398);<br />spellPut("shui", -13395);<br />spellPut("shun", -13391);<br />spellPut("shuo", -13387);<br />spellPut("si", -13383);<br />spellPut("song", -13367);<br />spellPut("sou", -13359);<br />spellPut("su", -13356);<br />spellPut("suan", -13343);<br />spellPut("sui", -13340);<br />spellPut("sun", -13329);<br />spellPut("suo", -13326);<br />spellPut("ta", -13318);<br />spellPut("tai", -13147);<br />spellPut("tan", -13138);<br />spellPut("tang", -13120);<br />spellPut("tao", -13107);<br />spellPut("te", -13096);<br />spellPut("teng", -13095);<br />spellPut("ti", -13091);<br />spellPut("tian", -13076);<br />spellPut("tiao", -13068);<br />spellPut("tie", -13063);<br />spellPut("ting", -13060);<br />spellPut("tong", -12888);<br />spellPut("tou", -12875);<br />spellPut("tu", -12871);<br />spellPut("tuan", -12860);<br />spellPut("tui", -12858);<br />spellPut("tun", -12852);<br />spellPut("tuo", -12849);<br />spellPut("wa", -12838);<br />spellPut("wai", -12831);<br />spellPut("wan", -12829);<br />spellPut("wang", -12812);<br />spellPut("wei", -12802);<br />spellPut("wen", -12607);<br />spellPut("weng", -12597);<br />spellPut("wo", -12594);<br />spellPut("wu", -12585);<br />spellPut("xi", -12556);<br />spellPut("xia", -12359);<br />spellPut("xian", -12346);<br />spellPut("xiang", -12320);<br />spellPut("xiao", -12300);<br />spellPut("xie", -12120);<br />spellPut("xin", -12099);<br />spellPut("xing", -12089);<br />spellPut("xiong", -12074);<br />spellPut("xiu", -12067);<br />spellPut("xu", -12058);<br />spellPut("xuan", -12039);<br />spellPut("xue", -11867);<br />spellPut("xun", -11861);<br />spellPut("ya", -11847);<br />spellPut("yan", -11831);<br />spellPut("yang", -11798);<br />spellPut("yao", -11781);<br />spellPut("ye", -11604);<br />spellPut("yi", -11589);<br />spellPut("yin", -11536);<br />spellPut("ying", -11358);<br />spellPut("yo", -11340);<br />spellPut("yong", -11339);<br />spellPut("you", -11324);<br />spellPut("yu", -11303);<br />spellPut("yuan", -11097);<br />spellPut("yue", -11077);<br />spellPut("yun", -11067);<br />spellPut("za", -11055);<br />spellPut("zai", -11052);<br />spellPut("zan", -11045);<br />spellPut("zang", -11041);<br />spellPut("zao", -11038);<br />spellPut("ze", -11024);<br />spellPut("zei", -11020);<br />spellPut("zen", -11019);<br />spellPut("zeng", -11018);<br />spellPut("zha", -11014);<br />spellPut("zhai", -10838);<br />spellPut("zhan", -10832);<br />spellPut("zhang", -10815);<br />spellPut("zhao", -10800);<br />spellPut("zhe", -10790);<br />spellPut("zhen", -10780);<br />spellPut("zheng", -10764);<br />spellPut("zhi", -10587);<br />spellPut("zhong", -10544);<br />spellPut("zhou", -10533);<br />spellPut("zhu", -10519);<br />spellPut("zhua", -10331);<br />spellPut("zhuai", -10329);<br />spellPut("zhuan", -10328);<br />spellPut("zhuang", -10322);<br />spellPut("zhui", -10315);<br />spellPut("zhun", -10309);<br />spellPut("zhuo", -10307);<br />spellPut("zi", -10296);<br />spellPut("zong", -10281);<br />spellPut("zou", -10274);<br />spellPut("zu", -10270);<br />spellPut("zuan", -10262);<br />spellPut("zui", -10260);<br />spellPut("zun", -10256);<br />spellPut("zuo", -10254);<br />}</p>
<p>/**<br />* 获得单个汉字的Ascii.<br />* @param cn char<br />* 汉字字符<br />* @return int<br />* 错误返回 0,否则返回ascii<br />*/<br />public static int getCnAscii(char cn)<br />{<br />byte[] bytes = (String.valueOf(cn)).getBytes();<br />if(bytes == null || bytes.length &gt; 2 || bytes.length &lt;= 0){ //错误<br />return 0;<br />}<br />if(bytes.length == 1){ //英文字符<br />return bytes[0];<br />}<br />if(bytes.length == 2){ //中文字符<br />int hightByte = 256 + bytes[0];<br />int lowByte = 256 + bytes[1];</p>
<p>int ascii = (256 * hightByte + lowByte) - 256 * 256;</p>
<p>//System.out.println("ASCII=" + ascii);</p>
<p>return ascii;<br />}</p>
<p>return 0; //错误<br />}</p>
<p>/**<br />* 根据ASCII码到SpellMap中查找对应的拼音<br />* @param ascii int<br />* 字符对应的ASCII<br />* @return String<br />* 拼音,首先判断ASCII是否&gt;0&amp;&lt;160,如果是返回对应的字符,<br />* <br />否则到SpellMap中查找,如果没有找到拼音,则返回null,如果找到则返回拼音.<br />*/<br />public static String getSpellByAscii(int ascii)<br />{<br />if(ascii &gt; 0 &amp;&amp; ascii &lt; 160){ //单字符<br />return String.valueOf((char)ascii);<br />}</p>
<p>if(ascii &lt; -20319 || ascii &gt; -10247){ //不知道的字符<br />return null;<br />}</p>
<p>Set keySet = spellMap.keySet();<br />Iterator it = keySet.iterator();</p>
<p>String spell0 = null;;<br />String spell = null;</p>
<p>int asciiRang0 = -20319;<br />int asciiRang;<br />while(it.hasNext()){</p>
<p>spell = (String)it.next();<br />Object valObj = spellMap.get(spell);<br />if(valObj instanceof Integer){<br />asciiRang = ((Integer)valObj).intValue();</p>
<p>if(ascii &gt;= asciiRang0 &amp;&amp; ascii &lt; asciiRang){ //区间找到<br />return(spell0 == null) ? spell : spell0;<br />}<br />else{<br />spell0 = spell;<br />asciiRang0 = asciiRang;<br />}<br />}<br />}</p>
<p>return null;</p>
<p>}</p>
<p>/**<br />* 返回字符串的全拼,是汉字转化为全拼,其它字符不进行转换<br />* @param cnStr String<br />* 字符串<br />* @return String<br />* 转换成全拼后的字符串<br />*/<br />public static String getFullSpell(String cnStr)<br />{<br />if(null == cnStr || "".equals(cnStr.trim())){<br />return cnStr;<br />}</p>
<p>char[] chars = cnStr.toCharArray();<br />StringBuffer retuBuf = new StringBuffer();<br />for(int i = 0,Len = chars.length;i &lt; Len;i++){<br />int ascii = getCnAscii(chars[i]);<br />if(ascii == 0){ //取ascii时出错<br />retuBuf.append(chars[i]);<br />}<br />else{<br />String spell = getSpellByAscii(ascii);<br />if(spell == null){<br />retuBuf.append(chars[i]);<br />}<br />else{<br />retuBuf.append(spell);<br />} // end of if spell == null<br />} // end of if ascii &lt;= -20400<br />} // end of for</p>
<p>return retuBuf.toString();<br />}</p>
<p>public static String getFirstSpell(String cnStr)<br />{<br />return null;<br />}</p>
<p>public static void main(String[] args)<br />{<br />String str = null;<br />str = "谢海101普降喜雨";<br />System.out.println("Spell=" + CnToSpell.getFullSpell(str));</p>
<p>str = "张牙舞爪》。，";<br />System.out.println("Spell=" + CnToSpell.getFullSpell(str));</p>
<p>str = "李鹏，可耻下场。";<br />System.out.println("Spell=" + CnToSpell.getFullSpell(str));</p>
<p>str = "猪油，猪八戒。";<br />System.out.println("Spell=" + CnToSpell.getFullSpell(str));<br />}<br />}</p>
<p>&nbsp;</p><img src ="http://www.blogjava.net/cx361/aggbug/369795.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cx361/" target="_blank">脉凌网络</a> 2012-02-11 16:56 <a href="http://www.blogjava.net/cx361/archive/2012/02/11/369795.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>