﻿<?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-henry1451 的专栏-文章分类-Java技术</title><link>http://www.blogjava.net/henry1451/category/31254.html</link><description>共同学习,共同进步</description><language>zh-cn</language><lastBuildDate>Wed, 28 May 2008 08:03:11 GMT</lastBuildDate><pubDate>Wed, 28 May 2008 08:03:11 GMT</pubDate><ttl>60</ttl><item><title>关于TimerTask的任务调度</title><link>http://www.blogjava.net/henry1451/articles/203403.html</link><dc:creator>henry1451</dc:creator><author>henry1451</author><pubDate>Wed, 28 May 2008 02:01:00 GMT</pubDate><guid>http://www.blogjava.net/henry1451/articles/203403.html</guid><wfw:comment>http://www.blogjava.net/henry1451/comments/203403.html</wfw:comment><comments>http://www.blogjava.net/henry1451/articles/203403.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/henry1451/comments/commentRss/203403.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/henry1451/services/trackbacks/203403.html</trackback:ping><description><![CDATA[<br />
&nbsp;&nbsp;&nbsp;&nbsp; 在要定时执行某一任务时,在精度不是要求很高的情况下,一般使用Java.util.TimerTask类来完成(要精确度较高的要求下可采用Quarta开源插件),使用<br />
TimerTask类完成定时任务开发时,很简单,只需以下二步:<br />
!)定义一个继承TimerTask类的类,重写run()方法,在该方法中实现自已的业务逻辑;<br />
2)在主类中定义一个Timer类对象,用该对象的<font style="background-color: #c4ecc9">schedule</font>()或<font style="background-color: #c4ecc9">scheduleAtFixedRate</font>()来实现定时任务的执行(这两个方法有一定的区别,这里不作介绍);<br />
<br />
这样就完成了任务的定时执行,其实&nbsp;TimerTask类也是基于线程(Thread)的实现,所以继承了TimerTask的类要重写run()方法,在该方法中实现自已的任务.<br />
<br />
现在有一点要说明下,即在创建Timer类对象时,有两种方法:<br />
1)<font style="background-color: #c4ecc9">Timer tm = new Timer(); //创建一个非守护线程<br />
2)<font style="background-color: #c4ecc9">Timer tm = new Timer(true);</font></font> //创建一守护线程<br />
<br />
让timer线程成为一个daemon线程,这样当程序只有daemon线程的时候,它就会自动终止运行.如果有非守护线程在运行,则守护线程一直存在.<br />
现举例如下:<br />
1)<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_43_259_Open_Image" onclick="this.style.display='none'; Codehighlighter1_43_259_Open_Text.style.display='none'; Codehighlighter1_43_259_Closed_Image.style.display='inline'; Codehighlighter1_43_259_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_43_259_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_43_259_Closed_Text.style.display='none'; Codehighlighter1_43_259_Open_Image.style.display='inline'; Codehighlighter1_43_259_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span id="Codehighlighter1_43_259_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Timer&nbsp;tm&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Timer(</span><span style="color: #0000ff">true</span><span style="color: #000000">); //创建一守护线程<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tm.schedule(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;TestTask(),</span><span style="color: #000000">2</span><span style="color: #000000">*</span><span style="color: #000000">1000</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
&nbsp;<br />
TestTask()类中重写的run()方法很简单,只是输出一条语句,但这段代码是没有输出结果的,因为主线程启动后就停止了,所以tm这个守护线程就也不存在了,所以没有输出结果,现在改下代码:<br />
2)<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_40_258_Open_Image" onclick="this.style.display='none'; Codehighlighter1_40_258_Open_Text.style.display='none'; Codehighlighter1_40_258_Closed_Image.style.display='inline'; Codehighlighter1_40_258_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_40_258_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_40_258_Closed_Text.style.display='none'; Codehighlighter1_40_258_Open_Image.style.display='inline'; Codehighlighter1_40_258_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span id="Codehighlighter1_40_258_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_40_258_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_62_103_Open_Image" onclick="this.style.display='none'; Codehighlighter1_62_103_Open_Text.style.display='none'; Codehighlighter1_62_103_Closed_Image.style.display='inline'; Codehighlighter1_62_103_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_62_103_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_62_103_Closed_Text.style.display='none'; Codehighlighter1_62_103_Open_Image.style.display='inline'; Codehighlighter1_62_103_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_62_103_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_62_103_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(</span><span style="color: #000000">6</span><span style="color: #000000">*</span><span style="color: #000000">1000</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_132_174_Open_Image" onclick="this.style.display='none'; Codehighlighter1_132_174_Open_Text.style.display='none'; Codehighlighter1_132_174_Closed_Image.style.display='inline'; Codehighlighter1_132_174_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_132_174_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_132_174_Closed_Text.style.display='none'; Codehighlighter1_132_174_Open_Image.style.display='inline'; Codehighlighter1_132_174_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">(Exception&nbsp;e)&nbsp;</span><span id="Codehighlighter1_132_174_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_132_174_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Timer&nbsp;tm&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Timer(</span><span style="color: #0000ff">true</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tm.schedule(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;TestTask()</span><span style="color: #000000">,</span><span style="color: #000000">2</span><span style="color: #000000">*</span><span style="color: #000000">1000</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<br />
但这段代码也还是没有输出的,因为主线程睡眠了6秒钟后,守护线程才产生,但这时主线程睡眠了6秒钟后就已经消亡了,所以守护线程就也不存在了,但如果让主线程睡眠放在<font style="background-color: #c4ecc9">schedule</font>()方法后面执行,则就会有输出,即:<br />
3)<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">Timer&nbsp;tm&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Timer(</span><span style="color: #0000ff">true</span><span style="color: #000000">);</span><span style="color: #008000">//</span><span style="color: #008000">创建一守护线程</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tm.schedule(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;TestTask(),</span><span style="color: #000000">2</span><span style="color: #000000">*</span><span style="color: #000000">1000</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_95_139_Open_Image" onclick="this.style.display='none'; Codehighlighter1_95_139_Open_Text.style.display='none'; Codehighlighter1_95_139_Closed_Image.style.display='inline'; Codehighlighter1_95_139_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_95_139_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_95_139_Closed_Text.style.display='none'; Codehighlighter1_95_139_Open_Image.style.display='inline'; Codehighlighter1_95_139_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_95_139_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_95_139_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(</span><span style="color: #000000">6</span><span style="color: #000000">*</span><span style="color: #000000">1000</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_168_211_Open_Image" onclick="this.style.display='none'; Codehighlighter1_168_211_Open_Text.style.display='none'; Codehighlighter1_168_211_Closed_Image.style.display='inline'; Codehighlighter1_168_211_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_168_211_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_168_211_Closed_Text.style.display='none'; Codehighlighter1_168_211_Open_Image.style.display='inline'; Codehighlighter1_168_211_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">(Exception&nbsp;e)&nbsp;</span><span id="Codehighlighter1_168_211_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_168_211_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
这是会有输出的,因为主线程启动后,守护线程也启动了,而主线程睡眠6秒钟,守护线程过2秒后执行,2秒时间在6秒时间内,所以在主线程消亡之前,守护线程还存在,所以有输出,但要保证主线程睡眠的时间大于或等于(等于的情况我试过几次,都有输出,但不保证一定会有输出,因为TimerTask有定时不精确的情况)定时任务的时间段(这里是2秒),即如果这里设为7秒或大于6秒的其它值,是不会有输出的.<br />
<br />
另:这里有几种情况要说明下:<br />
1)上面几种例举的情况是指创建守护线程(即创建Timer对象时带true这个参数,如果不带参数,则表示创建的是非守护线程)的情况,如果创建的是非守护线程,则不管哪种情况,一定会有输出的.<br />
2)针对上面几种情况,如果在调用<font style="background-color: #c4ecc9">schedule</font>()方法时,使用的是三个参数的(上面都是带两个参数),且第二个参数为0的话,则上面的几种情况,也都是会有输出的,因为第二个参数为0的话,表示的意思是立即执行.如上面第二种情况,如果改成这样:<font style="background-color: #c4ecc9">tm.schedule(new TestTask(),0,2*1000);</font>守护线程虽然后是等主线程睡眠6秒主才产生(且这时主线程已经消亡),但产生守护线程时,守护线程立即执行,所以也会能输出.<br />
<br />
注:守护线程的特点是,只要线程队列中没有非守护线程(即普通的我们常见的线程都为非守护线程),则所有的守护线程也将全部消亡.<br />
创建守护线程的方法是,线程对象调用: threadObj.<font style="background-color: #c4ecc9">setDaemon(true);即可将threadObj该线程设为守护线程.</font>
<img src ="http://www.blogjava.net/henry1451/aggbug/203403.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/henry1451/" target="_blank">henry1451</a> 2008-05-28 10:01 <a href="http://www.blogjava.net/henry1451/articles/203403.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>读取Properties文件的多种方法</title><link>http://www.blogjava.net/henry1451/articles/203245.html</link><dc:creator>henry1451</dc:creator><author>henry1451</author><pubDate>Tue, 27 May 2008 08:06:00 GMT</pubDate><guid>http://www.blogjava.net/henry1451/articles/203245.html</guid><wfw:comment>http://www.blogjava.net/henry1451/comments/203245.html</wfw:comment><comments>http://www.blogjava.net/henry1451/articles/203245.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/henry1451/comments/commentRss/203245.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/henry1451/services/trackbacks/203245.html</trackback:ping><description><![CDATA[<br />
&nbsp;&nbsp;&nbsp;&nbsp;JAVA中用到资源文件的情况非常多,所以开发中经常会遇到读取.properties文件的情况,现作些总结:<br />
<br />
1.使用java.util.Properties类的load()方法 <br />
示例:<br />
InputStream in = lnew BufferedInputStream(new FileInputStream(name)); <br />
Properties p = new Properties(); <br />
p.load(in); <br />
<br />
2.使用java.util.ResourceBundle类的getBundle()方法 <br />
示例:<br />
ResourceBundle rb = ResourceBundle.getBundle(name, Locale.getDefault()); <br />
<br />
3.使用java.util.PropertyResourceBundle类的构造函数 <br />
示例:<br />
InputStream in = new BufferedInputStream(new FileInputStream(name)); <br />
ResourceBundle rb = new PropertyResourceBundle(in); <br />
<br />
4.使用class变量的getResourceAsStream()方法 <br />
示例: <br />
InputStream in = JProperties.class.getResourceAsStream(name); <br />
Properties p = new Properties(); <br />
p.load(in); <br />
<br />
5.使用class.getClassLoader()所得到的java.lang.ClassLoader的getResourceAsStream()方法 <br />
示例:<br />
InputStream in = JProperties.class.getClassLoader().getResourceAsStream(name); <br />
Properties p = new Properties(); <br />
p.load(in); <br />
<br />
6.使用java.lang.ClassLoader类的getSystemResourceAsStream()静态方法 <br />
示例:<br />
InputStream in = ClassLoader.getSystemResourceAsStream(name); <br />
Properties p = new Properties(); <br />
p.load(in); <br />
<br />
7.Servlet中可以用javax.servlet.ServletContext 的getResourceAsStream()方法<br />
<p>示例:<br />
InputStream in = context.getResourceAsStream(path);<br />
Properties p = new Properties();<br />
p.load(in);<br />
<br />
8.用Thread当前线程方法获取<br />
示例:<br />
Properties properties = new Properties();<br />
properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream(path));</p>
<img src ="http://www.blogjava.net/henry1451/aggbug/203245.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/henry1451/" target="_blank">henry1451</a> 2008-05-27 16:06 <a href="http://www.blogjava.net/henry1451/articles/203245.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp文件上传(转)</title><link>http://www.blogjava.net/henry1451/articles/202538.html</link><dc:creator>henry1451</dc:creator><author>henry1451</author><pubDate>Sat, 24 May 2008 01:48:00 GMT</pubDate><guid>http://www.blogjava.net/henry1451/articles/202538.html</guid><wfw:comment>http://www.blogjava.net/henry1451/comments/202538.html</wfw:comment><comments>http://www.blogjava.net/henry1451/articles/202538.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/henry1451/comments/commentRss/202538.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/henry1451/services/trackbacks/202538.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1, &nbsp;jsp&nbsp;页面的代码&lt;%...@&nbsp;page&nbsp;language="java"&nbsp;import="java.util.*"&nbsp;pageEncoding="UTF-8"%&gt;&lt;html&gt;&nbsp;&nbsp;&nbsp;&lt;body&gt;&nbsp;&nbsp;&nbsp;&nbsp;&n...&nbsp;&nbsp;<a href='http://www.blogjava.net/henry1451/articles/202538.html'>阅读全文</a><img src ="http://www.blogjava.net/henry1451/aggbug/202538.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/henry1451/" target="_blank">henry1451</a> 2008-05-24 09:48 <a href="http://www.blogjava.net/henry1451/articles/202538.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>replace和replaceAll方法的区别</title><link>http://www.blogjava.net/henry1451/articles/202367.html</link><dc:creator>henry1451</dc:creator><author>henry1451</author><pubDate>Fri, 23 May 2008 04:05:00 GMT</pubDate><guid>http://www.blogjava.net/henry1451/articles/202367.html</guid><wfw:comment>http://www.blogjava.net/henry1451/comments/202367.html</wfw:comment><comments>http://www.blogjava.net/henry1451/articles/202367.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/henry1451/comments/commentRss/202367.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/henry1451/services/trackbacks/202367.html</trackback:ping><description><![CDATA[<p><span class="titlefont">replace和replaceAll是JAVA中常用的替换字符的方法,它们的区别是:<br />
1)replace的参数是char和CharSequence,即可以支持字符的替换,也支持字符串的替换(CharSequence即字符串序列的意思,说白了也就是字符串);<br />
2)replaceAll的参数是regex,即基于规则表达式的替换,比如,可以通过replaceAll("\\d",&nbsp;"*")把一个字符串所有的数字字符都换成星号;<br />
相同点是都是全部替换,即把源字符串中的某一字符或字符串全部换成指定的字符或字符串,如果只想替换第一次出现的,可以使用<br />
<font style="background-color: #c4ecc9">replaceFirst()</font>,这个方法也是基于规则表达式的替换,但与replaceAll()不同的时,只替换第一次出现的字符串;<br />
另外,如果replaceAll()和<font style="background-color: #c4ecc9">replaceFirst</font>()所用的参数据不是基于规则表达式的,则与<span class="titlefont">replace</span>()替换字符串的效果是一样的,即这两者也支持字符串的操作;<br />
还有一点注意:执行了替换操作后,源字符串的内容是没有发生改变的.<br />
<br />
举例如下:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;src&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String(</span><span style="color: #000000">"</span><span style="color: #000000">ab43a2c43d</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(src.replace(</span><span style="color: #000000">"</span><span style="color: #000000">3</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">f</span><span style="color: #000000">"</span><span style="color: #000000">));</span><span style="color: #000000">=&gt;</span><span style="color: #000000">ab4f2c4fd.<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(src.replace(</span><span style="color: #000000">'</span><span style="color: #000000">3</span><span style="color: #000000">'</span><span style="color: #000000">,</span><span style="color: #000000">'</span><span style="color: #000000">f</span><span style="color: #000000">'</span><span style="color: #000000">));</span><span style="color: #000000">=&gt;</span><span style="color: #000000">ab4f2c4fd.<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(src.replaceAll(</span><span style="color: #000000">"</span><span style="color: #000000">\\d</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">f</span><span style="color: #000000">"</span><span style="color: #000000">));</span><span style="color: #000000">=&gt;</span><span style="color: #000000">abffafcffd.<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(src.replaceAll(</span><span style="color: #000000">"</span><span style="color: #000000">a</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">f</span><span style="color: #000000">"</span><span style="color: #000000">));</span><span style="color: #000000">=&gt;</span><span style="color: #000000">fb43fc23d.<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(src.replaceFirst(</span><span style="color: #000000">"</span><span style="color: #000000">\\d,</span><span style="color: #000000">"</span><span style="color: #000000">f</span><span style="color: #000000">"</span><span style="color: #000000">));=&gt;abf32c43d</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(src.replaceFirst(</span><span style="color: #000000">"</span><span style="color: #000000">4</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">h</span><span style="color: #000000">"</span><span style="color: #000000">));</span><span style="color: #000000">=&gt;</span><span style="color: #000000">abh32c43d.</span></div>
<p></span>&nbsp;</p>
<img src ="http://www.blogjava.net/henry1451/aggbug/202367.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/henry1451/" target="_blank">henry1451</a> 2008-05-23 12:05 <a href="http://www.blogjava.net/henry1451/articles/202367.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于String字符串的一些常用工具方法</title><link>http://www.blogjava.net/henry1451/articles/202328.html</link><dc:creator>henry1451</dc:creator><author>henry1451</author><pubDate>Fri, 23 May 2008 02:24:00 GMT</pubDate><guid>http://www.blogjava.net/henry1451/articles/202328.html</guid><wfw:comment>http://www.blogjava.net/henry1451/comments/202328.html</wfw:comment><comments>http://www.blogjava.net/henry1451/articles/202328.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/henry1451/comments/commentRss/202328.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/henry1451/services/trackbacks/202328.html</trackback:ping><description><![CDATA[1.支持NULL的Split划分数组的方法:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;String[]&nbsp;Split(String&nbsp;s,&nbsp;String&nbsp;delim)<br />
<img id="Codehighlighter1_54_595_Open_Image" onclick="this.style.display='none'; Codehighlighter1_54_595_Open_Text.style.display='none'; Codehighlighter1_54_595_Closed_Image.style.display='inline'; Codehighlighter1_54_595_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_54_595_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_54_595_Closed_Text.style.display='none'; Codehighlighter1_54_595_Open_Image.style.display='inline'; Codehighlighter1_54_595_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_54_595_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_54_595_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(s</span><span style="color: #000000">==</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;s.equals(</span><span style="color: #000000">""</span><span style="color: #000000">))&nbsp;</span><span style="color: #008000"><br />
<img id="Codehighlighter1_133_248_Open_Image" onclick="this.style.display='none'; Codehighlighter1_133_248_Open_Text.style.display='none'; Codehighlighter1_133_248_Closed_Image.style.display='inline'; Codehighlighter1_133_248_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_133_248_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_133_248_Closed_Text.style.display='none'; Codehighlighter1_133_248_Open_Image.style.display='inline'; Codehighlighter1_133_248_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_133_248_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_133_248_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;empty[]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String[</span><span style="color: #000000">1</span><span style="color: #000000">];<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;empty[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;empty;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Vector&nbsp;vStrArray&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Vector();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringTokenizer&nbsp;stk&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;StringTokenizer(s,&nbsp;delim);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;strTemp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(stk.hasMoreTokens())<br />
<img id="Codehighlighter1_390_451_Open_Image" onclick="this.style.display='none'; Codehighlighter1_390_451_Open_Text.style.display='none'; Codehighlighter1_390_451_Closed_Image.style.display='inline'; Codehighlighter1_390_451_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_390_451_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_390_451_Closed_Text.style.display='none'; Codehighlighter1_390_451_Open_Image.style.display='inline'; Codehighlighter1_390_451_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_390_451_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_390_451_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strTemp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;stk.nextToken();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vStrArray.add(strTemp);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;as[]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String[vStrArray.size()];<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;n&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;vStrArray.size();&nbsp;n</span><span style="color: #000000">++</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;as[n]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(String)vStrArray.get(n);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;as;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<br />
2.指定替换范围内的字符串:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;String&nbsp;replaceAll(String&nbsp;strSource,&nbsp;String&nbsp;strFrom,&nbsp;String&nbsp;strTo)<br />
<img id="Codehighlighter1_82_479_Open_Image" onclick="this.style.display='none'; Codehighlighter1_82_479_Open_Text.style.display='none'; Codehighlighter1_82_479_Closed_Image.style.display='inline'; Codehighlighter1_82_479_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_82_479_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_82_479_Closed_Text.style.display='none'; Codehighlighter1_82_479_Open_Image.style.display='inline'; Codehighlighter1_82_479_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_82_479_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_82_479_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(strFrom&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;strFrom.equals(</span><span style="color: #000000">""</span><span style="color: #000000">))<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;strSource;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;strDest&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;intFromLen&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;strFrom.length();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;intPos;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">((intPos&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;strSource.indexOf(strFrom))&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">)<br />
<img id="Codehighlighter1_279_424_Open_Image" onclick="this.style.display='none'; Codehighlighter1_279_424_Open_Text.style.display='none'; Codehighlighter1_279_424_Closed_Image.style.display='inline'; Codehighlighter1_279_424_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_279_424_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_279_424_Closed_Text.style.display='none'; Codehighlighter1_279_424_Open_Image.style.display='inline'; Codehighlighter1_279_424_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_279_424_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_279_424_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strDest&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;strDest&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;strSource.substring(</span><span style="color: #000000">0</span><span style="color: #000000">,intPos);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strDest&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;strDest&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;strTo;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strSource&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;strSource.substring(intPos&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;intFromLen);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strDest&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;strDest&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;strSource;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;strDest;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<br />
3.<font style="background-color: #c4ecc9">以支持回车的显示</font>:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_47_343_Open_Image" onclick="this.style.display='none'; Codehighlighter1_47_343_Open_Text.style.display='none'; Codehighlighter1_47_343_Closed_Image.style.display='inline'; Codehighlighter1_47_343_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_47_343_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_47_343_Closed_Text.style.display='none'; Codehighlighter1_47_343_Open_Image.style.display='inline'; Codehighlighter1_47_343_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;String&nbsp;addBr(String&nbsp;Content)&nbsp;</span><span id="Codehighlighter1_47_343_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_47_343_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_78_108_Open_Image" onclick="this.style.display='none'; Codehighlighter1_78_108_Open_Text.style.display='none'; Codehighlighter1_78_108_Closed_Image.style.display='inline'; Codehighlighter1_78_108_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_78_108_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_78_108_Closed_Text.style.display='none'; Codehighlighter1_78_108_Open_Image.style.display='inline'; Codehighlighter1_78_108_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(Content&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_78_108_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_78_108_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;makeContent&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Content;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;makeContent&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;StringUtils.replace(makeContent,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">\r</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&lt;br&gt;</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;makeContent&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;StringUtils.replace(makeContent,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;makeContent;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<br />
4.防SQL注入:<font style="background-color: #c4ecc9">&nbsp;
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_0_94_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_94_Open_Text.style.display='none'; Codehighlighter1_0_94_Closed_Image.style.display='inline'; Codehighlighter1_0_94_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_0_94_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_0_94_Closed_Text.style.display='none'; Codehighlighter1_0_94_Open_Image.style.display='inline'; Codehighlighter1_0_94_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span id="Codehighlighter1_0_94_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_0_94_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;*&nbsp;"'"&nbsp;-&nbsp;&gt;&nbsp;"''"&nbsp;"aaa'a"&nbsp;-&gt;&nbsp;"aaa''a"&nbsp;"a''"&nbsp;-&gt;&nbsp;"a''''"<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;*&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;cond<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@return</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_155_418_Open_Image" onclick="this.style.display='none'; Codehighlighter1_155_418_Open_Text.style.display='none'; Codehighlighter1_155_418_Closed_Image.style.display='inline'; Codehighlighter1_155_418_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_155_418_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_155_418_Closed_Text.style.display='none'; Codehighlighter1_155_418_Open_Image.style.display='inline'; Codehighlighter1_155_418_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;String&nbsp;toDoubleChar(String&nbsp;cond,&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;todc)&nbsp;</span><span id="Codehighlighter1_155_418_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_155_418_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(StringUtil.isEmpty(cond))<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;StringBuffer&nbsp;sb&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;StringBuffer();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;"'"&nbsp;-&gt;&nbsp;"''"</span><span style="color: #008000"><br />
<img id="Codehighlighter1_302_390_Open_Image" onclick="this.style.display='none'; Codehighlighter1_302_390_Open_Text.style.display='none'; Codehighlighter1_302_390_Closed_Image.style.display='inline'; Codehighlighter1_302_390_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_302_390_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_302_390_Closed_Text.style.display='none'; Codehighlighter1_302_390_Open_Image.style.display='inline'; Codehighlighter1_302_390_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;cond.length();&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_302_390_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_302_390_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;c&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;cond.charAt(i);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;sb.append(c);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(c&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;todc)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;sb.append(todc);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;sb.toString();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p></font><br />
5.是否为整型:<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_45_145_Open_Image" onclick="this.style.display='none'; Codehighlighter1_45_145_Open_Text.style.display='none'; Codehighlighter1_45_145_Closed_Image.style.display='inline'; Codehighlighter1_45_145_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_45_145_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_45_145_Closed_Text.style.display='none'; Codehighlighter1_45_145_Open_Image.style.display='inline'; Codehighlighter1_45_145_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;isInteger(String&nbsp;str)&nbsp;</span><span id="Codehighlighter1_45_145_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_45_145_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_53_99_Open_Image" onclick="this.style.display='none'; Codehighlighter1_53_99_Open_Text.style.display='none'; Codehighlighter1_53_99_Closed_Image.style.display='inline'; Codehighlighter1_53_99_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_53_99_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_53_99_Closed_Text.style.display='none'; Codehighlighter1_53_99_Open_Image.style.display='inline'; Codehighlighter1_53_99_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_53_99_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_53_99_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer.parseInt(str);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
<img id="Codehighlighter1_121_142_Open_Image" onclick="this.style.display='none'; Codehighlighter1_121_142_Open_Text.style.display='none'; Codehighlighter1_121_142_Closed_Image.style.display='inline'; Codehighlighter1_121_142_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_121_142_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_121_142_Closed_Text.style.display='none'; Codehighlighter1_121_142_Open_Image.style.display='inline'; Codehighlighter1_121_142_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Throwable&nbsp;e)&nbsp;</span><span id="Codehighlighter1_121_142_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_121_142_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<p><br />
6.转换为Int 型:<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_55_203_Open_Image" onclick="this.style.display='none'; Codehighlighter1_55_203_Open_Text.style.display='none'; Codehighlighter1_55_203_Closed_Image.style.display='inline'; Codehighlighter1_55_203_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_55_203_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_55_203_Closed_Text.style.display='none'; Codehighlighter1_55_203_Open_Image.style.display='inline'; Codehighlighter1_55_203_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;toInt(String&nbsp;str,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;defaultValue)&nbsp;</span><span id="Codehighlighter1_55_203_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_55_203_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_77_105_Open_Image" onclick="this.style.display='none'; Codehighlighter1_77_105_Open_Text.style.display='none'; Codehighlighter1_77_105_Closed_Image.style.display='inline'; Codehighlighter1_77_105_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_77_105_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_77_105_Closed_Text.style.display='none'; Codehighlighter1_77_105_Open_Image.style.display='inline'; Codehighlighter1_77_105_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(isEmpty(str))&nbsp;</span><span id="Codehighlighter1_77_105_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_77_105_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;defaultValue;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_113_150_Open_Image" onclick="this.style.display='none'; Codehighlighter1_113_150_Open_Text.style.display='none'; Codehighlighter1_113_150_Closed_Image.style.display='inline'; Codehighlighter1_113_150_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_113_150_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_113_150_Closed_Text.style.display='none'; Codehighlighter1_113_150_Open_Image.style.display='inline'; Codehighlighter1_113_150_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_113_150_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_113_150_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;Integer.parseInt(str);<br />
<img id="Codehighlighter1_172_200_Open_Image" onclick="this.style.display='none'; Codehighlighter1_172_200_Open_Text.style.display='none'; Codehighlighter1_172_200_Closed_Image.style.display='inline'; Codehighlighter1_172_200_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_172_200_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_172_200_Closed_Text.style.display='none'; Codehighlighter1_172_200_Open_Image.style.display='inline'; Codehighlighter1_172_200_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Throwable&nbsp;e)&nbsp;</span><span id="Codehighlighter1_172_200_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_172_200_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;defaultValue;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<p><br />
不断更新中...... </p>
<img src ="http://www.blogjava.net/henry1451/aggbug/202328.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/henry1451/" target="_blank">henry1451</a> 2008-05-23 10:24 <a href="http://www.blogjava.net/henry1451/articles/202328.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>.bat批处理文件格式运行JAVA应用程序</title><link>http://www.blogjava.net/henry1451/articles/200830.html</link><dc:creator>henry1451</dc:creator><author>henry1451</author><pubDate>Fri, 16 May 2008 03:18:00 GMT</pubDate><guid>http://www.blogjava.net/henry1451/articles/200830.html</guid><wfw:comment>http://www.blogjava.net/henry1451/comments/200830.html</wfw:comment><comments>http://www.blogjava.net/henry1451/articles/200830.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/henry1451/comments/commentRss/200830.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/henry1451/services/trackbacks/200830.html</trackback:ping><description><![CDATA[<p><br />
<font style="background-color: #c4ecc9">&nbsp;当我们以运行JAVA运行程序时(含用MAIN()方法的类),可以写一.<font style="background-color: #c4ecc9">.bat</font>格式的批处理文件,以便双击该文件即可运行JAVA应用程序,<br />
<br />
主要是在文件中编写 java 你的主类(含用MAIN()方法的类,带完整的包名),当然后如果主类引用到其他类,则需设置CLASSPATH变量,提向你的<br />
<br />
其他类的路径,如果其他类打成了JAR包,则应该同时指向JAR包的文件路径,这样主类就可以找到要运行时的相关引用类.<br />
<br />
<font style="background-color: #c4ecc9">.bat</font>文件格式:<br />
<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">@echo&nbsp;off<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />set&nbsp;classpath=.;./lib/mysql-connector-java-3.0.10-stable-bin.jar<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />java&nbsp;bat.test.BatTest<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />pause</span></div>
</font><br />
<font style="background-color: #c4ecc9"><font style="background-color: #c4ecc9">.bat</font>文件格式的编写可以从网上找相关文章,主要是一些命今的编写.<br />
在设置classpath 属性时要注意: . 这个点,意思是先从当前 .bat 所以的目录以准,按包名去查找对应的类文件,而且类是以目录的形式存在时一定要设置<br />
否则会提示找不到类文件,如果全部打成了JAR文件的形式,则只需指定LIB(JAR文件一般放在此目录中)目录就可以了.<br />
<br />
当然这是在WINDOWS的系统中编写的方法,如果是在LINUX等系统中,只需更改下.bat 中的命今即可.<br />
另外如果是一个比较完整的运行程序,如要读取配置文件,输出日志,等,可以用ANT来编译,打包,测试等.使发布,移植运行程序更加方便.<br />
<br />
</font>
<img src ="http://www.blogjava.net/henry1451/aggbug/200830.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/henry1451/" target="_blank">henry1451</a> 2008-05-16 11:18 <a href="http://www.blogjava.net/henry1451/articles/200830.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于StringBuffer的使用</title><link>http://www.blogjava.net/henry1451/articles/200794.html</link><dc:creator>henry1451</dc:creator><author>henry1451</author><pubDate>Fri, 16 May 2008 02:09:00 GMT</pubDate><guid>http://www.blogjava.net/henry1451/articles/200794.html</guid><wfw:comment>http://www.blogjava.net/henry1451/comments/200794.html</wfw:comment><comments>http://www.blogjava.net/henry1451/articles/200794.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/henry1451/comments/commentRss/200794.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/henry1451/services/trackbacks/200794.html</trackback:ping><description><![CDATA[关于StringBuffer,在定义StringBuffer变量时一定要初始化,如下定义方式将产生错误:<br />
<br />
1) StringBuffer&nbsp; bf;//将产生没有初始化的错误,不能通过编译<br />
2) StringBuffer bff = null;//将产生异常,报空指针错误<br />
<br />
即在使用 bf.append("ss");时,将产生对应的错误,应当用以下方式进行初始化:<br />
StringBuffer bfu = new StringBuffer();或StringBuffer bfu = new StringBuffer("");<br />
这样就可以正确使用:bfu.append("str");<br />
<br />
对于第一点程序不能通过编译(如果IDE用的是Eclipse的话)会出现红色提示线,并给出错误提示,而对于第二点,<br />
由于要运行时才报发生空指针异常错误,问题比较难找,所以正确初始化StringBuffer变量,能减少一些不必要的麻烦.
<img src ="http://www.blogjava.net/henry1451/aggbug/200794.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/henry1451/" target="_blank">henry1451</a> 2008-05-16 10:09 <a href="http://www.blogjava.net/henry1451/articles/200794.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个奇怪的问题</title><link>http://www.blogjava.net/henry1451/articles/200422.html</link><dc:creator>henry1451</dc:creator><author>henry1451</author><pubDate>Wed, 14 May 2008 08:35:00 GMT</pubDate><guid>http://www.blogjava.net/henry1451/articles/200422.html</guid><wfw:comment>http://www.blogjava.net/henry1451/comments/200422.html</wfw:comment><comments>http://www.blogjava.net/henry1451/articles/200422.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/henry1451/comments/commentRss/200422.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/henry1451/services/trackbacks/200422.html</trackback:ping><description><![CDATA[<br />
<p>public class test<br />
{<br />
int i = 0;</p>
<p>public test()<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i=i ++;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(i);<br />
}</p>
<p>public static void main(String argsp[]) {<br />
new test();<br />
}<br />
}<br />
<br />
结果是0,为什么呢 ?<br />
<br />
java的编译器搞的鬼!在遇到++和--操作符的时候会重新为原变量分配一块内存空间，以存放原始的值，而在完成了赋值运算之后，就将这块内存释放掉。由于i的原始值存放在后开辟的内存中，这样i=i++后，由于是先赋值,i就会得到i的原始值(存放在新内存中的数椐)，而原来内存位置的i自加后只保留在原来的位置,由于此时i指向已经是新开辟出来的内存地址，所以i的值没有发送变化!<br />
换句话说,<br />
while(true){<br />
&nbsp;&nbsp; i=i++;<br />
}<br />
永远执行i的值恒等于i的初始值,即使不是0也一样!下面我把过程写一下 </p>
<p>i=0;//假设此时内存地址为0x12345678<br />
i=i++;//系统新开内存地址0x99999999,存放i原始值0,然后0x12345678的存放数据+1操作<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //此时0x12345678=1,0x99999999=0,但是上一步是先给值,所以i的内存地址是0x99999999=0;</p>
<p>所以i=0,</p>
<p>但是,如果是<br />
i=0;<br />
i++;<br />
此时i=1,因为0x99999999处新开辟的内存地址没有给任何引用,所以被丢弃了!i继续使用0x12345678处值<br />
<br />
你在栈上没有计算，正确的过程是</p>
<p>你把i的值0放到栈上<br />
然后把i变成1，但是栈上还是0<br />
最后把栈上的0弹出来赋值给i,结果把刚才iinc的结果给冲掉了,i又变成了0</p>
<p><br />
</p>
<img src ="http://www.blogjava.net/henry1451/aggbug/200422.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/henry1451/" target="_blank">henry1451</a> 2008-05-14 16:35 <a href="http://www.blogjava.net/henry1451/articles/200422.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何写.bat批处理文件 </title><link>http://www.blogjava.net/henry1451/articles/199879.html</link><dc:creator>henry1451</dc:creator><author>henry1451</author><pubDate>Sun, 11 May 2008 13:12:00 GMT</pubDate><guid>http://www.blogjava.net/henry1451/articles/199879.html</guid><wfw:comment>http://www.blogjava.net/henry1451/comments/199879.html</wfw:comment><comments>http://www.blogjava.net/henry1451/articles/199879.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/henry1451/comments/commentRss/199879.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/henry1451/services/trackbacks/199879.html</trackback:ping><description><![CDATA[共四大部分。<br />
&nbsp;1.教教你如何写.bat批处理文件&nbsp; <br />
扩展名是bat(在nt/2000/xp/2003下也可以是cmd)的文件就是批处理文件。 <br />
<br />
首先批处理文件是一个文本文件，这个文件的每一行都是一条DOS命令（大部分时候就好象我们在DOS提示<br />
<br />
符下执行的命令行一样），你可以使用DOS下的Edit或者Windows的记事本(notepad)等任何文本文件编辑工<br />
<br />
具创建和修改批处理文件。 <br />
<br />
其次，批处理文件是一种简单的程序，可以通过条件语句(if)和流程控制语句(goto)来控制命令运行的流<br />
<br />
程，在批处理中也可以使用循环语句(for) 来循环执行一条命令。当然，批处理文件的编程能力与C语言等<br />
<br />
编程语句比起来是十分有限的，也是十分不规范的。批处理的程序语句就是一条条的DOS命令（包括内部命<br />
<br />
令和外部命令），而批处理的能力主要取决于你所使用的命令。 <br />
<br />
第三，每个编写好的批处理文件都相当于一个DOS的外部命令，你可以把它所在的目录放到你的DOS搜索路<br />
<br />
径(path)中来使得它可以在任意位置运行。一个良好的习惯是在硬盘上建立一个bat或者batch目录（例如<br />
<br />
C:\BATCH），然后将所有你编写的批处理文件放到该目录中，这样只要在path中设置上c:\batch，你就可<br />
<br />
以在任意位置运行所有你编写的批处理程序。 <br />
<br />
第四，在DOS和Win9x/Me系统下，C:盘根目录下的AUTOEXEC.BAT批处理文件是自动运行批处理文件，每次系<br />
<br />
统启动时会自动运行该文件，你可以将系统每次启动时都要运行的命令放入该文件中，例如设置搜索路径<br />
<br />
，调入鼠标驱动和磁盘缓存，设置系统环境变量等。下面是一个运行于 Windows 98下的autoexec.bat的示<br />
<br />
例： <br />
@ECHO OFF <br />
PATH C:\WINDOWS;C:\WINDOWS\COMMAND;C:\UCDOS;C:\DOSTools;C:\SYSTOOLS;C:\WINTOOLS;C:\BATCH <br />
LH SMARTDRV.EXE /X <br />
LH DOSKEY.COM /INSERT <br />
LH CTMOUSE.EXE <br />
SET TEMP=D:\TEMP <br />
SET TMP=D:\TEMP <br />
<br />
<br />
批处理的作用 <br />
简单的说，批处理的作用就是自动的连续执行多条命令。 <br />
<br />
这里先讲一个最简单的应用：在启动wps软件时，每次都必须执行（&gt;前面内容表示DOS提示符）：&nbsp; <br />
C:\&gt;cd wps&nbsp; <br />
C:\WPS&gt;spdos <br />
C:\WPS&gt;py&nbsp; <br />
C:\WPS&gt;wbx&nbsp; <br />
C:\WPS&gt;wps&nbsp; <br />
如果每次用WPS之前都这样执行一遍，您是不是觉得很麻烦呢？ <br />
<br />
好了，用批处理，就可以实现将这些麻烦的操作简单化，首先我们编写一个runwps.bat批处理文件，内容<br />
<br />
如下： <br />
@echo off <br />
c: <br />
cd\wps <br />
spdos <br />
py <br />
wbx <br />
wps <br />
cd\ <br />
<br />
以后，我们每次进入wps，只需要运行runwps这个批处理文件即可。 <br />
<br />
常用命令 <br />
<br />
echo、@、call、pause、rem(小技巧：用::代替rem)是批处理文件最常用的几个命令，我们就从他们开始<br />
<br />
学起。&nbsp; <br />
echo 表示显示此命令后的字符&nbsp; <br />
echo off 表示在此语句后所有运行的命令都不显示命令行本身&nbsp; <br />
@与echo off相象，但它是加在每个命令行的最前面，表示运行时不显示这一行的命令行（只能影响当前行<br />
<br />
）。&nbsp; <br />
call 调用另一个批处理文件（如果不用call而直接调用别的批处理文件，那么执行完那个批处理文件后将<br />
<br />
无法返回当前文件并执行当前文件的后续命令）。&nbsp; <br />
pause 运行此句会暂停批处理的执行并在屏幕上显示Press any key to continue...的提示，等待用户按<br />
<br />
任意键后继续&nbsp; <br />
rem 表示此命令后的字符为解释行（注释），不执行，只是给自己今后参考用的（相当于程序中的注释）<br />
<br />
。&nbsp; <br />
<br />
例1：用edit编辑a.bat文件，输入下列内容后存盘为c:\a.bat，执行该批处理文件后可实现：将根目录中<br />
<br />
所有文件写入 a.txt中，启动UCDOS，进入WPS等功能。&nbsp; <br />
<br />
　　批处理文件的内容为: 　　　　　　　 命令注释：&nbsp; <br />
<br />
　　　　@echo off　　　　　　　　　　　不显示后续命令行及当前命令行 <br />
　　　　dir c:\*.* &gt;a.txt　　　　　　　将c盘文件列表写入a.txt&nbsp; <br />
　　　　call c:\ucdos\ucdos.bat　　　　调用ucdos&nbsp; <br />
　　　　echo 你好 　　　　　　　　　　 显示"你好"&nbsp; <br />
　　　　pause 　　　　　　　　　　　　 暂停,等待按键继续&nbsp; <br />
　　　　rem 准备运行wps 　　　　　　　 注释：准备运行wps&nbsp; <br />
&nbsp;<br />
&nbsp;<br />
2 教教你如何写.bat批处理文件&nbsp; <br />
&nbsp;　　　　cd ucdos　　　　　　　　　　　 进入ucdos目录&nbsp; <br />
　　　　wps 　　　　　　　　　　　　　 运行wps　　&nbsp; <br />
<br />
批处理文件的参数 <br />
<br />
批处理文件还可以像C语言的函数一样使用参数（相当于DOS命令的命令行参数），这需要用到一个参数表<br />
<br />
示符&#8220;%&#8221;。&nbsp; <br />
<br />
%[1-9]表示参数，参数是指在运行批处理文件时在文件名后加的以空格（或者Tab）分隔的字符串。变量可<br />
<br />
以从%0到%9，%0表示批处理命令本身，其它参数字符串用%1到%9顺序表示。&nbsp; <br />
<br />
例2：C:根目录下有一批处理文件名为f.bat，内容为： <br />
@echo off <br />
format %1 <br />
<br />
如果执行C:\&gt;f a: <br />
那么在执行f.bat时，%1就表示a:，这样format %1就相当于format a:，于是上面的命令运行时实际执行的<br />
<br />
是format a: <br />
<br />
例3：C:根目录下一批处理文件名为t.bat，内容为: <br />
@echo off <br />
type %1&nbsp; <br />
type %2&nbsp; <br />
<br />
那么运行C:\&gt;t a.txt b.txt&nbsp; <br />
%1 : 表示a.txt <br />
%2 : 表示b.txt <br />
于是上面的命令将顺序地显示a.txt和b.txt文件的内容。 <br />
<br />
<br />
特殊命令 <br />
<br />
if goto choice for是批处理文件中比较高级的命令，如果这几个你用得很熟练，你就是批处理文件的专<br />
<br />
家啦。&nbsp; <br />
<br />
一、if 是条件语句，用来判断是否符合规定的条件，从而决定执行不同的命令。 有三种格式:&nbsp; <br />
<br />
1、if [not] "参数" == "字符串" 待执行的命令&nbsp; <br />
<br />
参数如果等于(not表示不等，下同)指定的字符串，则条件成立，运行命令，否则运行下一句。 <br />
<br />
例：if "%1"=="a" format a: <br />
<br />
2、if [not] exist [路径\]文件名 待执行的命令&nbsp; <br />
如果有指定的文件，则条件成立，运行命令，否则运行下一句。 <br />
<br />
如: if exist c:\config.sys type c:\config.sys&nbsp; <br />
表示如果存在c:\config.sys文件，则显示它的内容。 <br />
<br />
3、if errorlevel &lt;数字&gt; 待执行的命令&nbsp; <br />
<br />
很多DOS程序在运行结束后会返回一个数字值用来表示程序运行的结果(或者状态)，通过if errorlevel命<br />
<br />
令可以判断程序的返回值，根据不同的返回值来决定执行不同的命令(返回值必须按照从大到小的顺序排列<br />
<br />
)。如果返回值等于指定的数字，则条件成立，运行命令，否则运行下一句。 <br />
<br />
如if errorlevel 2 goto x2 <br />
<br />
二、goto 批处理文件运行到这里将跳到goto所指定的标号(标号即label，标号用:后跟标准字符串来定义)<br />
<br />
处，goto语句一般与if配合使用，根据不同的条件来执行不同的命令组。&nbsp; <br />
<br />
如: <br />
<br />
goto end&nbsp; <br />
<br />
:end&nbsp; <br />
echo this is the end&nbsp; <br />
<br />
标号用&#8220;:字符串&#8221;来定义，标号所在行不被执行。&nbsp; <br />
<br />
三、choice 使用此命令可以让用户输入一个字符（用于选择），从而根据用户的选择返回不同的<br />
<br />
errorlevel，然后于if errorlevel配合，根据用户的选择运行不同的命令。 <br />
<br />
注意：choice命令为DOS或者Windows系统提供的外部命令，不同版本的choice命令语法会稍有不同，请用<br />
<br />
choice /?查看用法。 <br />
<br />
choice的命令语法（该语法为Windows 2003中choice命令的语法，其它版本的choice的命令语法与此大同<br />
<br />
小异）： <br />
<br />
CHOICE [/C choices] [/N] [/CS] [/T timeout /D choice] [/M text] <br />
<br />
描述: <br />
&nbsp;&nbsp;&nbsp; 该工具允许用户从选择列表选择一个项目并返回所选项目的索引。 <br />
<br />
参数列表: <br />
&nbsp;&nbsp; /C&nbsp;&nbsp;&nbsp; choices&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定要创建的选项列表。默认列表是 "YN"。 <br />
<br />
&nbsp;&nbsp; /N&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在提示符中隐藏选项列表。提示前面的消息得到显示， <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 选项依旧处于启用状态。 <br />
<br />
&nbsp;&nbsp; /CS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 允许选择分大小写的选项。在默认情况下，这个工具 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是不分大小写的。 <br />
<br />
&nbsp;&nbsp; /T&nbsp;&nbsp;&nbsp; timeout&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 做出默认选择之前，暂停的秒数。可接受的值是从 0 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 到 9999。如果指定了 0，就不会有暂停，默认选项 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 会得到选择。 <br />
<br />
&nbsp;&nbsp; /D&nbsp;&nbsp;&nbsp; choice&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在 nnnn 秒之后指定默认选项。字符必须在用 /C 选 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 项指定的一组选择中; 同时，必须用 /T 指定 nnnn。 <br />
&nbsp;<br />
&nbsp;<br />
<br />
&nbsp;<br />
3 教教你如何写.bat批处理文件&nbsp; <br />
&nbsp;<br />
&nbsp;&nbsp; /M&nbsp;&nbsp;&nbsp; text&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定提示之前要显示的消息。如果没有指定，工具只 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示提示。 <br />
<br />
&nbsp;&nbsp; /?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示帮助消息。 <br />
<br />
&nbsp;&nbsp; 注意: <br />
&nbsp;&nbsp; ERRORLEVEL 环境变量被设置为从选择集选择的键索引。列出的第一个选 <br />
&nbsp;&nbsp; 择返回 1，第二个选择返回 2，等等。如果用户按的键不是有效的选择， <br />
&nbsp;&nbsp; 该工具会发出警告响声。如果该工具检测到错误状态，它会返回 255 的 <br />
&nbsp;&nbsp; ERRORLEVEL 值。如果用户按 Ctrl+Break 或 Ctrl+C 键，该工具会返回 0 <br />
&nbsp;&nbsp; 的 ERRORLEVEL 值。在一个批程序中使用 ERRORLEVEL 参数时，将参数降 <br />
&nbsp;&nbsp; 序排列。 <br />
<br />
示例: <br />
&nbsp;&nbsp; CHOICE /?&nbsp; <br />
&nbsp;&nbsp; CHOICE /C YNC /M "确认请按 Y，否请按 N，或者取消请按 C。" <br />
&nbsp;&nbsp; CHOICE /T 10 /C ync /CS /D y <br />
&nbsp;&nbsp; CHOICE /C ab /M "选项 1 请选择 a，选项 2 请选择 b。" <br />
&nbsp;&nbsp; CHOICE /C ab /N /M "选项 1 请选择 a，选项 2 请选择 b。" <br />
&nbsp;&nbsp;&nbsp; <br />
如果我运行命令：CHOICE /C YNC /M "确认请按 Y，否请按 N，或者取消请按 C。" <br />
屏幕上会显示： <br />
确认请按 Y，否请按 N，或者取消请按 C。 [Y,N,C]? <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
例：test.bat的内容如下（注意，用if errorlevel判断返回值时，要按返回值从高到低排列）:&nbsp; <br />
@echo off&nbsp; <br />
choice /C dme /M "defrag,mem,end" <br />
if errorlevel 3 goto end <br />
if errorlevel 2 goto mem&nbsp; <br />
if errotlevel 1 goto defrag&nbsp; <br />
<br />
:defrag&nbsp; <br />
c:\dos\defrag&nbsp; <br />
goto end&nbsp; <br />
<br />
:mem&nbsp; <br />
mem&nbsp; <br />
goto end&nbsp; <br />
<br />
:end&nbsp; <br />
echo good bye&nbsp; <br />
<br />
此批处理运行后，将显示&#8220;defrag,mem,end[D,M,E]?&#8221; ，用户可选择d m e ，然后if语句根据用户的选择<br />
<br />
作出判断，d表示执行标号为defrag的程序段，m表示执行标号为mem的程序段，e表示执行标号为end的程序<br />
<br />
段，每个程序段最后都以goto end将程序跳到end标号处，然后程序将显示good bye，批处理运行结束。&nbsp; <br />
<br />
四、for 循环命令，只要条件符合，它将多次执行同一命令。&nbsp; <br />
<br />
语法： <br />
对一组文件中的每一个文件执行某个特定命令。 <br />
<br />
FOR %%variable IN (set) DO command [command-parameters] <br />
<br />
&nbsp; %%variable&nbsp; 指定一个单一字母可替换的参数。 <br />
&nbsp; (set)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定一个或一组文件。可以使用通配符。 <br />
&nbsp; command&nbsp;&nbsp;&nbsp; 指定对每个文件执行的命令。 <br />
&nbsp; command-parameters <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为特定命令指定参数或命令行开关。 <br />
<br />
例如一个批处理文件中有一行:&nbsp; <br />
for %%c in (*.bat *.txt) do type %%c&nbsp; <br />
<br />
则该命令行会显示当前目录下所有以bat和txt为扩展名的文件的内容。 <br />
<br />
<br />
批处理示例 <br />
<br />
1. IF-EXIST <br />
<br />
1) <br />
<br />
首先用记事本在C:\建立一个test1.bat批处理文件，文件内容如下：&nbsp; <br />
@echo off&nbsp; <br />
IF EXIST \AUTOEXEC.BAT TYPE \AUTOEXEC.BAT&nbsp; <br />
IF NOT EXIST \AUTOEXEC.BAT ECHO \AUTOEXEC.BAT does not exist&nbsp; <br />
<br />
然后运行它： <br />
C:\&gt;TEST1.BAT&nbsp; <br />
<br />
如果C:\存在AUTOEXEC.BAT文件，那么它的内容就会被显示出来，如果不存在，批处理就会提示你该文件不<br />
<br />
存在。 <br />
<br />
2) <br />
<br />
接着再建立一个test2.bat文件，内容如下：&nbsp; <br />
@ECHO OFF&nbsp; <br />
IF EXIST \%1 TYPE \%1&nbsp; <br />
IF NOT EXIST \%1 ECHO \%1 does not exist&nbsp; <br />
<br />
执行:&nbsp; <br />
C:\&gt;TEST2 AUTOEXEC.BAT&nbsp; <br />
该命令运行结果同上。 <br />
<br />
说明：&nbsp; <br />
(1) IF EXIST 是用来测试文件是否存在的，格式为&nbsp; <br />
IF EXIST [路径+文件名] 命令&nbsp; <br />
(2) test2.bat文件中的%1是参数，DOS允许传递9个批参数信息给批处理文件，分别为%1~%9(%0表示test2<br />
<br />
命令本身) ，这有点象编程中的实参和形参的关系，%1是形参，AUTOEXEC.BAT是实参。&nbsp; <br />
<br />
3) 更进一步的，建立一个名为TEST3.BAT的文件，内容如下：&nbsp; <br />
@echo off <br />
IF "%1" == "A" ECHO XIAO&nbsp; <br />
IF "%2" == "B" ECHO TIAN&nbsp; <br />
IF "%3" == "C" ECHO XIN&nbsp; <br />
<br />
如果运行： <br />
C:\&gt;TEST3 A B C&nbsp; <br />
屏幕上会显示: <br />
XIAO <br />
TIAN <br />
XIN <br />
<br />
如果运行： <br />
C:\&gt;TEST3 A B&nbsp; <br />
屏幕上会显示 <br />
&nbsp;<br />
&nbsp;<br />
<br />
&nbsp;<br />
4 教教你如何写.bat批处理文件&nbsp; <br />
&nbsp;XIAO <br />
TIAN&nbsp; <br />
<br />
在这个命令执行过程中，DOS会将一个空字符串指定给参数%3。&nbsp; <br />
<br />
2、IF-ERRORLEVEL <br />
<br />
建立TEST4.BAT，内容如下： <br />
@ECHO OFF&nbsp; <br />
XCOPY C:\AUTOEXEC.BAT D:IF ERRORLEVEL 1 ECHO 文件拷贝失败&nbsp; <br />
IF ERRORLEVEL 0 ECHO 成功拷贝文件&nbsp; <br />
<br />
然后执行文件: <br />
C:\&gt;TEST4 <br />
<br />
如果文件拷贝成功，屏幕就会显示&#8220;成功拷贝文件&#8221;，否则就会显示&#8220;文件拷贝失败&#8221;。&nbsp; <br />
<br />
IF ERRORLEVEL 是用来测试它的上一个DOS命令的返回值的，注意只是上一个命令的返回值，而且返回值必<br />
<br />
须依照从大到小次序顺序判断。 <br />
因此下面的批处理文件是错误的： <br />
@ECHO OFF&nbsp; <br />
XCOPY C:\AUTOEXEC.BAT D:\&nbsp; <br />
IF ERRORLEVEL 0 ECHO 成功拷贝文件&nbsp; <br />
IF ERRORLEVEL 1 ECHO 未找到拷贝文件&nbsp; <br />
IF ERRORLEVEL 2 ECHO 用户通过ctrl-c中止拷贝操作&nbsp; <br />
IF ERRORLEVEL 3 ECHO 预置错误阻止文件拷贝操作&nbsp; <br />
IF ERRORLEVEL 4 ECHO 拷贝过程中写盘错误&nbsp; <br />
<br />
无论拷贝是否成功，后面的：&nbsp; <br />
<br />
未找到拷贝文件&nbsp; <br />
用户通过ctrl-c中止拷贝操作&nbsp; <br />
预置错误阻止文件拷贝操作&nbsp; <br />
拷贝过程中写盘错误 <br />
<br />
都将显示出来。&nbsp; <br />
<br />
以下就是几个常用命令的返回值及其代表的意义：&nbsp; <br />
backup&nbsp; <br />
0 备份成功&nbsp; <br />
1 未找到备份文件&nbsp; <br />
2 文件共享冲突阻止备份完成&nbsp; <br />
3 用户用ctrl-c中止备份&nbsp; <br />
4 由于致命的错误使备份操作中止&nbsp; <br />
<br />
diskcomp&nbsp; <br />
0 盘比较相同&nbsp; <br />
1 盘比较不同&nbsp; <br />
2 用户通过ctrl-c中止比较操作&nbsp; <br />
3 由于致命的错误使比较操作中止&nbsp; <br />
4 预置错误中止比较&nbsp; <br />
<br />
diskcopy&nbsp; <br />
0 盘拷贝操作成功&nbsp; <br />
1 非致命盘读/写错&nbsp; <br />
2 用户通过ctrl-c结束拷贝操作&nbsp; <br />
3 因致命的处理错误使盘拷贝中止&nbsp; <br />
4 预置错误阻止拷贝操作&nbsp; <br />
<br />
format&nbsp; <br />
0 格式化成功&nbsp; <br />
3 用户通过ctrl-c中止格式化处理&nbsp; <br />
4 因致命的处理错误使格式化中止&nbsp; <br />
5 在提示&#8220;proceed with format（y/n）?&#8221;下用户键入n结束&nbsp; <br />
<br />
xcopy&nbsp; <br />
0 成功拷贝文件&nbsp; <br />
1 未找到拷贝文件&nbsp; <br />
2 用户通过ctrl-c中止拷贝操作&nbsp; <br />
4 预置错误阻止文件拷贝操作&nbsp; <br />
5 拷贝过程中写盘错误&nbsp; <br />
<br />
3、IF STRING1 == STRING2 <br />
<br />
建立TEST5.BAT，文件内容如下：&nbsp; <br />
@echo off&nbsp; <br />
IF "%1" == "A" FORMAT A:&nbsp; <br />
<br />
执行：&nbsp; <br />
C:\&gt;TEST5 A&nbsp; <br />
屏幕上就出现是否将A:盘格式化的内容。&nbsp; <br />
<br />
注意：为了防止参数为空的情况，一般会将字符串用双引号（或者其它符号，注意不能使用保留符号）括<br />
<br />
起来。 <br />
如：if [%1]==[A] 或者 if %1*==A* <br />
5、GOTO <br />
<br />
建立TEST6.BAT，文件内容如下：&nbsp; <br />
@ECHO OFF&nbsp; <br />
IF EXIST C:\AUTOEXEC.BAT GOTO _COPY&nbsp; <br />
GOTO _DONE <br />
:_COPY&nbsp; <br />
COPY C:\AUTOEXEC.BAT D:\&nbsp; <br />
:_DONE&nbsp; <br />
注意：&nbsp; <br />
(1) 标号前是ASCII字符的冒号":"，冒号与标号之间不能有空格。&nbsp; <br />
(2) 标号的命名规则与文件名的命名规则相同。 <br />
(3) DOS支持最长八位字符的标号，当无法区别两个标号时，将跳转至最近的一个标号。 <br />
6、FOR <br />
建立C:\TEST7.BAT，文件内容如下：&nbsp; <br />
@ECHO OFF&nbsp; <br />
FOR %%C IN (*.BAT *.TXT *.SYS) DO TYPE %%C&nbsp; <br />
运行：&nbsp; <br />
C:&gt;TEST7 <br />
执行以后，屏幕上会将C:盘根目录下所有以BAT、TXT、SYS为扩展名的文件内容显示出来（不包括隐藏文件<br />
）。&nbsp; 
<img src ="http://www.blogjava.net/henry1451/aggbug/199879.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/henry1451/" target="_blank">henry1451</a> 2008-05-11 21:12 <a href="http://www.blogjava.net/henry1451/articles/199879.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>23种设计模式的代码版(Java) </title><link>http://www.blogjava.net/henry1451/articles/198546.html</link><dc:creator>henry1451</dc:creator><author>henry1451</author><pubDate>Mon, 05 May 2008 11:55:00 GMT</pubDate><guid>http://www.blogjava.net/henry1451/articles/198546.html</guid><wfw:comment>http://www.blogjava.net/henry1451/comments/198546.html</wfw:comment><comments>http://www.blogjava.net/henry1451/articles/198546.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/henry1451/comments/commentRss/198546.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/henry1451/services/trackbacks/198546.html</trackback:ping><description><![CDATA[<br />
package &nbsp; lq.test; &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; import &nbsp; java.io.*; &nbsp; <br />
&nbsp; import &nbsp; java.util.*; &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; <span style="color: #0c8213"><span style="color: #0c8213">//*********创建型模式***************</span></span> &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; <span style="color: #0c8213">//factory &nbsp; method &nbsp; 1 &nbsp; <br />
&nbsp; //1具体的构造算法，和2构造出的具体产品由子类实现 &nbsp;</span> <br />
&nbsp; interface &nbsp; Product &nbsp; { &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; <span style="color: #0c8213">//或者我也提供一个工厂的接口，由这个抽象类来继承它 </span>&nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; abstract &nbsp; class &nbsp; Factory &nbsp; { &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; abstract &nbsp; public &nbsp; Product &nbsp; fmd(); &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: #16b600"><span style="color: #16b600"><span style="color: #0c8213"><span style="color: #16b600"><span style="color: #16b600">//我认为这个方方法的存在是，是对FactoryMethod方法的补充 &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; //例如可以为生成的对象赋值，计算为生成对象应付何值，前后的日值 &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; //且这些都是公用的，生成产品的最主要算法还是在FactoryMethod中， &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; //这个方法只是起辅助作用，这也是一种思维方法，将具体的算法实现在一个方法中 &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; //而我不直接调用此方法，而使用另外的一个方法封装它，等到了更灵活的效果，而 &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; //子类需实现的内容是FactoryMethod &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; //此方法是一个TemplateMethod &nbsp;</span></span> </span></span></span><br />
&nbsp; &nbsp;&nbsp;&nbsp; public &nbsp; Product &nbsp; creat() &nbsp; { &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Product &nbsp; pd &nbsp; = &nbsp; null; &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println("before &nbsp; operation"); &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pd &nbsp; = &nbsp; fmd(); &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println("end &nbsp; operation"); &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return &nbsp; pd; &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; Product1 &nbsp; implements &nbsp; Product &nbsp; { &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; Factory1 &nbsp; extends &nbsp; Factory &nbsp; { &nbsp; <br />
&nbsp; public &nbsp; Product &nbsp; fmd() &nbsp; { &nbsp; <br />
&nbsp; Product &nbsp; pd &nbsp; = &nbsp; new &nbsp; Product1(); &nbsp; <br />
&nbsp; return &nbsp; pd; &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; //FactroyMethod &nbsp; 2 &nbsp; <br />
&nbsp; //这种方式简单实用 &nbsp; <br />
&nbsp; interface &nbsp; Producta &nbsp; { &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; interface &nbsp; Factorya &nbsp; { &nbsp; <br />
&nbsp; Producta &nbsp; create(); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; Producta1 &nbsp; implements &nbsp; Producta &nbsp; {} &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; Factorya1 &nbsp; implements &nbsp; Factorya &nbsp; { &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; public &nbsp; Producta &nbsp; create() &nbsp; { &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Producta &nbsp; pda &nbsp; = &nbsp; null; &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pda &nbsp; = &nbsp; new &nbsp; Producta1(); &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return &nbsp; pda; &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp; &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; <span style="color: #0c8213">//AbstractFactory &nbsp; <br />
&nbsp; //AbstractFactory与FactoryMethod的不同在于AbstractFactory创建多个产品 &nbsp; <br />
&nbsp; //感觉此模式没有什么大用 </span>&nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; <span style="color: #0c8213">//当然可以还有更多的接口 </span>&nbsp; <br />
&nbsp; interface &nbsp; Apda &nbsp; {} &nbsp; <br />
&nbsp; interface &nbsp; Apdb &nbsp; {} &nbsp; &nbsp;<br />
&nbsp; interface &nbsp; Afactory &nbsp; { &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; Apda &nbsp; createA(); &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; Apdb &nbsp; createB(); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; Apda1 &nbsp; implements &nbsp; Apda &nbsp; {} &nbsp; <br />
&nbsp; class &nbsp; Apdb1 &nbsp; implements &nbsp; Apdb &nbsp; {} &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; <span style="color: #0c8213">//有几个接口就有几个对应的方法 </span>&nbsp; <br />
&nbsp; class &nbsp; Afactory1 &nbsp; implements &nbsp; Afactory &nbsp; { &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; public &nbsp; Apda &nbsp; createA() &nbsp; { &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Apda &nbsp; apda &nbsp; = &nbsp; null; &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; apda &nbsp; = &nbsp; new &nbsp; Apda1(); &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return &nbsp; apda; &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; public &nbsp; Apdb &nbsp; createB() &nbsp; { &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Apdb &nbsp; apdb &nbsp; = &nbsp; null; &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; apdb &nbsp; = &nbsp; new &nbsp; Apdb1(); &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return &nbsp; apdb; &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; <span style="color: #0c8213">//Builder &nbsp; <br />
&nbsp; //一个产品的生成分为生成部件和组装部件，不同的产品每个部件生成的方式不同 &nbsp; <br />
&nbsp; //而组装的方式相同，部件的生成抽象成接口方法，而组装的方法使用一个TemplateMethod方法 &nbsp; </span><br />
&nbsp; interface &nbsp; Cpda &nbsp; {} &nbsp; <br />
&nbsp; class &nbsp; Cpda1 &nbsp; implements &nbsp; Cpda &nbsp; {} &nbsp; <br />
&nbsp;<br />
&nbsp; interface &nbsp; BuilderI &nbsp; { &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; void &nbsp; buildPart1(); &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; void &nbsp; buildPart2(); &nbsp; <br />
&nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; void &nbsp; initPd(); &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; Cpda &nbsp; getPd(); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; abstract &nbsp; class &nbsp; BuilderA &nbsp; implements &nbsp; BuilderI &nbsp; { &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; Cpda &nbsp; cpda; &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp; public &nbsp; Cpda &nbsp; getPd() &nbsp; { &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; initPd(); &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: #0c8213">//对对象的内容进行设置 &nbsp;</span> <br />
&nbsp; &nbsp;&nbsp;&nbsp; buildPart1(); &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; buildPart2(); &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; return &nbsp; cpda; &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; Builder &nbsp; extends &nbsp; BuilderA &nbsp; { &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; public &nbsp; void &nbsp; buildPart1() &nbsp; { &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; System.out.println(cpda); &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; public &nbsp; void &nbsp; buildPart2() &nbsp; { &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; System.out.println(cpda); &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; public &nbsp; void &nbsp; initPd() &nbsp; { &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cpda &nbsp; = &nbsp; new &nbsp; Cpda1(); &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; <span style="color: #0c8213">//一个简单的生成产品的实现 &nbsp; <br />
&nbsp; //1 &nbsp; </span><br />
&nbsp; abstract &nbsp; class &nbsp; Fy &nbsp; { &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; public &nbsp; abstract &nbsp; void &nbsp; med1(); &nbsp; &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; static &nbsp; class &nbsp; Fy1 &nbsp; extends &nbsp; Fy &nbsp; { &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public &nbsp; void &nbsp; med1() &nbsp; { &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; public &nbsp; static &nbsp; Fy &nbsp; getInstance() &nbsp; { &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Fy &nbsp; fy &nbsp; = &nbsp; new &nbsp; Fy1(); &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return &nbsp; fy; &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: #0c8213">// Fy &nbsp; fy &nbsp; = &nbsp; new &nbsp; Fy1() &nbsp; {//这种匿名内部类是静态的！！ &nbsp; <br />
<blockquote>&nbsp; // public &nbsp; void &nbsp; med1() &nbsp; { &nbsp; <br />
&nbsp; // } &nbsp; <br />
&nbsp; // }; &nbsp; <br />
&nbsp; // return &nbsp; fy <br />
} &nbsp; <br />
</blockquote></span>&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; <span style="color: #0c8213">&nbsp;&nbsp;&nbsp; //2</span> &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; interface &nbsp; Pdd &nbsp; {} &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; class &nbsp; Pdd1 &nbsp; implements &nbsp; Pdd &nbsp; {} &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; abstract &nbsp; class &nbsp; Fya &nbsp; { &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public &nbsp; static &nbsp; Pdd &nbsp; getPd() &nbsp; { &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Pdd &nbsp; pdd &nbsp; = &nbsp; new &nbsp; Pdd1(); &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return &nbsp; pdd; &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; <span style="color: #0c8213">//Prototype &nbsp; 在java中就是clone，又包含深拷贝和浅拷贝</span> &nbsp; <br />
&nbsp; class &nbsp; CloneObja &nbsp; { &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; public &nbsp; CloneObja &nbsp; MyClone() &nbsp; { &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return &nbsp; new &nbsp; CloneObja(); &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; CloneObjb &nbsp; { &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; public &nbsp; CloneObjb &nbsp; MyClone() &nbsp; throws &nbsp; Throwable &nbsp; { &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; CloneObjb &nbsp; cobj &nbsp; = &nbsp; null; &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cobj &nbsp; = &nbsp; (CloneObjb) &nbsp; pcl(this); &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return &nbsp; cobj; &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: #0c8213">/深度拷贝算法</span> &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; private &nbsp; Object &nbsp; pcl(Object &nbsp; obj) &nbsp; throws &nbsp; Throwable &nbsp; { &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; ByteArrayOutputStream &nbsp; bao &nbsp; = &nbsp; new &nbsp; ByteArrayOutputStream(1000); &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; ObjectOutputStream &nbsp; objo &nbsp; = &nbsp; new &nbsp; ObjectOutputStream(bao); &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; objo.writeObject(obj); &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; ByteArrayInputStream &nbsp; bai &nbsp; = &nbsp; new &nbsp; ByteArrayInputStream(bao.toByteArray()); &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; ObjectInputStream &nbsp; obji &nbsp; = &nbsp; new &nbsp; ObjectInputStream(bai); &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; Object &nbsp; objr &nbsp; = &nbsp; obji.readObject(); &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; return &nbsp; objr; &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp; &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; <span style="color: #0c8213">//Singleton &nbsp; <br />
&nbsp; //一个类只有一个对象，例如一个线程池，一个cache </span>&nbsp; <br />
&nbsp; class &nbsp; Singleton1 &nbsp; { &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; public &nbsp; static &nbsp; Singleton1 &nbsp; instance &nbsp; = &nbsp; new &nbsp; Singleton1(); &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; private &nbsp; Singleton1() &nbsp; { &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; public &nbsp; static &nbsp; Singleton1 &nbsp; getInstance() &nbsp; { &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return &nbsp; instance; &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; Singleton2 &nbsp; { &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; public &nbsp; static &nbsp; Singleton2 &nbsp; instance; &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; private &nbsp; Singleton2() &nbsp; { &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
<blockquote>&nbsp; <span style="color: #0c8213">// public &nbsp; static &nbsp; Singleton2 &nbsp; getInstance() &nbsp; { &nbsp; <br />
&nbsp; // if &nbsp; (instance &nbsp; == &nbsp; null) &nbsp; { &nbsp; <br />
&nbsp; // instance &nbsp; = &nbsp; new &nbsp; Singleton2(); &nbsp; <br />
&nbsp; // } &nbsp; <br />
&nbsp; // &nbsp; <br />
&nbsp; // return &nbsp; instance; &nbsp; <br />
&nbsp; // } &nbsp; </span><br />
</blockquote>&nbsp; &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; public &nbsp; static &nbsp; Singleton2 &nbsp; getInstance() &nbsp; { &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; synchronized(Singleton2.class) &nbsp; { &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if &nbsp; (instance &nbsp; == &nbsp; null) &nbsp; { &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; instance &nbsp; = &nbsp; new &nbsp; Singleton2(); &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return &nbsp; instance; &nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp; <br />
&nbsp; }
<div id="AjaxHolder_UpdatePanel1"><a name="pagedcomment"></a>
<h3>Feedback</h3>
<div class="post">
<div class="posthead">
<h2><a title="permalink: re: 23种设计模式的代码版(Java)" href="http://www.cnblogs.com/luohuarenduli/archive/2008/01/17/1042425.html#1042432">#1楼</a>&nbsp;<a name="1042432"></a>[<span class="louzhu">楼主</span>] &nbsp;&nbsp;<a onclick='return SetReplyAuhor("落花人独立")' href="http://www.cnblogs.com/luohuarenduli/archive/2008/01/17/1042425.html#post">回复</a>&nbsp;&nbsp;<a onclick="GetQuote(1042432);return false" href="http://www.cnblogs.com/luohuarenduli/archive/2008/01/17/1042425.html#post">引用</a>&nbsp;&nbsp;<a title="查看该作者发表过的评论" href="http://www.cnblogs.com/CommentsByAuthor.aspx?author=%e8%90%bd%e8%8a%b1%e4%ba%ba%e7%8b%ac%e7%ab%8b" target="_blank">查看</a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl00_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl00$DeleteLink','')"></a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl00_EditLink"></a> </h2>
2008-01-17 10:07 by <a id="AjaxHolder_Comments_CommentList_ctl00_NameLink" href="http://www.cnblogs.com/luohuarenduli/" target="_blank">落花人独立</a>&nbsp;<a class="sendMsg2This" title="给此人发送站内短消息" href="http://space.cnblogs.com/msg/send/%e8%90%bd%e8%8a%b1%e4%ba%ba%e7%8b%ac%e7%ab%8b">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a> </div>
<div class="postbody"><span style="color: #088c29">//**********结构型模式********** &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; //Adapter &nbsp; <br />
&nbsp; //基本方法有两种，一种是使用引用一种使用继承 &nbsp; <br />
&nbsp; //将不符合标准的接口转成符合标准的接口，接口的修改主要是参数的增减， &nbsp; <br />
&nbsp; //返回值类型,当然还有方法名 &nbsp; <br />
&nbsp; //感觉这就是封装的另一种表示形式，封装有用方法封装(在方法中调用功能方法)， &nbsp; <br />
&nbsp; //用类封装(先传入功能方法所在的类的对象，通过调用此对象的功能方法) &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; //使用引用的形式 &nbsp;</span> <br />
&nbsp; class &nbsp; Adapteea &nbsp; { &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; kk() &nbsp; {} &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; interface &nbsp; Targeta &nbsp; { &nbsp; <br />
&nbsp; String &nbsp; vv(int &nbsp; i, &nbsp; int &nbsp; k); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; Adaptera &nbsp; implements &nbsp; Targeta{ &nbsp; <br />
&nbsp; Adapteea &nbsp; ade; &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; Adaptera(Adapteea &nbsp; ade) &nbsp; { &nbsp; <br />
&nbsp; this.ade &nbsp; = &nbsp; ade; &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; String &nbsp; vv(int &nbsp; i, &nbsp; int &nbsp; k) &nbsp; { &nbsp; <br />
&nbsp; <span style="color: #148404">//具体的业务方法实现在Adaptee中，这个方法 &nbsp; <br />
&nbsp; //只起到了接口转换的作用 &nbsp; <br />
&nbsp; //调用此方法是通过引用 &nbsp;</span> <br />
&nbsp; ade.kk(); &nbsp; <br />
&nbsp; return &nbsp; null; &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; <span style="color: #148404">//使用继承形式的</span> &nbsp; <br />
&nbsp; class &nbsp; Adapteeb &nbsp; { &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; kk() &nbsp; {} &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; interface &nbsp; Targetb &nbsp; { &nbsp; <br />
&nbsp; String &nbsp; vv(int &nbsp; i, &nbsp; int &nbsp; k); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; Adapterb &nbsp; extends &nbsp; Adapteeb &nbsp; implements &nbsp; Targetb &nbsp; { &nbsp; <br />
&nbsp; public &nbsp; String &nbsp; vv(int &nbsp; i, &nbsp; int &nbsp; k) &nbsp; { &nbsp; <br />
&nbsp; <span style="color: #148404">//调用此方法是通过继承 &nbsp; </span><br />
&nbsp; kk(); &nbsp; <br />
&nbsp; return &nbsp; null; &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; <span style="color: #148404">//Proxy &nbsp; </span><br />
&nbsp; interface &nbsp; Subject &nbsp; { &nbsp; <br />
&nbsp; void &nbsp; request(); &nbsp; <br />
&nbsp; } &nbsp; &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; realSubject &nbsp; implements &nbsp; Subject &nbsp; { &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; request() &nbsp; { &nbsp; <br />
&nbsp; <span style="color: #148404">//do &nbsp; the &nbsp; real &nbsp; business </span>&nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; Proxy &nbsp; implements &nbsp; Subject &nbsp; { &nbsp; <br />
&nbsp; Subject &nbsp; subject; &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; Proxy(Subject &nbsp; subject) &nbsp; { &nbsp; <br />
&nbsp; this.subject &nbsp; = &nbsp; subject; &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; request() &nbsp; { &nbsp; <br />
&nbsp; System.out.println("do &nbsp; something"); &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; subject.request(); &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; System.out.println("do &nbsp; something"); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; <span style="color: #148404">//Bridge &nbsp; <br />
&nbsp; //感觉就是多态的实现 </span>&nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; interface &nbsp; Imp &nbsp; { &nbsp; <br />
&nbsp; void &nbsp; operation(); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; Cimp1 &nbsp; implements &nbsp; Imp &nbsp; { &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; operation() &nbsp; { &nbsp; <br />
&nbsp; System.out.println("1"); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; Cimp2 &nbsp; implements &nbsp; Imp &nbsp; { &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; operation() &nbsp; { &nbsp; <br />
&nbsp; System.out.println("2"); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; Invoker &nbsp; { &nbsp; <br />
&nbsp; Imp &nbsp; imp &nbsp; = &nbsp; new &nbsp; Cimp1(); &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; invoke() &nbsp; { &nbsp; <br />
&nbsp; imp.operation(); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; <span style="color: #148404">//Composite &nbsp; </span><br />
&nbsp; &nbsp; <br />
&nbsp; interface &nbsp; Component &nbsp; { &nbsp; <br />
&nbsp; void &nbsp; operation(); &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; void &nbsp; add(Component &nbsp; component); &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; void &nbsp; remove(Component &nbsp; component); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; Leaf &nbsp; implements &nbsp; Component &nbsp; { &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; operation() &nbsp; { &nbsp; <br />
&nbsp; System.out.println("an &nbsp; operation"); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; add(Component &nbsp; component) &nbsp; { &nbsp; <br />
&nbsp; throw &nbsp; new &nbsp; UnsupportedOperationException(); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; remove(Component &nbsp; component) &nbsp; { &nbsp; <br />
&nbsp; throw &nbsp; new &nbsp; UnsupportedOperationException(); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; Composite &nbsp; implements &nbsp; Component &nbsp; { &nbsp; <br />
&nbsp; List &nbsp; components &nbsp; = &nbsp; new &nbsp; ArrayList(); &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; operation() &nbsp; { &nbsp; <br />
&nbsp; Component &nbsp; component &nbsp; = &nbsp; null; &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; Iterator &nbsp; it &nbsp; = &nbsp; components.iterator(); &nbsp; <br />
&nbsp; while &nbsp; (it.hasNext()) &nbsp; { &nbsp; <br />
&nbsp;<span style="color: #148404"> //不知道此component对象是leaf还是composite， &nbsp; <br />
&nbsp; //如果是leaf则直接实现操作，如果是composite则继续递归调用</span> &nbsp; <br />
&nbsp; component &nbsp; = &nbsp; (Component) &nbsp; it.next(); &nbsp; <br />
&nbsp; component.operation(); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; add(Component &nbsp; component) &nbsp; { &nbsp; <br />
&nbsp; components.add(component); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; remove(Component &nbsp; component) &nbsp; { &nbsp; <br />
&nbsp; components.remove(component); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; <span style="color: #148404">//Decorator &nbsp; <br />
&nbsp; //对一个类的功能进行扩展时，我可以使用继承，但是不够灵活，所以选用了 &nbsp; <br />
&nbsp; //另外的一种形式,引用与继承都可活得对对象的一定的使用能力，而使用引用将更灵活 &nbsp; <br />
&nbsp; //我们要保证是对原功能的追加而不是修改，否则只能重写方法，或使用新的方法 &nbsp; <br />
&nbsp; //注意concrete的可以直接new出来， &nbsp; <br />
&nbsp; //而decorator的则需要用一个另外的decorator对象才能生成对象 &nbsp; <br />
&nbsp; //使用对象封装，和公用接口 &nbsp; <br />
&nbsp; //Decorator链上可以有多个元素</span> &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; interface &nbsp; Componenta &nbsp; { &nbsp; <br />
&nbsp; void &nbsp; operation(); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; ConcreteComponent &nbsp; implements &nbsp; Componenta &nbsp; { &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; operation() &nbsp; { &nbsp; <br />
&nbsp; System.out.println("do &nbsp; something"); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; Decorator &nbsp; implements &nbsp; Componenta &nbsp; { &nbsp; <br />
&nbsp; private &nbsp; Componenta &nbsp; component; &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; Decorator(Componenta &nbsp; component) &nbsp; { &nbsp; <br />
&nbsp; this.component &nbsp; = &nbsp; component; &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; operation() &nbsp; { &nbsp; <br />
&nbsp; <span style="color: #148404">//do &nbsp; something &nbsp; before</span> &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; component.operation(); &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; <span style="color: #148404">//do &nbsp; something &nbsp; after </span>&nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; <span style="color: #148404">//Facade &nbsp; <br />
&nbsp; //非常实用的一种设计模式，我可以为外部提供感兴趣的接口 &nbsp; </span><br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; Obj1 &nbsp; { &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; ope1() &nbsp; {} &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; ope2() &nbsp; {} &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; Obj2 &nbsp; { &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; ope1() &nbsp; {} &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; ope2() &nbsp; {} &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; Facade &nbsp; { &nbsp; <br />
&nbsp; <span style="color: #088c29"><span style="color: #088c29">//我得到了一个简洁清晰的接口</span></span> &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; fdMethod() &nbsp; { &nbsp; <br />
&nbsp; Obj1 &nbsp; obj1 &nbsp; = &nbsp; new &nbsp; Obj1(); &nbsp; <br />
&nbsp; Obj2 &nbsp; obj2 &nbsp; = &nbsp; new &nbsp; Obj2(); &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; obj1.ope1(); &nbsp; <br />
&nbsp; obj2.ope2(); &nbsp; <br />
&nbsp; &nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; <span style="color: #088c29">//Flyweight &nbsp; <br />
&nbsp; //空</span> </div>
<br />
<br />
<div class="postbody"><span style="color: #256c1b"><span style="color: #256c1b">//**********行为型模式************* &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; //Chain &nbsp; of &nbsp; Responsibility &nbsp; <br />
&nbsp; //与Decorator的实现形式相类似， &nbsp; <br />
&nbsp; //Decorator是在原来的方法之上进行添加功能，而 &nbsp; <br />
&nbsp; //Chain则是判断信号如果不是当前处理的则转交个下一个节点处理 &nbsp; <br />
&nbsp; //我可以使用if分支来实现相同的效果，但是不够灵活，链上的每个节点是可以替换增加的，相对 &nbsp; <br />
&nbsp; //比较灵活，我们可以设计接口实现对节点的增删操作，而实现更方便的效果 &nbsp; <br />
&nbsp; //这个是一个链状的结构，有没有想过使用环状结构 &nbsp;</span></span> <br />
&nbsp; &nbsp; <br />
&nbsp; interface &nbsp; Handler &nbsp; { &nbsp; <br />
&nbsp; void &nbsp; handRequest(int &nbsp; signal); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; CHandler1 &nbsp; implements &nbsp; Handler &nbsp; { &nbsp; <br />
&nbsp; private &nbsp; Handler &nbsp; handler; &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; CHandler1(Handler &nbsp; handler) &nbsp; { &nbsp; <br />
&nbsp; this.handler &nbsp; = &nbsp; handler; &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; handRequest(int &nbsp; signal) &nbsp; { &nbsp; <br />
&nbsp; if &nbsp; (signal &nbsp; == &nbsp; 1) &nbsp; { &nbsp; <br />
&nbsp; System.out.println("handle &nbsp; signal &nbsp; 1"); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; else &nbsp; { &nbsp; <br />
&nbsp; handler.handRequest(signal); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; CHandler2 &nbsp; implements &nbsp; Handler &nbsp; { &nbsp; <br />
&nbsp; private &nbsp; Handler &nbsp; handler; &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; CHandler2(Handler &nbsp; handler) &nbsp; { &nbsp; <br />
&nbsp; this.handler &nbsp; = &nbsp; handler; &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; handRequest(int &nbsp; signal) &nbsp; { &nbsp; <br />
&nbsp; if &nbsp; (signal &nbsp; == &nbsp; 2) &nbsp; { &nbsp; <br />
&nbsp; System.out.println("handle &nbsp; signal &nbsp; 2"); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; else &nbsp; { &nbsp; <br />
&nbsp; handler.handRequest(signal); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; CHandler3 &nbsp; implements &nbsp; Handler &nbsp; { &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; handRequest(int &nbsp; signal) &nbsp; { &nbsp; <br />
&nbsp; if &nbsp; (signal &nbsp; == &nbsp; 3) &nbsp; { &nbsp; <br />
&nbsp; System.out.println("handle &nbsp; signal &nbsp; 3"); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; else &nbsp; { &nbsp; <br />
&nbsp; throw &nbsp; new &nbsp; Error("can't &nbsp; handle &nbsp; signal"); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; ChainClient &nbsp; { &nbsp; <br />
&nbsp; public &nbsp; static &nbsp; void &nbsp; main(String[] &nbsp; args) &nbsp; { &nbsp; <br />
&nbsp; Handler &nbsp; h3 &nbsp; = &nbsp; new &nbsp; CHandler3(); &nbsp; <br />
&nbsp; Handler &nbsp; h2 &nbsp; = &nbsp; new &nbsp; CHandler2(h3); &nbsp; <br />
&nbsp; Handler &nbsp; h1 &nbsp; = &nbsp; new &nbsp; CHandler1(h2); &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; h1.handRequest(2); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; <span style="color: #256c1b">//Interpreter &nbsp; <br />
&nbsp; //感觉跟Composite很类似，只不过他分文终结符和非终结符 &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; //Template &nbsp; Method </span>&nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; abstract &nbsp; class &nbsp; TemplateMethod &nbsp; { &nbsp; <br />
&nbsp; abstract &nbsp; void &nbsp; amd1(); &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; abstract &nbsp; void &nbsp; amd2(); &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; <span style="color: #256c1b">//此方法为一个Template &nbsp; Method方法</span> &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; tmd() &nbsp; { &nbsp; <br />
&nbsp; amd1(); &nbsp; <br />
&nbsp; amd2(); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; <span style="color: #256c1b">//State &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; //标准型 &nbsp; <br />
&nbsp; //状态和操作不应该耦合在一起</span> &nbsp; <br />
&nbsp; class &nbsp; Contexta &nbsp; { &nbsp; <br />
&nbsp; private &nbsp; State &nbsp; st; &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; Contexta(int &nbsp; nst) &nbsp; { &nbsp; <br />
&nbsp; changeStfromNum(nst); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; changeStfromNum(int &nbsp; nst) &nbsp; { &nbsp; <br />
&nbsp; if &nbsp; (nst &nbsp; == &nbsp; 1) &nbsp; { &nbsp; <br />
&nbsp; st &nbsp; = &nbsp; new &nbsp; CStatea1(); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; else &nbsp; if &nbsp; (nst &nbsp; == &nbsp; 2) &nbsp; { &nbsp; <br />
&nbsp; st &nbsp; = &nbsp; new &nbsp; CStatea2(); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; throw &nbsp; new &nbsp; Error("bad &nbsp; state"); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; void &nbsp; request() &nbsp; { &nbsp; <br />
&nbsp; st.handle(this); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; interface &nbsp; State &nbsp; { &nbsp; <br />
&nbsp; void &nbsp; handle(Contexta &nbsp; context); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; CStatea1 &nbsp; implements &nbsp; State &nbsp; { &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; handle(Contexta &nbsp; context) &nbsp; { &nbsp; <br />
&nbsp; System.out.println("state &nbsp; 1"); &nbsp; <br />
&nbsp; <span style="color: #256c1b">//也许在一个状态的处理过程中要改变状态，例如打开之后立即关闭这种效果 &nbsp; <br />
&nbsp; //context.changeStfromNum(2);</span> &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; CStatea2 &nbsp; implements &nbsp; State &nbsp; { &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; handle(Contexta &nbsp; context) &nbsp; { &nbsp; <br />
&nbsp; System.out.println("state &nbsp; 2"); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; <span style="color: #256c1b">//工厂型 &nbsp; <br />
&nbsp; //根据状态不通生成不同的state &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; //class &nbsp; StateFactory &nbsp; { &nbsp; <br />
&nbsp; // public &nbsp; static &nbsp; State &nbsp; getStateInstance(int &nbsp; num) &nbsp; { &nbsp; <br />
&nbsp; // State &nbsp; st &nbsp; = &nbsp; null; &nbsp; <br />
&nbsp; // &nbsp; <br />
&nbsp; // if &nbsp; (num &nbsp; == &nbsp; 1) &nbsp; { &nbsp; <br />
&nbsp; // st &nbsp; = &nbsp; new &nbsp; CStatea1(); &nbsp; <br />
&nbsp; // } &nbsp; </span><br />
&nbsp; <span style="color: #0faa19"><span style="color: #0faa19"><span style="color: #0aa631"><span style="color: #0aa631"><span style="color: #118c19"><span style="color: #118c19">// else &nbsp; if &nbsp; (num &nbsp; == &nbsp; 2) &nbsp; { &nbsp; <br />
&nbsp; // st &nbsp; = &nbsp; new &nbsp; CStatea2(); &nbsp; <br />
&nbsp; // } &nbsp; <br />
&nbsp; // &nbsp; <br />
&nbsp; // return &nbsp; st; &nbsp; <br />
&nbsp; // } &nbsp; <br />
&nbsp; //} &nbsp; </span></span></span></span></span></span><br />
&nbsp; &nbsp; <br />
&nbsp; <span style="color: #118c19">//Strategy &nbsp; <br />
&nbsp; //跟Bridge相类似，就是一种多态的表示 &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; //Visitor &nbsp; <br />
&nbsp; //双向引用，使用另外的一个类调用自己的方法,访问自己的数据结构 </span>&nbsp; <br />
&nbsp; interface &nbsp; Visitor &nbsp; { &nbsp; <br />
&nbsp; void &nbsp; visitElement(Elementd &nbsp; element); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; CVisitor &nbsp; implements &nbsp; Visitor &nbsp; { &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; visitElement(Elementd &nbsp; element) &nbsp; { &nbsp; <br />
&nbsp; element.operation(); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; interface &nbsp; Elementd &nbsp; { &nbsp; <br />
&nbsp; void &nbsp; accept(Visitor &nbsp; visitor); &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; void &nbsp; operation(); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; CElementd &nbsp; implements &nbsp; Elementd &nbsp; { &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; accept(Visitor &nbsp; visitor) &nbsp; { &nbsp; <br />
&nbsp; visitor.visitElement(this); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; operation() &nbsp; { &nbsp; <br />
&nbsp; <span style="color: #118c19">//实际的操作在这里 </span>&nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; Clientd &nbsp; { &nbsp; <br />
&nbsp; public &nbsp; static &nbsp; void &nbsp; main() &nbsp; { &nbsp; <br />
&nbsp; Elementd &nbsp; elm &nbsp; = &nbsp; new &nbsp; CElementd(); &nbsp; <br />
&nbsp; Visitor &nbsp; vis &nbsp; = &nbsp; new &nbsp; CVisitor(); &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; vis.visitElement(elm); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; <span style="color: #118c19">//Iteraotr &nbsp; <br />
&nbsp; //使用迭代器对一个类的数据结构进行顺序迭代 &nbsp; </span><br />
&nbsp; &nbsp; <br />
&nbsp; interface &nbsp; Structure &nbsp; { &nbsp; <br />
&nbsp; interface &nbsp; Iteratora &nbsp; { &nbsp; <br />
&nbsp; void &nbsp; first(); &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; boolean &nbsp; hasElement(); &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; Object &nbsp; next(); &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; Structure1 &nbsp; implements &nbsp; Structure &nbsp; { &nbsp; <br />
&nbsp; Object[] &nbsp; objs &nbsp; = &nbsp; new &nbsp; Object[100]; &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; <span style="color: #118c19">//使用内部类是为了对Struture1的数据结构有完全的访问权 &nbsp;</span> <br />
&nbsp; class &nbsp; Iteratora1 &nbsp; implements &nbsp; Iteratora &nbsp; { &nbsp; <br />
&nbsp; int &nbsp; index &nbsp; = &nbsp; 0; &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; first() &nbsp; { &nbsp; <br />
&nbsp; index &nbsp; = &nbsp; 0; &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; boolean &nbsp; hasElement() &nbsp; { &nbsp; <br />
&nbsp; return &nbsp; index &nbsp; &lt; &nbsp; 100; &nbsp; <br />
&nbsp; } &nbsp; &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; Object &nbsp; next() &nbsp; { &nbsp; <br />
&nbsp; Object &nbsp; obj &nbsp; = &nbsp; null; &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; if &nbsp; (hasElement()) &nbsp; { &nbsp; <br />
&nbsp; obj &nbsp; = &nbsp; objs[index]; &nbsp; <br />
&nbsp; index++; &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; return &nbsp; obj; &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; <span style="color: #118c19">//Meditor &nbsp; </span><br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; A1 &nbsp; { &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; operation1() &nbsp; {} &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; operation2() &nbsp; {} &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; A2 &nbsp; { &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; operation1() &nbsp; {} &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; operation2() &nbsp; {} &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; Mediator &nbsp; { &nbsp; <br />
&nbsp; A1 &nbsp; a1; &nbsp; <br />
&nbsp; A2 &nbsp; a2; &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; Mediator(A1 &nbsp; a1, &nbsp; A2 &nbsp; a2) &nbsp; { &nbsp; <br />
&nbsp; this.a1 &nbsp; = &nbsp; a1; &nbsp; <br />
&nbsp; this.a2 &nbsp; = &nbsp; a2; &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; <span style="color: #118c19">//如果我想实现这个功能我可能会把他放在A1中 &nbsp; <br />
&nbsp; //但是这样耦合大，我不想在A1中出现A2对象的引用， &nbsp; <br />
&nbsp; //所以我使用了Mediator作为中介 &nbsp;</span> <br />
&nbsp; public &nbsp; void &nbsp; mmed1() &nbsp; { &nbsp; <br />
&nbsp; a1.operation1(); &nbsp; <br />
&nbsp; a2.operation2(); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; mmed2() &nbsp; { &nbsp; <br />
&nbsp; a2.operation1(); &nbsp; <br />
&nbsp; a1.operation2(); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; <span style="color: #118c19">//Command &nbsp; <br />
&nbsp; //我认为就是将方法转换成了类 </span>&nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; Receiver &nbsp; { &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; action1() &nbsp; {} &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; action2() &nbsp; {} &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; interface &nbsp; Command &nbsp; { &nbsp; <br />
&nbsp; void &nbsp; Execute(); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; CCommand1 &nbsp; implements &nbsp; Command &nbsp; { &nbsp; <br />
&nbsp; private &nbsp; Receiver &nbsp; receiver; &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; CCommand1(Receiver &nbsp; receiver) &nbsp; { &nbsp; <br />
&nbsp; this.receiver &nbsp; = &nbsp; receiver; &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; Execute() &nbsp; { &nbsp; <br />
&nbsp; receiver.action1(); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; CCommand2 &nbsp; implements &nbsp; Command &nbsp; { &nbsp; <br />
&nbsp; private &nbsp; Receiver &nbsp; receiver; &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; CCommand2(Receiver &nbsp; receiver) &nbsp; { &nbsp; <br />
&nbsp; this.receiver &nbsp; = &nbsp; receiver; &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; Execute() &nbsp; { &nbsp; <br />
&nbsp; receiver.action2(); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; <span style="color: #118c19">//Observer &nbsp; <br />
&nbsp; //在这里看似乎这个模式没有什么用 &nbsp; <br />
&nbsp; //但是如果我有一个线程监控Subject，如果Subject的状态 &nbsp; <br />
&nbsp; //发生了变化，则更改Observer的状态，并出发一些操作，这样就有实际的意义了 &nbsp; <br />
&nbsp; //Observer与Visitor有相似的地方，都存在双向引用 &nbsp; <br />
&nbsp; //Subject可以注册很多Observer &nbsp; </span><br />
&nbsp; &nbsp; <br />
&nbsp; interface &nbsp; Subjectb &nbsp; { &nbsp; <br />
&nbsp; void &nbsp; attach(Observer &nbsp; observer); &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; void &nbsp; detach(Observer &nbsp; observer); &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; void &nbsp; mynotify(); &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; int &nbsp; getState(); &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; void &nbsp; setState(int &nbsp; state); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; Subjectb1 &nbsp; implements &nbsp; Subjectb &nbsp; { &nbsp; <br />
&nbsp; List &nbsp; observers &nbsp; = &nbsp; new &nbsp; ArrayList(); &nbsp; <br />
&nbsp; int &nbsp; state; &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; attach(Observer &nbsp; observer) &nbsp; { &nbsp; <br />
&nbsp; observers.add(observer); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; detach(Observer &nbsp; observer) &nbsp; { &nbsp; <br />
&nbsp; observers.remove(observer); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; mynotify() &nbsp; { &nbsp; <br />
&nbsp; Observer &nbsp; observer &nbsp; = &nbsp; null; &nbsp; <br />
&nbsp; Iterator &nbsp; it &nbsp; = &nbsp; observers.iterator(); &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; while &nbsp; (it.hasNext()) &nbsp; { &nbsp; <br />
&nbsp; observer &nbsp; = &nbsp; (Observer) &nbsp; it.next(); &nbsp; <br />
&nbsp; observer.Update(); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; int &nbsp; getState() &nbsp; { &nbsp; <br />
&nbsp; return &nbsp; state; &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; setState(int &nbsp; state) &nbsp; { &nbsp; <br />
&nbsp; this.state &nbsp; = &nbsp; state; &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; interface &nbsp; Observer &nbsp; { &nbsp; <br />
&nbsp; void &nbsp; Update(); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; Observer1 &nbsp; implements &nbsp; Observer &nbsp; { &nbsp; <br />
&nbsp; Subjectb &nbsp; subject; &nbsp; <br />
&nbsp; int &nbsp; state; &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; Observer1(Subjectb &nbsp; subject) &nbsp; { &nbsp; <br />
&nbsp; this.subject &nbsp; = &nbsp; subject; &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; Update() &nbsp; { &nbsp; <br />
&nbsp; this.state &nbsp; = &nbsp; subject.getState(); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; operation() &nbsp; { &nbsp; <br />
&nbsp; <span style="color: #118c19">//一些基于state的操作 &nbsp;</span> <br />
&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; <span style="color: #118c19">//Memento &nbsp; <br />
&nbsp; //感觉此模式没有什么大用</span> &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; Memento &nbsp; { &nbsp; <br />
&nbsp; int &nbsp; state; &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; int &nbsp; getState() &nbsp; { &nbsp; <br />
&nbsp; return &nbsp; state; &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; setState(int &nbsp; state) &nbsp; { &nbsp; <br />
&nbsp; this.state &nbsp; = &nbsp; state; &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; Originator &nbsp; { &nbsp; <br />
&nbsp; int &nbsp; state; &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; setMemento(Memento &nbsp; memento) &nbsp; { &nbsp; <br />
&nbsp; state &nbsp; = &nbsp; memento.getState(); &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; Memento &nbsp; createMemento() &nbsp; { &nbsp; <br />
&nbsp; Memento &nbsp; memento &nbsp; = &nbsp; new &nbsp; Memento(); &nbsp; <br />
&nbsp; memento.setState(1); &nbsp; <br />
&nbsp; return &nbsp; memento; &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; int &nbsp; getState() &nbsp; { &nbsp; <br />
&nbsp; return &nbsp; state; &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; setState(int &nbsp; state) &nbsp; { &nbsp; <br />
&nbsp; this.state &nbsp; = &nbsp; state; &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; class &nbsp; careTaker &nbsp; { &nbsp; <br />
&nbsp; Memento &nbsp; memento; &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; void &nbsp; saverMemento(Memento &nbsp; memento) &nbsp; { &nbsp; <br />
&nbsp; this.memento &nbsp; = &nbsp; memento; &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; public &nbsp; Memento &nbsp; retrieveMemento() &nbsp; { &nbsp; <br />
&nbsp; return &nbsp; memento; &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp;<span style="color: #118c19"> //程序最终还是顺序执行的，是由不通部分的操作拼接起来的 &nbsp; <br />
&nbsp; //将不同类的代码拼接起来是通过引用实现的，有了引用我就 &nbsp; <br />
&nbsp; //相当于有了一定访问数据结构和方法的能力，这与写在类内部 &nbsp; <br />
&nbsp; //差不多，例如我想将一个类中的一个方法抽离出去，因为这个方法依赖与此类的数据和其他方法 &nbsp; <br />
&nbsp; //直接将代码移走是不行的，但如果我们拥有了此类对象的引用，则与写在此类 &nbsp; <br />
&nbsp; //内部无异，所以我们拥有了引用就可以将此方法移出 </span>&nbsp; <br />
&nbsp; public &nbsp; class &nbsp; tt1 &nbsp; { &nbsp; <br />
&nbsp; public &nbsp; static &nbsp; void &nbsp; main(String[] &nbsp; args) &nbsp; { &nbsp; <br />
&nbsp; } &nbsp; <br />
&nbsp; }<br />
</div>
<br />
<br />
里面有很多不错的设计思想.</div>
</div>
 <img src ="http://www.blogjava.net/henry1451/aggbug/198546.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/henry1451/" target="_blank">henry1451</a> 2008-05-05 19:55 <a href="http://www.blogjava.net/henry1451/articles/198546.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>资源文件的转码</title><link>http://www.blogjava.net/henry1451/articles/198249.html</link><dc:creator>henry1451</dc:creator><author>henry1451</author><pubDate>Sun, 04 May 2008 12:43:00 GMT</pubDate><guid>http://www.blogjava.net/henry1451/articles/198249.html</guid><wfw:comment>http://www.blogjava.net/henry1451/comments/198249.html</wfw:comment><comments>http://www.blogjava.net/henry1451/articles/198249.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/henry1451/comments/commentRss/198249.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/henry1451/services/trackbacks/198249.html</trackback:ping><description><![CDATA[在JDK自带的工具中有一个native2ascii程序专门用来进行资源文件的转码,该工具位于JDK安装目录下的bin目录中。例如，当需要把一个名为a.txt的文件转为ApplicationResource_zh_CN.properties这样的资源文件时，可以采用下面的命令：<br />
<div class="UBBPanel">
<div class="UBBTitle"><img style="margin: 0px 2px -3px 0px" alt="程序代码" src="http://xhl.cqwu.net/images/code.gif" /> 程序代码</div>
<div class="UBBContent">native2ascii -encoding GB2312 a.txt ApplicationResource_zh_CN.properties</div>
</div>
 <img src ="http://www.blogjava.net/henry1451/aggbug/198249.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/henry1451/" target="_blank">henry1451</a> 2008-05-04 20:43 <a href="http://www.blogjava.net/henry1451/articles/198249.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ThreadLocal简介与使用</title><link>http://www.blogjava.net/henry1451/articles/198248.html</link><dc:creator>henry1451</dc:creator><author>henry1451</author><pubDate>Sun, 04 May 2008 12:37:00 GMT</pubDate><guid>http://www.blogjava.net/henry1451/articles/198248.html</guid><wfw:comment>http://www.blogjava.net/henry1451/comments/198248.html</wfw:comment><comments>http://www.blogjava.net/henry1451/articles/198248.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/henry1451/comments/commentRss/198248.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/henry1451/services/trackbacks/198248.html</trackback:ping><description><![CDATA[<strong><br />
什么是ThreadLocal</strong><br />
ThreadLocal并不能从字面上理解为线程的本地实现版本，因为它并不是一个线程，而是ThreadLocal Variable（线程局部变量）。它的功能非常简单，就是为每一个使用该变量的线程都提供一个变量值的副本，使得每一个线程都可以独立地改变自己的副本，而不会和其他线程珠副本冲突。从线程的角度看，就好像每一个线程都完全拥有该变量。<br />
首先看看ThreadLocal的方法：<br />
1、get()<br />
　　返回当前线程的线程局部变量的副本，当第一次调用这个方法时会自动创建并且初始化一个线程局部变量的副本。<br />
2、initialValue()<br />
　　返回该线程的线程局部变量的当前线程的初始值，这个方法只在第一次调用get()方法的时候被调用一次。如果在调用get()方法之前已经调用了set()方法，那么这个方法将不会被调用。<br />
这个方法是一个protected的方法，不能直接调用该方法，只有在其子类中将该方法重写才能改变它的行为。在默认情况下，该方法的返回值为null。<br />
3、set()<br />
　　设置当前线程的线程局部变量副本的值。大多数的应用程序都不需要调用这个方法，可以通过initialValue()方法来设置当前线程局部变量的值。<br />
4、remove()<br />
　　移除当前线程局部变量的值。这样做的目的是可以降低当前线程的存储空间的使用量，这是Java1.5的新增方法。<br />
<br />
<strong>ThreadLocal的使用</strong><br />
ThreadLocal的使用方法有两种，一种方法是自己实现ThreadLocal的子类，并重写initialValue()方法。另一种方法是定义一个表态的ThreadLocal实例，通过使用set()方法来初始化这个线程局部变量的值。<br />
　　如果希望线程局部变量初始化的时候就具有值，那么需要自己实现ThreadLocal的子类并重写该方法，通常使用一个内部匿名类对ThreadLocal进行子类化。例如在下面的例子中，SerialNum类为每一个类分配一个序号：<br />
<div class="UBBPanel">
<div class="UBBTitle"><img style="margin: 0px 2px -3px 0px" alt="程序代码" src="http://xhl.cqwu.net/images/code.gif" /> 程序代码</div>
<div class="UBBContent">public class SerialNum<br />
{<br />
&nbsp;private static int nextSerialNum=0;<br />
&nbsp;private static ThreadLocal serialNum=new ThreadLocal()<br />
&nbsp;{<br />
&nbsp;&nbsp;protected synchronized Object initialValue()<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;return new Integer(nextSerialNum++);<br />
&nbsp;&nbsp;}<br />
&nbsp;};<br />
&nbsp;public static int get()<br />
&nbsp;{<br />
&nbsp;&nbsp;return ((Integer)(serialNum.get())).intValue();<br />
&nbsp;}<br />
}</div>
</div>
<br />
同样，也可以不采用实现ThreadLocal子类的方法来实现同样的功能，如下所示：<br />
<div class="UBBPanel">
<div class="UBBTitle"><img style="margin: 0px 2px -3px 0px" alt="程序代码" src="http://xhl.cqwu.net/images/code.gif" /> 程序代码</div>
<div class="UBBContent">public class SerialNum1<br />
{<br />
&nbsp;private static int nextSerialNum=0;<br />
&nbsp;private static ThreadLocal serialNum=new ThreadLocal();<br />
&nbsp;public static int get()<br />
&nbsp;{<br />
&nbsp;&nbsp;if(serialNum.get()==null)<br />
&nbsp;&nbsp; serialNum.set(new Integer(nextSerialNum++));<br />
&nbsp;&nbsp;return ((Integer)(serialNum.get())).intValue();<br />
&nbsp;}<br />
<br />
}</div>
</div>
<br />
　　SerialNum类的使用非常简单，因为get()方法是static的，所以在需要获取当前线程的序号时，简单地调用int serial=SerialNum.get();即可。<br />
　　在线程是活动并且ThreadLocal对象是可访问时，该线程就持有一个到该线程局部变量副本的隐含引用。当该线程运行结束后，该线程拥有的所有线程局部变量的副本都将失效，并等待垃圾收集器收集。 <br />
<br />
&nbsp; ThreadLocal 几点作用:<br />
1)可以启到类似单态类的作用,实际上是要使某变量达到线程安全时,可以使用这种方式;<br />
2)可以结合<font style="background-color: #c4ecc9">HttpServletRequest</font>,<font style="background-color: #c4ecc9">HttpServletResponse</font>,<font style="background-color: #c4ecc9">ServletContext等来实现使用运行时数据;<br />
<br />
在使用ThreadLocal 时一般是使用get()方法,但在使用这个方法时,会先调用set()方法,具体的用途可以在创建ThreadLocal 变量时指定,也可以<br />
<br />
重写set()方法,如果不想设定set()方法,可以在创建ThreadLocal 变量时指定,如下:<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_58_163_Open_Image" onclick="this.style.display='none'; Codehighlighter1_58_163_Open_Text.style.display='none'; Codehighlighter1_58_163_Closed_Image.style.display='inline'; Codehighlighter1_58_163_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_58_163_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_58_163_Closed_Text.style.display='none'; Codehighlighter1_58_163_Open_Image.style.display='inline'; Codehighlighter1_58_163_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;ThreadLocal&nbsp;currentUser&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ThreadLocal()</span><span id="Codehighlighter1_58_163_Open_Text"><span style="color: #000000">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">synchronized</span><span style="color: #000000">&nbsp;Object&nbsp;initialValue()&nbsp;</span><span id="Codehighlighter1_114_156_Open_Text"><span style="color: #000000">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;User();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">;</span></div>
</font><br />
或者使用:<font style="background-color: #c4ecc9">public static void setCurrentUser(User user) { currentUser.set(user); }手工给ThreadLocal&nbsp;变量赋值(user),<br />
要获得User对象时,可以使用 User u = (User)<font style="background-color: #c4ecc9">currentUser.get();即直接调用get()方法,来返回set()方法所设置的值(也可以不写<br />
此方法,而直接在定义变量时,重写initialValue()方法,此方法返回所要设置的值或对象),这里是User对象,然后调用User类的其他方法.<br />
</font><br />
</font><br />
&nbsp;
<img src ="http://www.blogjava.net/henry1451/aggbug/198248.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/henry1451/" target="_blank">henry1451</a> 2008-05-04 20:37 <a href="http://www.blogjava.net/henry1451/articles/198248.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>