﻿<?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-日出而作兮勤于外，日落而归兮忙于内-随笔分类-j2se</title><link>http://www.blogjava.net/cherishchen/category/23923.html</link><description>The art of living is to know when to hold fast and when to let go</description><language>zh-cn</language><lastBuildDate>Tue, 08 Apr 2008 13:42:24 GMT</lastBuildDate><pubDate>Tue, 08 Apr 2008 13:42:24 GMT</pubDate><ttl>60</ttl><item><title>关于Java String的intern and ==的笔试题，没有全答对</title><link>http://www.blogjava.net/cherishchen/archive/2008/03/17/186782.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Mon, 17 Mar 2008 07:43:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2008/03/17/186782.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/186782.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2008/03/17/186782.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/186782.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/186782.html</trackback:ping><description><![CDATA[<blockquote>
<pre>package testPackage;<br />
class Test {<br />
public static void main(String[] args) {<br />
String hello = "Hello", lo = "lo";<br />
System.out.print((hello == "Hello") + " ");<br />
System.out.print((Other.hello == hello) + " ");<br />
System.out.print((other.Other.hello == hello) + " ");<br />
System.out.print((hello == ("Hel"+"lo")) + " ");<br />
System.out.print((hello == ("Hel"+lo)) + " ");<br />
System.out.println(hello == ("Hel"+lo).intern());<br />
}<br />
}<br />
class Other { static String hello = "Hello"; }<br />
</pre>
</blockquote>
<p><a name="229778"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and the compilation unit: </p>
<blockquote>
<pre>package other;<br />
public class Other { static String hello = "Hello"; }</pre>
</blockquote>
<pre> 正确答案：true true true true false true</pre>
<pre>&nbsp;</pre>
<p>This example illustrates six points:
</p>
<ul><a name="241676"></a>
    <li>Literal strings within the same class <a href="http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.html#3857">(&#167;8)</a> in the same package <a href="http://java.sun.com/docs/books/jls/second_edition/html/packages.doc.html#34412">(&#167;7)</a> represent references to the same <code>String</code> object <a href="http://java.sun.com/docs/books/jls/second_edition/html/typesValues.doc.html#12028">(&#167;4.3.1)</a>. <a name="229807"></a>
    </li>
    <li>Literal strings within different classes in the same package represent references to the same <code>String</code> object. <a name="229797"></a>
    </li>
    <li>Literal strings within different classes in different packages likewise represent references to the same <code>String</code> object. <a name="23858"></a>
    </li>
    <li>Strings computed by constant expressions <a href="http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#5313">(&#167;15.28)</a> are <strong>computed a</strong>t compile time and then treated as if they were literals. <a name="23859"></a>
    </li>
    <li><strong>Strings computed at run time are newly created and therefore distinct</strong>. <a name="23865"></a>
    </li>
    <li>The result of explicitly interning a computed string is the same string as any pre-existing literal string with the same contents. </li>
</ul>
<p>&nbsp;</p>
<p>呵呵，我是没有能够全部答对</p>
<p>&nbsp;</p>
<p>另外一篇关于String intern的文章：</p>
<p><a title="http://laiseeme.javaeye.com/blog/102442" href="http://laiseeme.javaeye.com/blog/102442">http://laiseeme.javaeye.com/blog/102442</a></p>
<img src ="http://www.blogjava.net/cherishchen/aggbug/186782.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cherishchen/" target="_blank">凭栏观海</a> 2008-03-17 15:43 <a href="http://www.blogjava.net/cherishchen/archive/2008/03/17/186782.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计及设计模式：关于Java权限控制算法(转）</title><link>http://www.blogjava.net/cherishchen/archive/2008/02/25/181882.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Mon, 25 Feb 2008 01:20:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2008/02/25/181882.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/181882.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2008/02/25/181882.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/181882.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/181882.html</trackback:ping><description><![CDATA[<p>http://publish.itpub.net/j/2008-01-24/200801240919412.shtml</p>
<p>
作者：<strong class="red">来自ITPUB论坛</strong>&nbsp;&nbsp;2008-01-24</p>
<p><br />
</p>
<p>向大家介绍一种很不错，也是Linux中的权限管理算法。
</p>
<p>　　定义a^b为：a的b次方</p>
<p>　　假如，我们为每一个操作设定一个唯一的整数值，比如：</p>
<p>　　删除A---0</p>
<p>　　修改A---1</p>
<p>　　添加A---2</p>
<p>　　删除B---3</p>
<p>　　修改B---4</p>
<p>　　添加B---5</p>
<p>　　。。。</p>
<p>　　理论上可以有N个操作，这取决于你用于储存用户权限值的数据类型了。</p>
<p>　　这样，如果用户有权限：添加A---2;删除B---3;修改B---4</p>
<p>　　那用户的权限值 purview =2^2+2^3+2^4=28，也就是2的权的和了</p>
<p>　　化成二进制可以表示为11100</p>
<p>　　如果要验证用户是否有删除B的权限，就可以通过位与运算来实现。</p>
<p>　　在Java里，位与运算运算符号为&amp;</p>
<p>　　即是：int value = purview &amp;((int)Math.pow(2,3));</p>
<p>　　你会发现，当用户有操作权限时，运算出来的结果都会等于这个操作需要的权限值!</p>
<p>　　原理：</p>
<p>　　位与运算，顾名思义就是对位进行与运算：</p>
<p>　　以上面的式子为例：purview &amp; 2^3 也就是　28&amp;8</p>
<p>　　将它们化成二进制有</p>
<p>　　11100</p>
<p>　　&amp; 01000</p>
<p>　　-------------------</p>
<p>　　01000 == 8(十进制)　==　2^3</p>
<p>　　同理，如果要验证是否有删除A---0的权限</p>
<p>　　可以用：purview &amp;((int)Math.pow(2,0));</p>
<p>　　即：</p>
<p>　　11100</p>
<p>　　&amp; 00001</p>
<p>　　------------------------</p>
<p>　　00000 == 0(十进制)　　!=　2^0</p>
<p>　　这种算法的一个优点是速度快。可以同时处理N个权限，设置N种角色.</p>
<p>　　如果想验证是否同时有删除A---0和删除B---3的权限</p>
<p>　　可以用purview&amp;(2^0+2^3)==(2^0+2^3)?true:false;</p>
<p>　　设置多角色用户。根据权限值判断用户的角色。。。</p>
<p>　　下面提供一个java的单操作权限判断的代码：</p>
<div style="overflow: auto; width: 500px;">
<pre style="border: 1px solid black; padding: 4px; background-color: #ededed;">
<div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--><span style="color: #000000;">　　</span><span style="color: #008000;">//</span><span style="color: #008000;">userPurview是用户具有的总权限<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">optPurview是一个操作要求的权限为一个整数(没有经过权的!)</span><span style="color: #008000;"><br />
</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> boolean checkPower(</span><span style="color: #0000ff;">int</span><span style="color: #000000;"> userPurview, </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> optPurview){<br />
</span><span style="color: #0000ff;">int</span><span style="color: #000000;"> purviewValue </span><span style="color: #000000;">=</span><span style="color: #000000;"> (</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)Math.pow(</span><span style="color: #000000;">2</span><span style="color: #000000;">, optPurview);<br />
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> (userPurview </span><span style="color: #000000;">&amp;</span><span style="color: #000000;"> purviewValue) </span><span style="color: #000000;">==</span><span style="color: #000000;"> purviewValue;<br />
}</span></div>
<br />
</pre>
</div>
<p>　　当然，多权限的验证只要扩展一下就可以了。</p>
<p>　　几点注意事项：首先，一个系统可能有很多的操作，因此，请建立数据字典，以便查阅，修改时使用。其次，如果用数据库储存用户权限，请注意数值的
有效范围。操作权限值请用唯一的整数!Java的int类型最多可以储存11个权限和.如果超过，可以选择其它数据类型，而且建议不同模块，使用多个权限
变量.</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/cherishchen/aggbug/181882.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cherishchen/" target="_blank">凭栏观海</a> 2008-02-25 09:20 <a href="http://www.blogjava.net/cherishchen/archive/2008/02/25/181882.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java基础：byte与int</title><link>http://www.blogjava.net/cherishchen/archive/2007/07/31/133588.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Tue, 31 Jul 2007 07:54:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/07/31/133588.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/133588.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2007/07/31/133588.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/133588.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/133588.html</trackback:ping><description><![CDATA[<p>byte与int的区别：</p> <ul> <li>byte uses 1 byte while int uses 4 bytes.  <li>integer literals like "45" are of int not byte.If you want a literal to be a byte, you have to cast it: "(byte)45".  <li>When values are promoted as part of an expression or as parameters to a method call, they may be promoted to int, but never to byte.  <li>Many parts of the Java language used int, but none of them use byte. For example, the length of an array is an int. </li></ul> <h4><strong>byte类型的使用场合：</strong></h4> <p>由于不同的机器对于<strong>多字节数据(int 就是采用4个byte保存数据）</strong>的存储方式不同,可能是 低字节向高字节存储,也可能是从高字节向低字节存储,这样,<strong>在 分析网络协议或文件格时</strong>,为了解决不同机器上的字节存储顺序问题,用byte类型来表示数据是合适的。<strong>而通常情况下,由于其表示的数据范围很小,容易造成溢出,应避免使用。</strong></p> <p><br>/**<br>&nbsp;&nbsp;&nbsp;&nbsp; * Convert&nbsp; an int to a byte array<br>&nbsp;&nbsp;&nbsp;&nbsp; *<br>&nbsp;&nbsp;&nbsp;&nbsp; * @param value int<br>&nbsp;&nbsp;&nbsp;&nbsp; * @return byte[]<br>&nbsp;&nbsp;&nbsp;&nbsp; */<br>public static byte[] intToByteArray(int value) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] b = new byte[4];</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; // 使用4个byte表示int<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; 4; i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int offset = (b.length - 1 - i) * 8;&nbsp; // 偏移量<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b[i] = (byte) ((value &gt;&gt; offset) &amp; 0xFF); //每次取8bit<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return b;<br>&nbsp;&nbsp;&nbsp; }</p> <p><br>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp;&nbsp; * Convert the byte array to an int starting from the given offset.<br>&nbsp;&nbsp;&nbsp;&nbsp; *<br>&nbsp;&nbsp;&nbsp;&nbsp; * @param b The byte array<br>&nbsp;&nbsp;&nbsp;&nbsp; * @param offset The array offset,如果byte数组长度就是4，则该值为0<br>&nbsp;&nbsp;&nbsp;&nbsp; * @return The integer<br>&nbsp;&nbsp;&nbsp;&nbsp; */&nbsp;&nbsp; </p> <p>public static int byteArrayToInt(byte[] b, int offset) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int value = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; b.length; i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int shift = (b.length - 1 - i) * 8;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value += (b[i + offset] &amp; 0xFF) &lt;&lt; shift;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return value;<br>&nbsp;&nbsp;&nbsp; }  <p>&nbsp;</p> <p>public static void main(String[] args) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] bb=intToByteArray(255);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;bb.length;i++){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(bb[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; }  <p>输出结果：</p> <p>0<br>0<br>0<br>-1  <p>这是补码的形式（10000001），取反加1可以得到源码（11111111）  <img src ="http://www.blogjava.net/cherishchen/aggbug/133588.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cherishchen/" target="_blank">凭栏观海</a> 2007-07-31 15:54 <a href="http://www.blogjava.net/cherishchen/archive/2007/07/31/133588.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>判断resultset是否含有记录</title><link>http://www.blogjava.net/cherishchen/archive/2007/07/30/133368.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Mon, 30 Jul 2007 08:42:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/07/30/133368.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/133368.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2007/07/30/133368.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/133368.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/133368.html</trackback:ping><description><![CDATA[<p>boolean hasRows = false;<br>while (rs.next()){<br>&nbsp; hasRows&nbsp; = true;<br>&nbsp; //Do your stuff<br>}<br>if (!hasRows ){<br>&nbsp; //Empty result set<br>}<br>//You dont have to test for null result set </p><img src ="http://www.blogjava.net/cherishchen/aggbug/133368.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cherishchen/" target="_blank">凭栏观海</a> 2007-07-30 16:42 <a href="http://www.blogjava.net/cherishchen/archive/2007/07/30/133368.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java的数据类型（备用）</title><link>http://www.blogjava.net/cherishchen/archive/2007/07/27/132720.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Fri, 27 Jul 2007 03:11:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/07/27/132720.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/132720.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2007/07/27/132720.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/132720.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/132720.html</trackback:ping><description><![CDATA[&nbsp; 结合了前段时间看unicode的知识补补基础<br><br>
<ul>
    <li><strong>byte</strong>: The <code>byte</code> data type is an 8-bit signed two's complement integer. It has a minimum value of -128 and a maximum value of 127 (inclusive). The <code>byte</code> data type can be useful for saving memory in large <a href="http://java.sun.com/docs/books/tutorial/java/nutsandbolts/arrays.html">arrays</a>, where the memory savings actually matters. They can also be used in place of <code>int</code> where their limits help to clarify your code; the fact that a variable's range is limited can serve as a form of documentation.  </li>
    <li><strong>short</strong>: The <code>short</code> data type is a 16-bit signed two's complement integer. It has a minimum value of -32,768 and a maximum value of 32,767 (inclusive). As with <code>byte</code>, the same guidelines apply: you can use a <code>short</code> to save memory in large arrays, in situations where the memory savings actually matters.  </li>
    <li><strong>int</strong>: The <code>int</code> data type is a 32-bit signed two's complement integer. It has a minimum value of -2,147,483,648 and a maximum value of 2,147,483,647 (inclusive). For integral values, this data type is generally the default choice unless there is a reason (like the above) to choose something else. This data type will most likely be large enough for the numbers your program will use, but if you need a wider range of values, use <code>long</code> instead.  </li>
    <li><strong>long</strong>: The <code>long</code> data type is a 64-bit signed two's complement integer. It has a minimum value of -9,223,372,036,854,775,808 and a maximum value of 9,223,372,036,854,775,807 (inclusive). Use this data type when you need a range of values wider than those provided by <code>int</code>.  </li>
    <li><strong>float</strong>: The <code>float</code> data type is a single-precision 32-bit IEEE 754 floating point. Its range of values is beyond the scope of this discussion, but is specified in section <a href="http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.2.3">4.2.3</a> of the Java Language Specification. As with the recommendations for <code>byte</code> and <code>short</code>, use a <code>float</code> (instead of <code>double</code>) if you need to save memory in large arrays of floating point numbers. This data type should never be used for precise values, such as currency. For that, you will need to use the <a href="http://java.sun.com/javase/6/docs/api/java/math/BigDecimal.html">java.math.BigDecimal</a> class instead. <a href="http://java.sun.com/docs/books/tutorial/java/data/index.html">Numbers and Strings</a> covers <code>BigDecimal</code> and other useful classes provided by the Java platform.  </li>
    <li><strong>double</strong>: The <code>double</code> data type is a double-precision 64-bit IEEE 754 floating point. Its range of values is beyond the scope of this discussion, but is specified in section <a href="http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.2.3">4.2.3</a> of the Java Language Specification. For decimal values, this data type is generally the default choice. As mentioned above, this data type should never be used for precise values, such as currency.  </li>
    <li><strong>boolean</strong>: The <code>boolean</code> data type has only two possible values: <code>true</code> and <code>false</code>. Use this data type for simple flags that track true/false conditions. This data type represents one bit of information, but its "size" isn't something that's precisely defined.  </li>
    <li><strong>char</strong>: The <code>char</code> data type is a single 16-bit Unicode character. It has a minimum value of <code>'\u0000'</code> (or 0) and a maximum value of <code>'\uffff'</code> (or 65,535 inclusive). </li>
</ul>
<p>&nbsp;</p>
<table unselectable="on" border="0" cellpadding="2" cellspacing="0" width="828">
    <tbody>
        <tr>
            <td valign="top" width="173">
            <p><strong>类型名称</strong></p>
            </td>
            <td valign="top" width="177"><strong>类型定义</strong></td>
            <td valign="top" width="474"><strong>类型取值</strong></td>
        </tr>
        <tr>
            <td valign="top" width="173"><em>boolean</em></td>
            <td valign="top" width="177">布尔值</td>
            <td valign="top" width="473"><em>true</em>, <em>false</em></td>
        </tr>
        <tr>
            <td valign="top" width="173"><em>byte</em></td>
            <td valign="top" width="177">8位<strong>有符号整数</strong></td>
            <td valign="top" width="473">最小值-128，最大值127</td>
        </tr>
        <tr>
            <td valign="top" width="173"><em>short</em></td>
            <td valign="top" width="177">16位<strong>有符号整数</strong></td>
            <td valign="top" width="472">
            <p>最小值-32768（-2<sup>15</sup>），最大值32767（2<sup>15</sup>-1）</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="173"><em>int</em></td>
            <td valign="top" width="177">32位<strong>有符号整数</strong></td>
            <td valign="top" width="472">最小值-2147483648（-2<sup>31</sup>），最大值2147483647（2<sup>31</sup>-1）</td>
        </tr>
        <tr>
            <td valign="top" width="173"><em>long</em></td>
            <td valign="top" width="177">64位<strong>有符号整数</strong></td>
            <td valign="top" width="472">
            <p>-2<sup>63</sup>~(2<sup>63</sup>-1)</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="173"><em>float</em></td>
            <td valign="top" width="177">32位浮点数</td>
            <td valign="top" width="472">
            <p>1.4E-45~3.4028235E38</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="173"><em>double</em></td>
            <td valign="top" width="177">64位浮点数</td>
            <td valign="top" width="472">4.9E-324~1.7976931348623157E308</td>
        </tr>
        <tr>
            <td valign="top" width="173">char</td>
            <td valign="top" width="177">16位Unicode字符</td>
            <td valign="top" width="472">&nbsp;</td>
        </tr>
        <tr>
            <td valign="top" width="173">&nbsp;</td>
            <td valign="top" width="177">&nbsp;</td>
            <td valign="top" width="472">&nbsp;</td>
        </tr>
    </tbody>
</table>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="ad_in_page"> <script type="text/javascript"><!--
google_ad_client = "pub-7843511305731432";
google_ad_width =" 468;
google_ad_height" = 60;
google_ad_format =" "468x60_as";
google_ad_type" = "text_image";
//2007-07-22: test
google_ad_channel =" "2043099642";
google_color_border" = "ffffff";
google_color_bg =" "ffffff";
google_color_link" = "ffffff";
google_color_text =" "000000";
google_color_url" = "000033";
//-->
</script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script> </div><img src ="http://www.blogjava.net/cherishchen/aggbug/132720.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cherishchen/" target="_blank">凭栏观海</a> 2007-07-27 11:11 <a href="http://www.blogjava.net/cherishchen/archive/2007/07/27/132720.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java语言中的bit 移位操作</title><link>http://www.blogjava.net/cherishchen/archive/2007/07/27/132717.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Fri, 27 Jul 2007 03:08:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/07/27/132717.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/132717.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2007/07/27/132717.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/132717.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/132717.html</trackback:ping><description><![CDATA[<div class="ad_in_page"> <script type="text/javascript"><!--
google_ad_client = "pub-7843511305731432";
google_ad_width = 468;
google_ad_height = 60;
google_ad_format = "468x60_as";
google_ad_type = "text_image";
//2007-07-22: test
google_ad_channel = "2043099642";
google_color_border = "FFFFFF";
google_color_bg = "FFFFFF";
google_color_link = "FFFFFF";
google_color_text = "000000";
google_color_url = "000033";
//-->
</script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script> </div>  <div class="ad_in_page">&nbsp;</div> <h4><strong>java 位操作符：</strong></h4> <p><strong>取反：</strong>~x<br>- flips each bit to the opposite value.  <p><b>与操作：AND</b>  <p>x &amp; y<br>- AND operation between the corresponding bits in x and y.  <p><b>或操作：OR</b><br>x | y<br>- OR operation between the corresponding bits in x and y.  <p><b>异或操作：XOR</b><br>x ^ y<br>- XOR operation between the corresponding bits in x and y.  <p><strong>左移操作：Shift left</strong><br>x &lt;&lt; y<br>- shifts x to the left by y bits. The high order bits are lost while zeros fill the right bits.  <p>将x左移y位，移动过程中，高位会丢失  <p><b>有符号数右移操作：Shift Right - Signed</b><br>x &gt;&gt; y<br>- shifts x to the right by y bits. The low order bits are lost while the sign bit value (0 for positive numbers, 1 for negative) fills in the left bits.  <p><b>无符号数右移：Shift Right - Unsigned</b><br>x &gt;&gt;&gt; y <br>- shifts x to the right by y bits. The low order bits are lost while zeros fill in the left bits regardless of the sign.  <h4><strong>例子：</strong></h4> <p>下面的例子显示如何将一个int数组通过移位操作压缩到一个int内保存，其原理是在java语言中，int类型使用4 bytes来保存，因此对于需要压缩的int数组，其中的每一个int值的大小不能超过255（2的8次方-1），因此这只是一个实例：</p> <p>&nbsp;&nbsp;int [] aRGB = {0x56, 0x78, 0x9A, 0xBC};&nbsp;&nbsp;&nbsp;//&nbsp;是用16进制保存的4种颜色值<br>&nbsp;&nbsp;int color_val = aRGB[3];&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;color_val = color_val | (aRGB[2] &lt;&lt; 8);&nbsp; //&nbsp;为了压缩，需要放置到color_val值的第二个字节位置上：将aRGB[2]&nbsp;左移到第二个byte，同时与color_val进行或操作，下面同理<br>&nbsp;&nbsp;color_val = color_val | (aRGB[1] &lt;&lt; 16);&nbsp;&nbsp;<br>&nbsp;&nbsp;color_val = color_val | (aRBG[0] &lt;&lt; 24);  <p>操作完的结果是56 78 9A BC  <p>如果要从colorVal 还原为int数组，或者得到数组中的某个值，只需要对colorVal 进行相应的右移操作即可：  <p>&nbsp;&nbsp;int alpha_val = (colorVal &gt;&gt;&gt; 24) &amp; 0xFF;<br>&nbsp;&nbsp;int red_val &nbsp;&nbsp;= (colorVal &gt;&gt;&gt; 16) &amp; 0xFF;<br>&nbsp;&nbsp;int green_val = (colorVal &gt;&gt;&gt; &nbsp;8) &amp; 0xFF;<br>&nbsp;&nbsp;int blue_val &nbsp;= &nbsp;colorVal &amp; 0xFF;  <p>参考资料：  <p><a href="http://www.particle.kth.se/%7Elindsey/JavaCourse/Book/Part1/Tech/Chapter10/bits.html" target="_blank">Bits in Java</a></p><img src ="http://www.blogjava.net/cherishchen/aggbug/132717.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cherishchen/" target="_blank">凭栏观海</a> 2007-07-27 11:08 <a href="http://www.blogjava.net/cherishchen/archive/2007/07/27/132717.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JPA --Java EE 5.0 ORM 规范（转）</title><link>http://www.blogjava.net/cherishchen/archive/2007/07/21/131658.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Sat, 21 Jul 2007 12:50:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/07/21/131658.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/131658.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2007/07/21/131658.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/131658.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/131658.html</trackback:ping><description><![CDATA[<p>作者: 它山 出处:<a href="http://www.it168.com/">IT168</a></p> <p><a title="http://tech.it168.com/j/n/2007-03-05/200703051354348.shtml" href="http://tech.it168.com/j/n/2007-03-05/200703051354348.shtml">http://tech.it168.com/j/n/2007-03-05/200703051354348.shtml</a></p> <p>PA作为一项对象持久化的标准，不但可以获得Java EE应用服务器的支持，还可以直接在Java SE中使用。</p> <p>介绍得很清楚的文章</p> <p>&nbsp;</p> <p><strong>JPA概述</strong>  <p>JPA(Java Persistence API)作为Java EE 5.0平台标准的ORM规范，将得到所有Java EE服务器的支持。Sun这次吸取了之前EJB规范惨痛失败的经历，在充分吸收现有ORM框架的基础上，得到了一个易于使用、伸缩性强的ORM规范。从目前的开发社区的反应上看，JPA受到了极大的支持和赞扬，JPA作为ORM领域标准化整合者的目标应该不难实现。&nbsp;  <p>JPA通过JDK 5.0注解或XML描述对象－关系表的映射关系，并将运行期的实体对象持久化到数据库中，图 1很好地描述了JPA的结构：  <p><img height="305" alt="" src="http://developer.51cto.com/files/uploadimg/20070305/1547200.JPG" width="450">  <p>Sun引入新的JPA ORM规范出于两个原因：其一，简化现有Java EE和Java SE应用的对象持久化的开发工作；其二，Sun希望整合对ORM技术，实现天下归一。&nbsp;  <p>JPA由EJB 3.0软件专家组开发，作为JSR-220实现的一部分。但它不囿于EJB 3.0，你可以在Web应用、甚至桌面应用中使用。JPA的宗旨是为POJO提供持久化标准规范，由此可见，经过这几年的实践探索，能够脱离容器独立运行，方便开发和测试的理念已经深入人心了。目前Hibernate 3.2、TopLink 10.1.3以及OpenJpa都提供了JPA的实现。  <p>JPA的总体思想和现有Hibernate、TopLink，JDO等ORM框架大体一致。总的来说，JPA包括以下3方面的技术：&nbsp;  <ul> <li>ORM映射元数据，JPA支持XML和JDK 5.0注解两种元数据的形式，元数据描述对象和表之间的映射关系，框架据此将实体对象持久化到数据库表中；&nbsp;  <li>JPA 的API，用来操作实体对象，执行CRUD操作，框架在后台替我们完成所有的事情，开发者从繁琐的JDBC和SQL代码中解脱出来。&nbsp;  <li>查询语言，这是持久化操作中很重要的一个方面，通过面向对象而非面向数据库的查询语言查询数据，避免程序的SQL语句紧密耦合。&nbsp;</li></ul><img src ="http://www.blogjava.net/cherishchen/aggbug/131658.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cherishchen/" target="_blank">凭栏观海</a> 2007-07-21 20:50 <a href="http://www.blogjava.net/cherishchen/archive/2007/07/21/131658.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个简单blog备份工具的实现</title><link>http://www.blogjava.net/cherishchen/archive/2007/07/16/130508.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Mon, 16 Jul 2007 03:22:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/07/16/130508.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/130508.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2007/07/16/130508.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/130508.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/130508.html</trackback:ping><description><![CDATA[<p>&nbsp;</p> <p>为了备份blog，简单写了一个适用于blogjava等metaWeblog的blog备份工具，功能：</p> <p>（1）备份post的正文到本地</p> <p>（2）备份正文中的图片、css文件到本地</p> <p>（3）基于以上两的步骤，修改相关的链接，实现本地脱机浏览</p> <p>想到了但是未实现的功能：</p> <p>（1）评论无法保存</p> <p>（2）合适的话可以考虑以Eclipes RCP形式包装</p> <p>&nbsp;</p> <div class="ad_in_page"> <script type="text/javascript"><!--
google_ad_client = "pub-7843511305731432";
google_ad_width = 468;
google_ad_height = 60;
google_ad_format = "468x60_as";
google_ad_type = "text_image";
//2007-07-22: test
google_ad_channel = "2043099642";
google_color_border = "FFFFFF";
google_color_bg = "FFFFFF";
google_color_link = "FFFFFF";
google_color_text = "000000";
google_color_url = "000033";
//-->
</script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script> </div> <h2>一、实现原理</h2> <p>（1）获取post的方法：使用MetaWeblog提供的API接口</p> <p>metaWeblog.getRecentPosts (blogid, username, password, numberOfPosts) returns array of structs,</p> <p>Each struct represents a recent weblog post, containing the same information that a call to metaWeblog.getPost would return. </p> <p>If numberOfPosts is 1, you get the most recent post. If it's 2 you also get the second most recent post, as the second array element. If numberOfPosts is greater than the number of posts in the weblog you get all the posts in the weblog. </p> <p>&nbsp;</p> <p>(2) 使用正则表达式分析获取下来的post，解析出post中包含的css和图片文件的地址，执行两步操作</p> <ul> <li>根据地址，抓取图片保存到本地  <li>修改post中的地址为本地保存地址 </li></ul> <p>(3) 使用xml-rpc来简化远程调用过程的编程</p> <p>&nbsp;</p> <h2>二、主要的代码</h2> <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%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;ArrayList</span><span style="color: #000000">&lt;</span><span style="color: #000000">SimplePost</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;getAllPosts(String&nbsp;blogID,&nbsp;String&nbsp;name,String&nbsp;password,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;num)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;XmlRpcException&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ArrayList</span><span style="color: #000000">&lt;</span><span style="color: #000000">SimplePost</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;posts&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ArrayList</span><span style="color: #000000">&lt;</span><span style="color: #000000">SimplePost</span><span style="color: #000000">&gt;</span><span style="color: #000000">();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object[]&nbsp;params&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Object[]&nbsp;{&nbsp;blogID,&nbsp;name,&nbsp;password,</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Integer(num)&nbsp;};<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object[]&nbsp;result&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Object[])&nbsp;client.execute(</span><span style="color: #000000">"</span><span style="color: #000000">metaWeblog.getRecentPosts</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;params);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;result.length;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map&nbsp;map&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Map)&nbsp;result[i];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;postUrl&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(String)&nbsp;map.get(</span><span style="color: #000000">"</span><span style="color: #000000">link</span><span style="color: #000000">"</span><span style="color: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;title&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(String)&nbsp;map.get(</span><span style="color: #000000">"</span><span style="color: #000000">title</span><span style="color: #000000">"</span><span style="color: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;postId&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(String)&nbsp;map.get(</span><span style="color: #000000">"</span><span style="color: #000000">postid</span><span style="color: #000000">"</span><span style="color: #000000">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;post的内容</span><span style="color: #008000"><br></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;description&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(String)&nbsp;map.get(</span><span style="color: #000000">"</span><span style="color: #000000">description</span><span style="color: #000000">"</span><span style="color: #000000">);<br>&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;Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">String,&nbsp;String</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;images&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HashMap</span><span style="color: #000000">&lt;</span><span style="color: #000000">String,&nbsp;String</span><span style="color: #000000">&gt;</span><span style="color: #000000">();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;images&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;getImagesURL(description);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;newDes&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;handleImagesURL(description,postId);&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;String&nbsp;descriptioFileName&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;savePostContent(savePath,&nbsp;title,postId,&nbsp;newDes,&nbsp;css);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SimplePost&nbsp;post&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SimplePost(postUrl,&nbsp;title,&nbsp;postId,descriptioFileName);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">从postContent获取图像的地址和名称，以便获取图片并保存</span><span style="color: #008000"><br></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;post.setImages(images);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;posts.add(post);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.debug(</span><span style="color: #000000">"</span><span style="color: #000000">postID:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;postId&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">postTitle&nbsp;:</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;title);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;posts;<br>&nbsp;&nbsp;&nbsp;&nbsp;}</span></div><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%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">String,&nbsp;String</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;getImagesURL(String&nbsp;description)&nbsp;{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000"></span><span style="color: #000000">&nbsp; Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">String,&nbsp;String</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;map&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HashMap</span><span style="color: #000000">&lt;</span><span style="color: #000000">String,&nbsp;String</span><span style="color: #000000">&gt;</span><span style="color: #000000">();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;img&nbsp;的正则表达式<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000"></span><span style="color: #000000">&nbsp; String&nbsp;imgPattern&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&lt;\\s*img\\s+([^&gt;]+)\\s*&gt;</span><span style="color: #000000">"</span><span style="color: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pattern&nbsp;p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Pattern.compile(imgPattern,&nbsp;Pattern.CASE_INSENSITIVE);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Matcher&nbsp;matcher&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;p.matcher(description);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;img&nbsp;src元素的正则表达式</span><span style="color: #008000"><br></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;srcPattern&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">\\s*src\\s*=\\s*\</span><span style="color: #000000">"</span><span style="color: #000000">([</span><span style="color: #000000">^</span><span style="color: #000000">\</span><span style="color: #000000">"</span><span style="color: #000000">]+)\\s*\</span><span style="color: #000000">""</span><span style="color: #000000">;</span><span style="color: #000000"><br></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000"></span><span style="color: #000000">&nbsp; Pattern&nbsp;p2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Pattern.compile(srcPattern,&nbsp;Pattern.CASE_INSENSITIVE);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(matcher.find())&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Matcher&nbsp;matcher2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;p2.matcher(matcher.group());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;一定要find(),这是实际的匹配动作</span><span style="color: #008000"><br></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(matcher2.find())&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;src&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;matcher2.group();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info(src);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;src.lastIndexOf(</span><span style="color: #000000">'</span><span style="color: #000000">/</span><span style="color: #000000">'</span><span style="color: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;src.indexOf(</span><span style="color: #000000">"</span><span style="color: #000000">http</span><span style="color: #000000">"</span><span style="color: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(i1&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">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(src.substring(i2&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;src.length()&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">),&nbsp;src<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.substring(i1,&nbsp;src.length()&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">));<br>&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;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.debug(</span><span style="color: #000000">"</span><span style="color: #000000">图片：</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;map);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;map;<br>&nbsp;&nbsp;&nbsp;&nbsp;}</span></div><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%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008000">/**</span><span style="color: #008000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;替换description的图片链接为本地的相对链接，结构为blogFiles/images/postid/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;description<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;userName<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;postId<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@return</span><span style="color: #008000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br>&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;handleImagesURL(String&nbsp;description,&nbsp;String&nbsp;postId)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;tmp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;description;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;address</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">images/</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;postId&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">/</span><span style="color: #000000">"</span><span style="color: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;imgPattern&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&lt;\\s*img\\s+([^&gt;]+)\\s*&gt;</span><span style="color: #000000">"</span><span style="color: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pattern&nbsp;p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Pattern.compile(imgPattern,&nbsp;Pattern.CASE_INSENSITIVE);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Matcher&nbsp;matcher&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;p.matcher(tmp);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;img&nbsp;src元素的正则表达式</span><span style="color: #008000"><br></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;srcPattern&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">\\s*src\\s*=\\s*\</span><span style="color: #000000">"</span><span style="color: #000000">([</span><span style="color: #000000">^</span><span style="color: #000000">\</span><span style="color: #000000">"</span><span style="color: #000000">]+)\\s*\</span><span style="color: #000000">""</span><span style="color: #000000">;</span><span style="color: #000000"><br></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;String&nbsp;srcPattern&nbsp;=&nbsp;"\\s*src\\s*=\\s*\'([^\']+)\\s*\'";</span><span style="color: #008000"><br></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pattern&nbsp;p2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Pattern.compile(srcPattern,&nbsp;Pattern.CASE_INSENSITIVE);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(matcher.find())&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Matcher&nbsp;matcher2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;p2.matcher(matcher.group());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;一定要find(),这是实际的匹配动作</span><span style="color: #008000"><br></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(matcher2.find())&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;src&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;matcher2.group();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info(src);&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;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l2</span><span style="color: #000000">=</span><span style="color: #000000">src.lastIndexOf(</span><span style="color: #000000">'</span><span style="color: #000000">/</span><span style="color: #000000">'</span><span style="color: #000000">)</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info(src.substring(l2,src.length()</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp</span><span style="color: #000000">=</span><span style="color: #000000">tmp.replace(src,</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;&nbsp;src=\</span><span style="color: #000000">""</span><span style="color: #000000">+address+src.substring(l2,src.length()-1)+</span><span style="color: #000000">"</span><span style="color: #000000">\</span><span style="color: #000000">""</span><span style="color: #000000">);&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;}<br>&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;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;tmp;<br>&nbsp;&nbsp;&nbsp;&nbsp;}</span></div><img src ="http://www.blogjava.net/cherishchen/aggbug/130508.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cherishchen/" target="_blank">凭栏观海</a> 2007-07-16 11:22 <a href="http://www.blogjava.net/cherishchen/archive/2007/07/16/130508.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正则表达式的总结</title><link>http://www.blogjava.net/cherishchen/archive/2007/07/12/129757.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Thu, 12 Jul 2007 01:44:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/07/12/129757.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/129757.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2007/07/12/129757.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/129757.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/129757.html</trackback:ping><description><![CDATA[<h1>一、JDK提供的正则表达式</h1> <p>Java's java.util.regex 包包括：Pattern类、Matcher类、MatchResult接口和PatternSyntaxException异常：</p> <ul> <li>Pattern 对象代表了编译了的正则表达式（A compiled representation of a regular expression.）。  <li>Matcher ，An engine that performs match operations on a <a href="/jdk150/api/java/lang/CharSequence.html"><code></code>character sequence<code></code></a> by interpreting a <a href="/jdk150/api/java/util/regex/Pattern.html"><code>Pattern</code></a>.  <li>MatchResult接口：The result of a match operation.  <li>PatternSyntaxException对象，描述非法的regex patterns，Unchecked exception thrown to indicate a syntax error in a regular-expression pattern.</li></ul> <p>&nbsp;同时还需要了解是CharSequence，JDK 1.4定义的新的接口，它提供了String和StringBuffer这两个类的字符序列的抽象</p> <blockquote><pre>interface CharSequence {<br>  charAt(int i);<br>  length();<br>  subSequence(int start, int end);<br>  toString();<br>}</pre></blockquote>
<p>为了实现这个新的CharSequence接口，String，StringBuffer以及CharBuffer都作了修改，很多的正则表达式的操作都要拿CharSequence作参数。 
<p>&nbsp; 
<h2>Matcher类的几个重要的方法：</h2>
<ul>
<li>boolean matches()：Pattern匹配整个字符串 
<li>boolean lookingAt()：Pattern匹配字符串的开头 
<li>boolean find()：发现CharSequence里的，与pattern相匹配的多个字符序列<br>boolean find(int start)：告诉方法从参数start位置开始查找</li></ul>
<h2>group的概念</h2>
<p>Group是指里用括号括起来的，能被后面的表达式调用的正则表达式。</p>
<p>Group 0 表示整个表达式，group 1表示第一个被括起来的group，以此类推。所以； 
<blockquote><pre>A(B(C))D</pre></blockquote>
<p>里面有三个group：group 0是ABCD， group 1是BC，group 2是C。 
<p>你可以用下述Matcher方法来使用group： 
<ul>
<li>public int groupCount( )返回matcher对象中的group的数目。不包括group0。 
<li>public String group( ) 返回上次匹配操作(比方说find( ))的group 0(整个匹配) 
<li>public String group(int i)返回上次匹配操作的某个group。如果匹配成功，但是没能找到group，则返回null。 
<li>public int start(int group)返回上次匹配所找到的group的开始位置。 
<li>public int end(int group)返回上次匹配所找到的group的结束位置，最后一个字符的下标加一。 
<li>split( ) 是指将以正则表达式为界，将字符串分割成String数组,如果带有limit参数，split( )会限定分割的次数。 
<li>replaceFirst(String replacement)将字符串里，第一个与模式相匹配的子串替换成replacement。 
<li>replaceAll(String replacement)，将输入字符串里所有与模式相匹配的子串全部替换成replacement。 
<li>appendReplacement(StringBuffer sbuf, String replacement)对sbuf进行逐次替换，而不是像replaceFirst( )或replaceAll( )那样，只替换第一个或全部子串。这是个非常重要的方法，因为replacement(replaceFirst( )和replaceAll( )只允许用固定的字符串来充当replacement)。有了这个方法，你就可以编程区分group，从而实现更强大的替换功能。 
<li>调用完appendReplacement( )之后，为了把剩余的字符串拷贝回去，必须调用appendTail(StringBuffer sbuf, String replacement)。 </li></ul>
<p>&nbsp;</p>
<p>使用group可以做到逐步缩小匹配的范围，直至精确匹配的目的。 </p>
<p>start( )和end( )：如果匹配成功，start( )会返回此次匹配的开始位置，end( )会返回此次匹配的结束位置，即最后一个字符的下标加一。如果之前的匹配不成功(或者没匹配)，那么无论是调用start( )还是end( )，都会引发一个IllegalStateException。</p>
<p>&nbsp; 
<h1>二、4大使用方法：</h1>
<h2><strong>查询</strong></h2>
<p>String str="abc efg ABC"; 
<p></p>String regEx="a|f"; //表示a或f 
<p></p>Pattern p=Pattern.compile(regEx); 
<p></p>Matcher m=p.matcher(str); 
<p></p>boolean rs=m.find(); 
<p></p>如果str中有regEx，那么rs为true，否则为flase。如果想在查找时忽略大小写，则可以写成Pattern p=Pattern.compile(regEx,Pattern.CASE_INSENSITIVE); 
<p></p><strong></strong>
<p></p>
<h2><strong>提取</strong></h2><strong></strong>
<p>String regEx=".+\(.+)$"; 
<p></p>String str="c:\dir1\dir2\name.txt"; 
<p></p>Pattern p=Pattern.compile(regEx); 
<p></p>Matcher m=p.matcher(str); 
<p></p>boolean rs=m.find(); 
<p></p>for(int i=1;i&lt;=m.groupCount();i++){ 
<p></p>System.out.println(m.group(i)); 
<p></p>} 
<p></p>以上的执行结果为name.txt，提取的字符串储存在m.group(i)中，其中i最大值为m.groupCount(); 
<p></p>
<h2></h2>
<p><strong></strong>&nbsp;</p>
<h2><strong>分割</strong></h2>
<p><strong></strong>
<p></p>String regEx="::"; 
<p></p>Pattern p=Pattern.compile(regEx); 
<p></p>String[] r=p.split("xd::abc::cde"); 
<p></p>执行后，r就是{"xd","abc","cde"}，其实分割时还有跟简单的方法： 
<p></p>String str="xd::abc::cde"; 
<p></p>String[] r=str.split("::"); 
<p></p>
<p>&nbsp;</p>
<h2><strong><strong>替换或者删除</strong></strong></h2>
<p>String regEx="a+"; //表示一个或多个a 
<p></p>Pattern p=Pattern.compile(regEx); 
<p></p>Matcher m=p.matcher("aaabbced a ccdeaa"); 
<p></p>String s=m.replaceAll("A"); 
<p></p>　　结果为"Abbced A ccdeA" 
<p></p>　　如果写成空串，既可达到删除的功能，比如： 
<p></p>String s=m.replaceAll(""); 
<p></p>　　结果为"bbced ccde" 
<p></p>
<p>&nbsp;</p>
<h1>三、一个实际的例子</h1>
<p>下面的函数是一个实际应用的例子，需求是需要将抓取的网页中的&lt;img src=''http://aa.bb.cc.com/images/**.jpg"&gt; 中的地址，保存到一个地址列表中（以供抓取图片使用），并将绝对地址替换成本地的相对地址，即&lt;img src="images/**.jpg"&gt;。</p>
<p>public static Map&lt;String, String&gt; getImagesURL(String description) { 
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Map&lt;String, String&gt; map = new HashMap&lt;String, String&gt;();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // img 的正则表达式:匹配&lt;img&gt;标签&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String imgPattern = "&lt;\\s*img\\s+([^&gt;]+)\\s*&gt;";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pattern pattern1 = Pattern.compile(imgPattern, Pattern.CASE_INSENSITIVE);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Matcher matcher = pattern1.matcher(description); 
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // img src元素的正则表达式：匹配img标签内的src属性<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String srcPattern = "\\s*src\\s*=\\s*\"([^\"]+)\\s*\"";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pattern pattern2 = Pattern.compile(srcPattern, Pattern.CASE_INSENSITIVE); 
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (matcher.find()) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //group()返回符合表达式的内容<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Matcher matcher2 = pattern2 .matcher(matcher.group());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 一定要find(),这是实际的匹配动作<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (matcher2.find()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String src = matcher2.group();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.info(src);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i2 = src.lastIndexOf('/');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i1 = src.indexOf("http");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (i1 != -1) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.put(src.substring(i2 + 1, src.length() - 1), src<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .substring(i1, src.length() - 1));<br>&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; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.debug("图片：" + map);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return map;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>整体思路是先匹配到img标签，然后匹配src属性，并修改src的属性</p>
<p>"&lt;\\s*img\\s+([^&gt;]+)\\s*&gt;" 的解释：</p>
<p><a href="file://\\s">\\s</a>* :0 或多个空格&nbsp;&nbsp; <a href="file://\\s">\\s</a>+: 至少一个空格</p>
<p>([^&gt;]+)：指的是到&gt;为止的所有的元素，至少一个</p>
<p>&nbsp;</p>
<h1>常用的正则表达式（参考jdk的regex文档）</h1>
<blockquote>
<p><strong>字符集类</strong></p></blockquote>
<p>.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表示任意一个字符 
<p>[abc]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表示字符a，b，c中的任意一个(与a|b|c相同) 
<p>[^abc]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 除a，b，c之外的任意一个字符(否定) 
<p>[a-zA-Z]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从a到z或A到Z当中的任意一个字符(范围) 
<p>[abc[hij]]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a,b,c,h,i,j中的任意一个字符(与a|b|c|h|i|j相同)(并集) 
<p>[a-z&amp;&amp;[hij]]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; h,i,j中的一个(交集) 
<p>\s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 空格字符(空格键, tab, 换行, 换页, 回车) 
<p>\S&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 非空格字符([^\s]) 
<p>\d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个数字，也就是[0-9] 
<p>\D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个非数字的字符，也就是[^0-9] 
<p>\w&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个单词字符(word character)，即[a-zA-Z_0-9] 
<p>\W&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一个非单词的字符，[^\w] 
<blockquote>
<p><strong>字符类：</strong></p></blockquote>
<p>B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字符B 
<p>\xhh&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 16进制值0xhh所表示的字符 
<p>\uhhhh&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 16进制值0xhhhh所表示的Unicode字符 
<p>\t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Tab 
<p>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 换行符 
<p>\r&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 回车符 
<p>\f&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 换页符 
<p>\e&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Escape 
<p><strong>逻辑运算符</strong> 
<p>XY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X 后面跟着 Y 
<p>X|Y&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X或Y 
<p>(X)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一个"要匹配的组(capturing group)". 以后可以用\i来表示第i个被匹配的组。 
<p><strong>边界匹配符</strong> 
<p>^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一行的开始 
<p>$&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一行的结尾 
<p>\b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个单词的边界 
<p>\B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个非单词的边界 
<p>\G&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;前一个匹配的结束 
<p>&nbsp; 
<p><strong>数量表示符</strong></p>
<p>"数量表示符(quantifier)"的作用是定义模式应该匹配多少个字符。 
<ul>
<li>Greedy(贪婪的)： 除非另有表示，否则数量表示符都是greedy的。Greedy的表达式会一直匹配下去，直到匹配不下去为止。<u>(如果你发现表达式匹配的结果与预期的不符)</u>，很有可能是因为，你以为表达式会只匹配前面几个字符，而实际上它是greedy的，因此会一直匹配下去。 
<li>Reluctant(勉强的)： 用问号表示，它会匹配最少的字符。也称为lazy, minimal matching, non-greedy, 或ungreedy。 
<li>Possessive(占有的)： 目前只有Java支持(其它语言都不支持)。它更加先进，所以你可能还不太会用。用正则表达式匹配字符串的时候会产生很多中间状态，<u>(一般的匹配引擎会保存这种中间状态，)</u>这样匹配失败的时候就能原路返回了。占有型的表达式不保存这种中间状态，因此也就不会回头重来了。它能防止正则表达式的失控，同时也能提高运行的效率。 </li></ul>
<p>&nbsp; 
<p><strong>Greedy&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Reluctant&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Possessive&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 匹配 </strong>
<p>&nbsp; 
<p>X?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X??&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X?+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 匹配一个或零个X 
<p>X*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X*?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X*+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 匹配零或多个X 
<p>X+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X+?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X++&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;匹配一个或多个X 
<p>X{n}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X{n}?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X{n}+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 匹配正好n个X 
<p>X{n,}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X{n,}?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;X{n,}+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;匹配至少n个X 
<p>X{n,m}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X{n,m}?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X{n,m}+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 匹配至少n个，至多m个X 
<p>&nbsp; 
<p>&nbsp; 
<h2>参考资料</h2>
<p>要想进一步学习正则表达式，建议看<i>Mastering Regular Expression, 2nd Edition</i>，作者Jeffrey E. F. Friedl (O’Reilly, 2002)。 
<p>"Regular Expressions and the Java Programming Language," Dana Nourie and Mike McCloskey (Sun Microsystems, August 2002) presents a brief overview of java.util.regex, including five illustrative regex-based applications: <br><a href="http://developer.java.sun.com/developer/technicalArticles/releases/1.4regex/">http://developer.java.sun.com/developer/technicalArticles/releases/1.4regex/</a> 
<p><a title="http://www.blogjava.net/beike/archive/2006/04/28/43832.html" href="http://www.blogjava.net/beike/archive/2006/04/28/43832.html">http://www.blogjava.net/beike/archive/2006/04/28/43832.html</a>&nbsp; 
<p><a href="http://wcjok.bokee.com/4293762.html">http://wcjok.bokee.com/4293762.html</a><img src ="http://www.blogjava.net/cherishchen/aggbug/129757.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cherishchen/" target="_blank">凭栏观海</a> 2007-07-12 09:44 <a href="http://www.blogjava.net/cherishchen/archive/2007/07/12/129757.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用HttpClient来模拟浏览器GET POST(收藏)</title><link>http://www.blogjava.net/cherishchen/archive/2007/07/10/129369.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Tue, 10 Jul 2007 08:05:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/07/10/129369.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/129369.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2007/07/10/129369.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/129369.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/129369.html</trackback:ping><description><![CDATA[<h3><strong>用HttpClient来模拟浏览器GET&nbsp;POST</strong></h3> <p><a title="http://www.xd-tech.com.cn/blog/article.asp?id=34" href="http://www.xd-tech.com.cn/blog/article.asp?id=34">http://www.xd-tech.com.cn/blog/article.asp?id=34</a></p> <h4>作者:jaddy0302 日期:2006-12-21</h4> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一般的情况下我们都是使用IE或者Navigator浏览器来访问一个WEB服务器，用来浏览页面查看信息或者提交一些数据等等。所访问的这些页面有的仅仅是一些普通的页面，有的需要用户登录后方可使用，或者需要认证以及是一些通过加密方式传输，例如HTTPS。目前我们使用的浏览器处理这些情况都不会构成问题。不过你可能在某些时候需要通过程序来访问这样的一些页面，比如从别人的网页中“偷”一些数据；利用某些站点提供的页面来完成某种功能，例如说我们想知道某个手机号码的归属地而我们自己又没有这样的数据，因此只好借助其他公司已有的网站来完成这个功能，这个时候我们需要向网页提交手机号码并从返回的页面中解析出我们想要的数据来。如果对方仅仅是一个很简单的页面，那我们的程序会很简单，本文也就没有必要大张旗鼓的在这里浪费口舌。但是考虑到一些服务授权的问题，很多公司提供的页面往往并不是可以通过一个简单的URL就可以访问的，而必须经过注册然后登录后方可使用提供服务的页面，这个时候就涉及到 COOKIE问题的处理。我们知道目前流行的***页技术例如ASP、JSP无不是通过COOKIE来处理会话信息的。为了使我们的程序能使用别人所提供的服务页面，就要求程序首先登录后再访问服务页面，这过程就需要自行处理cookie，想想当你用java.net.HttpURLConnection 来完成这些功能时是多么恐怖的事情啊！况且这仅仅是我们所说的顽固的WEB服务器中的一个很常见的“顽固”！再有如通过HTTP来上传文件呢？不需要头疼，这些问题有了“它”就很容易解决了！  <p>我们不可能列举所有可能的顽固，我们会针对几种最常见的问题进行处理。当然了，正如前面说到的，如果我们自己使用 java.net.HttpURLConnection来搞定这些问题是很恐怖的事情，因此在开始之前我们先要介绍一下一个开放源码的项目，这个项目就是 Apache开源组织中的httpclient，它隶属于Jakarta的commons项目，目前的版本是2.0RC2。commons下本来已经有一个net的子项目，但是又把httpclient单独提出来，可见http服务器的访问绝非易事。 <p>Commons-httpclient项目就是专门设计来简化HTTP客户端与服务器进行各种通讯编程。通过它可以让原来很头疼的事情现在轻松的解决，例如你不再管是HTTP或者HTTPS的通讯方式，告诉它你想使用HTTPS方式，剩下的事情交给 httpclient替你完成。本文会针对我们在编写HTTP客户端程序时经常碰到的几个问题进行分别介绍如何使用httpclient来解决它们，为了让读者更快的熟悉这个项目我们最开始先给出一个简单的例子来读取一个网页的内容，然后循序渐进解决掉前进中的所形侍狻?/font&gt;  <p>1． 读取网页(HTTP/HTTPS)内容 <p>下面是我们给出的一个简单的例子用来访问某个页面 <p>/* <p>&nbsp;* Created on 2003-12-14 by Liudong <p>&nbsp;*/ <p>package http.demo; <p>import java.io.IOException; <p>import org.apache.commons.httpclient.*; <p>import org.apache.commons.httpclient.methods.*; <p>/** <p>&nbsp;* 最简单的HTTP客户端,用来演示通过GET或者POST方式访问某个页面 <p>&nbsp;* @author Liudong <p>&nbsp;*/ <p>public class SimpleClient { <p>&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws IOException <p>&nbsp;&nbsp;&nbsp; { <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpClient client = new HttpClient();&nbsp;&nbsp;&nbsp;  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置代理服务器地址和端口&nbsp;&nbsp;&nbsp;&nbsp;  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //client.getHostConfiguration().setProxy("proxy_host_addr",proxy_port); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //使用GET方法，如果服务器需要通过HTTPS连接，那只需要将下面URL中的http换成https <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpMethod method = new GetMethod("<a href="http://java.sun.com/"><a href="http://java.sun.com">http://java.sun.com</a></a>");  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //使用POST方法 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //HttpMethod method = new PostMethod("<a href="http://java.sun.com/"><a href="http://java.sun.com">http://java.sun.com</a></a>");  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.executeMethod(method); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //打印服务器返回的状态 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(method.getStatusLine()); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //打印返回的信息 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(method.getResponseBodyAsString()); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //释放连接 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; method.releaseConnection(); <p>&nbsp;&nbsp;&nbsp; }<br>} <p>在这个例子中首先创建一个HTTP客户端(HttpClient)的实例，然后选择提交的方法是GET或者 POST，最后在HttpClient实例上执行提交的方法，最后从所选择的提交方法中读取服务器反馈回来的结果。这就是使用HttpClient的基本流程。其实用一行代码也就可以搞定整个请求的过程，非常的简单！ <p>2． 以GET或者POST方式向网页提交参数 <p>其实前面一个最简单的示例中我们已经介绍了如何使用GET或者POST方式来请求一个页面，本小节与之不同的是多了提交时设定页面所需的参数，我们知道如果是GET的请求方式，那么所有参数都直接放到页面的URL后面用问号与页面地址隔开，每个参数用&amp;隔开，例如：<a href="http://java.sun.com/?name=liudong&amp;mobile=123456">http://java.sun.com?name=liudong&amp;mobile=123456</a>，但是当使用POST方法时就会稍微有一点点麻烦。本小节的例子演示向如何查询手机号码所在的城市，代码如下： <p>/* <p>&nbsp;* Created on 2003-12-7 by Liudong <p>&nbsp;*/ <p>package http.demo; <p>import java.io.IOException; <p>import org.apache.commons.httpclient.*; <p>import org.apache.commons.httpclient.methods.*; <p>/** <p>&nbsp;* 提交参数演示 <p>&nbsp;* 该程序连接到一个用于查询手机号码所属地的页面 <p>&nbsp;* 以便查询号码段1330227所在的省份以及城市 <p>&nbsp;* @author Liudong <p>&nbsp;*/ <p>public class SimpleHttpClient { <p>&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws IOException <p>&nbsp;&nbsp;&nbsp; { <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpClient client = new HttpClient(); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.getHostConfiguration().setHost("<a href="http://www.imobile.com.cn/">www.imobile.com.cn</a>", 80, "http"); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpMethod method = getPostMethod();//使用POST方式提交数据 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.executeMethod(method); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //打印服务器返回的状态 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(method.getStatusLine()); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //打印结果页面 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String response =&nbsp; new String(method.getResponseBodyAsString().getBytes("8859_1")); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //打印返回的信息 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(response); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; method.releaseConnection(); <p>&nbsp;&nbsp;&nbsp; } <p>&nbsp;&nbsp;&nbsp; /** <p>&nbsp;&nbsp;&nbsp;&nbsp; * 使用GET方式提交数据 <p>&nbsp;&nbsp;&nbsp;&nbsp; * @return <p>&nbsp;&nbsp;&nbsp;&nbsp; */ <p>&nbsp;&nbsp;&nbsp; private static HttpMethod getGetMethod(){ <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new GetMethod("/simcard.php?simcard=1330227"); <p>&nbsp;&nbsp;&nbsp; } <p>&nbsp;&nbsp;&nbsp; /** <p>&nbsp;&nbsp;&nbsp;&nbsp; * 使用POST方式提交数据 <p>&nbsp;&nbsp;&nbsp;&nbsp; * @return <p>&nbsp;&nbsp;&nbsp;&nbsp; */ <p>&nbsp;&nbsp;&nbsp; private static HttpMethod getPostMethod(){ <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PostMethod post = new PostMethod("/simcard.php"); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NameValuePair simcard = new NameValuePair("simcard","1330227"); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; post.setRequestBody(new NameValuePair[] { simcard}); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return post; <p>&nbsp;&nbsp;&nbsp; } <p>} <p>在上面的例子中页面<a href="http://www.imobile.com.cn/simcard.php">http://www.imobile.com.cn/simcard.php</a>需要一个参数是simcard，这个参数值为手机号码段，即手机号码的前七位，服务器会返回提交的手机号码对应的省份、城市以及其他详细信息。GET的提交方法只需要在URL后加入参数信息，而POST则需要通过NameValuePair类来设置参数名称和它所对应的值 <p>3． 处理页面重定向 <p>在JSP/Servlet编程中response.sendRedirect方法就是使用HTTP协议中的重定向机制。它与JSP中的&lt;jsp:forward …&gt;的区别在于后者是在服务器中实现页面的跳转，也就是说应用容器加载了所要跳转的页面的内容并返回给客户端；而前者是返回一个状态码，这些状态码的可能值见下表，然后客户端读取需要跳转到的页面的URL并重新加载新的页面。就是这样一个过程，所以我们编程的时候就要通过 HttpMethod.getStatusCode()方法判断返回值是否为下表中的某个值来判断是否需要跳转。如果已经确认需要进行页面跳转了，那么可以通过读取HTTP头中的location属性来获取新的地址。 <p>状态码<br>&nbsp;对应HttpServletResponse的常量<br>&nbsp;详细描述<br>301　&nbsp;SC_MOVED_PERMANENTLY<br>&nbsp;页面已经永久移到另外一个新地址<br>302　&nbsp;SC_MOVED_TEMPORARILY<br>&nbsp;页面暂时移动到另外一个新的地址<br>303　&nbsp;SC_SEE_OTHER<br>&nbsp;客户端请求的地址必须通过另外的URL来访问<br>307　&nbsp;SC_TEMPORARY_REDIRECT　&nbsp;同SC_MOVED_TEMPORARILY <p>下面的代码片段演示如何处理页面的重定向 <p>client.executeMethod(post); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(post.getStatusLine().toString());  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; post.releaseConnection(); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //检查是否重定向 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int statuscode = post.getStatusCode(); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((statuscode == HttpStatus.SC_MOVED_TEMPORARILY) || <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (statuscode == HttpStatus.SC_MOVED_PERMANENTLY) || <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (statuscode == HttpStatus.SC_SEE_OTHER) || <p>(statuscode == HttpStatus.SC_TEMPORARY_REDIRECT)) { <p>//读取新的URL地址 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Header header = post.getResponseHeader("location"); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (header != null) { <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String newuri = header.getValue(); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((newuri == null) || (newuri.equals(""))) <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newuri = "/";  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetMethod redirect = new GetMethod(newuri); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.executeMethod(redirect); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Redirect:"+ redirect.getStatusLine().toString());  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; redirect.releaseConnection(); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Invalid redirect"); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <p>我们可以自行编写两个JSP页面，其中一个页面用response.sendRedirect方法重定向到另外一个页面用来测试上面的例子。 <p>4． 模拟输入用户名和口令进行登录 <p>本小节应该说是HTTP客户端编程中最常碰见的问题，很多网站的内容都只是对注册用户可见的，这种情况下就必须要求使用正确的用户名和口令登录成功后，方可浏览到想要的页面。因为HTTP协议是无状态的，也就是连接的有效期只限于当前请求，请求内容结束后连接就关闭了。在这种情况下为了保存用户的登录信息必须使用到Cookie机制。以JSP/Servlet为例，当浏览器请求一个JSP或者是Servlet的页面时，应用服务器会返回一个参数，名为jsessionid（因不同应用服务器而异），值是一个较长的唯一字符串的Cookie，这个字符串值也就是当前访问该站点的会话标识。浏览器在每访问该站点的其他页面时候都要带上jsessionid这样的Cookie信息，应用服务器根据读取这个会话标识来获取对应的会话信息。 <p>对于需要用户登录的网站，一般在用户登录成功后会将用户资料保存在服务器的会话中，这样当访问到其他的页面时候，应用服务器根据浏览器送上的Cookie中读取当前请求对应的会话标识以获得对应的会话信息，然后就可以判断用户资料是否存在于会话信息中，如果存在则允许访问页面，否则跳转到登录页面中要求用户输入帐号和口令进行登录。这就是一般使用JSP开发网站在处理用户登录的比较通用的方法。 <p>这样一来，对于HTTP的客户端来讲，如果要访问一个受保护的页面时就必须模拟浏览器所做的工作，首先就是请求登录页面，然后读取Cookie值；再次请求登录页面并加入登录页所需的每个参数；最后就是请求最终所需的页面。当然在除第一次请求外其他的请求都需要附带上 Cookie信息以便服务器能判断当前请求是否已经通过验证。说了这么多，可是如果你使用httpclient的话，你甚至连一行代码都无需增加，你只需要先传递登录信息执行登录过程，然后直接访问想要的页面，跟访问一个普通的页面没有任何区别，因为类HttpClient已经帮你做了所有该做的事情了，太棒了！下面的例子实现了这样一个访问的过程。 <p>/* <p>&nbsp;* Created on 2003-12-7 by Liudong <p>&nbsp;*/ <p>package http.demo; <p>import org.apache.commons.httpclient.*; <p>import org.apache.commons.httpclient.cookie.*; <p>import org.apache.commons.httpclient.methods.*; <p>/** <p>&nbsp;* 用来演示登录表单的示例 <p>&nbsp;* @author Liudong <p>&nbsp;*/ <p>public class FormLoginDemo { <p>&nbsp;&nbsp;&nbsp; static final String LOGON_SITE = "localhost"; <p>&nbsp;&nbsp;&nbsp; static final int&nbsp;&nbsp;&nbsp; LOGON_PORT = 8080; <p>&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws Exception{ <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpClient client = new HttpClient(); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.getHostConfiguration().setHost(LOGON_SITE, LOGON_PORT); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //模拟登录页面login.jsp-&gt;main.jsp <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PostMethod post = new PostMethod("/main.jsp"); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NameValuePair name = new NameValuePair("name", "ld");&nbsp;&nbsp;&nbsp;&nbsp;  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NameValuePair pass = new NameValuePair("password", "ld");&nbsp;&nbsp;&nbsp;&nbsp;  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; post.setRequestBody(new NameValuePair[]{name,pass}); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int status = client.executeMethod(post); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(post.getResponseBodyAsString()); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; post.releaseConnection();&nbsp;  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //查看cookie信息 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CookieSpec cookiespec = CookiePolicy.getDefaultSpec(); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cookie[] cookies = cookiespec.match(LOGON_SITE, LOGON_PORT, "/", false, client.getState().getCookies()); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (cookies.length == 0) { <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("None");&nbsp;&nbsp;&nbsp;  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else { <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; cookies.length; i++) { <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(cookies[i].toString());&nbsp;&nbsp;&nbsp;  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //访问所需的页面main2.jsp <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetMethod get = new GetMethod("/main2.jsp"); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.executeMethod(get); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(get.getResponseBodyAsString()); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get.releaseConnection(); <p>&nbsp;&nbsp;&nbsp; } <p>} <p>5． 提交XML格式参数 <p>提交XML格式的参数很简单，仅仅是一个提交时候的ContentType问题，下面的例子演示从文件文件中读取XML信息并提交给服务器的过程，该过程可以用来测试Web服务。 <p>import java.io.File; <p>import java.io.FileInputStream; <p>import org.apache.commons.httpclient.HttpClient; <p>import org.apache.commons.httpclient.methods.EntityEnclosingMethod; <p>import org.apache.commons.httpclient.methods.PostMethod; <p>/** <p>&nbsp;* 用来演示提交XML格式数据的例子 <p>&nbsp;*/ <p>public class PostXMLClient { <p>&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws Exception { <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File input = new File(“test.xml”); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PostMethod post = new PostMethod(“http://localhost:8080/httpclient/xml.jsp”); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 设置请求的内容直接从文件中读取 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; post.setRequestBody(new FileInputStream(input)); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (input.length() &lt; Integer.MAX_VALUE)  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; post.setRequestContentLength(input.length()); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <blockquote> <p>post.setRequestContentLength(EntityEnclosingMethod.CONTENT_LENGTH_CHUNKED);</p></blockquote> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 指定请求内容的类型 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; post.setRequestHeader("Content-type", "text/xml; charset=GBK"); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpClient httpclient = new HttpClient();  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int result = httpclient.executeMethod(post);  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Response status code: " + result); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Response body: "); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(post.getResponseBodyAsString()); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; post.releaseConnection(); <p>&nbsp;&nbsp;&nbsp; } <p>} <p>6． 通过HTTP上传文件 <p>httpclient使用了单独的一个HttpMethod子类来处理文件的上传，这个类就是MultipartPostMethod，该类已经封装了文件上传的细节，我们要做的仅仅是告诉它我们要上传文件的全路径即可，下面的代码片段演示如何使用这个类。 <p>MultipartPostMethod filePost = new MultipartPostMethod(targetURL); <p>filePost.addParameter("fileName", targetFilePath); <p>HttpClient client = new HttpClient(); <p>//由于要上传的文件可能比较大,因此在此设置最大的连接超时时间 <p>client.getHttpConnectionManager().getParams().setConnectionTimeout(5000); <p>int status = client.executeMethod(filePost); <p>上面代码中，targetFilePath即为要上传的文件所在的路径。 <p>7． 访问启用认证的页面 <p>我们经常会碰到这样的页面，当访问它的时候会弹出一个浏览器的对话框要求输入用户名和密码后方可，这种用户认证的方式不同于我们在前面介绍的基于表单的用户身份验证。这是HTTP的认证策略，httpclient支持三种认证方式包括：基本、摘要以及NTLM认证。其中基本认证最简单、通用但也最不安全；摘要认证是在HTTP 1.1中加入的认证方式，而NTLM则是微软公司定义的而不是通用的规范，最新版本的NTLM是比摘要认证还要安全的一种方式。 <p>下面例子是从httpclient的CVS服务器中下载的，它简单演示如何访问一个认证保护的页面： <p>import org.apache.commons.httpclient.HttpClient; <p>import org.apache.commons.httpclient.UsernamePasswordCredentials; <p>import org.apache.commons.httpclient.methods.GetMethod; <p>public class BasicAuthenticationExample { <p>&nbsp;&nbsp;&nbsp; public BasicAuthenticationExample() { <p>&nbsp;&nbsp;&nbsp; } <p>&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws Exception { <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpClient client = new HttpClient(); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.getState().setCredentials( <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "<a href="http://www.verisign.com/"><a href="http://www.verisign.com">www.verisign.com</a></a>", <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "realm", <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new UsernamePasswordCredentials("username", "password") <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetMethod get = new GetMethod("<a href="https://www.verisign.com/products/index.html">https://www.verisign.com/products/index.html</a>"); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get.setDoAuthentication( true ); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int status = client.executeMethod( get ); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(status+""+ get.getResponseBodyAsString()); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get.releaseConnection(); <p>&nbsp;&nbsp;&nbsp; } <p>} <p>8． 多线程模式下使用httpclient <p>多线程同时访问httpclient，例如同时从一个站点上下载多个文件。对于同一个HttpConnection 同一个时间只能有一个线程访问，为了保证多线程工作环境下不产生冲突，httpclient使用了一个多线程连接管理器的类： MultiThreadedHttpConnectionManager，要使用这个类很简单，只需要在构造HttpClient实例的时候传入即可，代码如下：<pre>MultiThreadedHttpConnectionManager connectionManager = <span style="color: #0000ff">new</span> MultiThreadedHttpConnectionManager();
HttpClient client = <span style="color: #0000ff">new</span> HttpClient(connectionManager);
</pre>
<p>&nbsp;
<p>&nbsp;
<p>以后尽管访问client实例即可。
<p>参考资料：
<p>httpclient首页：&nbsp;&nbsp;&nbsp; <a href="http://jakarta.apache.org/commons/httpclient/"><a href="http://jakarta.apache.org/commons/httpclient/">http://jakarta.apache.org/commons/httpclient/</a></a><br>关于NTLM是如何工作：&nbsp; <a href="http://davenport.sourceforge.net/ntlm.html"><a href="http://davenport.sourceforge.net/ntlm.html">http://davenport.sourceforge.net/ntlm.html</a></a></p><img src ="http://www.blogjava.net/cherishchen/aggbug/129369.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cherishchen/" target="_blank">凭栏观海</a> 2007-07-10 16:05 <a href="http://www.blogjava.net/cherishchen/archive/2007/07/10/129369.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java IO库 学习记录</title><link>http://www.blogjava.net/cherishchen/archive/2007/07/10/129313.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Tue, 10 Jul 2007 04:30:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/07/10/129313.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/129313.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2007/07/10/129313.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/129313.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/129313.html</trackback:ping><description><![CDATA[<p>所有类的根接口：InputStream/OutputStream  <h1><b>一、底层的还是装饰的</b></h1> <p>1、底层的直接与文件系统或者硬件打交道的类(充当数据源的类)：  <p>包括InputStream和OutPutStream两大类，分别用于输入和输出，数据源可以是bytes array，String对象，file文件，stream序列等：  <ul> <li>FileInputStream/FileOutputStream  <li>ByteArrayInputStream/ByteArrayOutputStream  <li>StringBufferInputStream/StringBufferOutputStream</li></ul> <p>等，具体参看下面的java io类图  <p>2、充当装饰功能的io类,通过装饰底层的类来实现更高级的功能，继承自FilterOutputStream/FilterOutputStream，包括：  <ul> <li>BufferedOutputStream/BufferedInputStream  <li>Datainputstream/Dataoutputstream</li></ul> <p>等，具体参看下面的java io类图  <p>使用FilterOutputStream/FilterOutputStream时，首先创建一个数据源IO，然后根据需要的功能创建装饰类io，其构造函数的参数为已创建的数据源io。  <p><a href="http://www.blogjava.net/images/blogjava_net/cherishchen/WindowsLiveWriter/javaIO_997B/clip_image002_2.jpg" atomicselection="true"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="175" alt="clip_image002" src="http://www.blogjava.net/images/blogjava_net/cherishchen/WindowsLiveWriter/javaIO_997B/clip_image002_thumb.jpg" width="240" border="0"></a>  <h1><b>二、面向字符还是面向字节</b></h1> <p>同时，java的IO体系又可以分成：inputStream/outputStream和reader/writer两类：  <p>（1） Reader/Writer是面向Unicode字符的（Characters）  <p>（2） InputStream/OutputStream是直接面向字节的（bytes）。  <p>Reader/Writer继承体系之所以存在，最重要的原因是为了国际化，旧式I/O stream 的继承体系仅仅支持8-bit byte stream，而且无法处理16-bit unicode 字符。由于unicode被用于字符国际化，所以加入Reader/Writer以便在所有的io动作上提供对unicode的支持。  <p>几乎所有的java io stream classes都有相应的Reader和Writer来提供对unicode的支持，但是在某些场合，使用byte-oriented InputStream和OutPutStream才是正取的方法，最合理的方式是尽可能先尝试使用Read和Writer，其次才使用byte-oriented库。  <h1><b>三、从InputStream/OutPutStream到Reader/Writer的转换</b></h1> <p>InputStreamReader和OutputStreamWriter，可以把一个以字节为导向的stream转换成一个以字符为导向的stream。  <p><font size="4"><b>Java 1.0 class（byte oriented）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </b><b>Java 1.1 class(unicode character oriented)</b></font>  <p><strong><font size="4">装饰前的行为</font></strong>  <p><b>InputStream&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </b><b>Reader&nbsp; </b>转换器：InputStreamReader  <p>OutputStreamReader&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <b>Writer&nbsp; </b><b>转换器：</b>OutputStreamWriter<b></b>  <p><b>FileInputSream&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </b><b>FileOutputStream</b>  <p><b>FileReader&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </b><b>FileWriter</b>  <p><b>StringBufferInputStream&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </b><b>StringReader/</b><b>StringWriter&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b>  <p><b>ByteArrayInputStream&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b><b>ByteArrayOutputStream&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b>  <p><b>CharArrayReader&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </b><b>CharArrayWriter</b>  <p><b>装饰后的行为</b>  <p><b>BufferedInputStream&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </b><b>BufferedOutputStream</b>  <p><b>BufferedReader&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b><b>BufferedWriter</b>  <p><b>PrintStream&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b><b>PrintWriter</b>  <p><b></b> <p><b></b> <p><b></b> <p><b></b> <h1><b>四、示例</b></h1> <p><b>DataInputStream</b><b>和DataOutputStream</b>  <p><b>Java</b><b>中除了二进制文件和使用文本文件外还有基于Data的数据操作，这里的Data指的是Java的基本数据类型和String。基本数据类型包括byte、int、char、long、float、double、boolean和short。</b>  <p><b></b> <p><b></b> <p><b>例子：</b>  <p>protected void connect (Socket socket)  <p>throws IOException, SocketException  <p>{  <p>this.socket = socket;  <p>applyTimeout();  <p>serverIn = new DataInputStream (  <p>new BufferedInputStream (socket.getInputStream ())  <p>);  <p>serverOut = new DataOutputStream(  <p>new BufferedOutputStream(socket.getOutputStream(), 2048)  <p>);  <p>usable = true;  <p>cnt[CONNECT]++;  <p>setChanged();  <p>notifyObservers();  <p>}  <p>在DataInputStream和DataOutputStream两个类中的方法都很简单，基本结构为readXXXX()和writeXXXX()其中XXXX代表基本数据类型或者String。</p><img src ="http://www.blogjava.net/cherishchen/aggbug/129313.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cherishchen/" target="_blank">凭栏观海</a> 2007-07-10 12:30 <a href="http://www.blogjava.net/cherishchen/archive/2007/07/10/129313.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>牛刀小试-用jdom来解析ant的build文件</title><link>http://www.blogjava.net/cherishchen/archive/2007/07/05/128235.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Thu, 05 Jul 2007 01:11:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/07/05/128235.html</guid><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">/**<br>* 学习jdom操作xml的习作：解析ant的build文件，目的是得到target的执行顺序<br>*<br>*/<br>import</span><span style="color: #000000;">&nbsp;java.io.File;<br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.IOException;<br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.ArrayList;<br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.HashMap;<br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.List;<br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.Map;<br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.Stack;<br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.jdom.Document;<br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.jdom.Element;<br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.jdom.JDOMException;<br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.jdom.input.SAXBuilder;<br><br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;AntFileParser&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;Map</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">String,&nbsp;Element</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;targetMap;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;args<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&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;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;xmlfile&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">xmlfile/aaa.xml</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;doc;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;finalTarget&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">run</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;build(xmlfile);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(JDOMException&nbsp;e)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;RuntimeException(</span><span style="color: #000000;">"</span><span style="color: #000000;">parse&nbsp;error</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;e,&nbsp;e);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(IOException&nbsp;e)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;RuntimeException(</span><span style="color: #000000;">"</span><span style="color: #000000;">parse&nbsp;error</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;e,&nbsp;e);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;generateTargetNameMap(doc);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;首先将最终任务入栈</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stack</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">String</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;stack&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Stack</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">String</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stack.push(finalTarget);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;计算其他任务的执行顺序</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getExecuteOrder(findElementByAttributeName(finalTarget),&nbsp;stack);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(</span><span style="color: #000000;">"</span><span style="color: #000000;">执行顺序：&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #000000;">stack.isEmpty())&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(stack.pop()&nbsp;</span><span style="color: #000000;">+</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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&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;Document&nbsp;build(String&nbsp;file)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;JDOMException,&nbsp;IOException&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SAXBuilder&nbsp;b&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;SAXBuilder();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;doc&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;b.build(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;File(file));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;doc;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;获取所有target元素<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;doc<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@return</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&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;List&nbsp;getTarget(Document&nbsp;doc)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;doc.getRootElement().getChildren(</span><span style="color: #000000;">"</span><span style="color: #000000;">target</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;获取指定元素的所有依赖<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;element<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@return</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&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;getDepents(Element&nbsp;element)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;depends&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;element.getAttribute(</span><span style="color: #000000;">"</span><span style="color: #000000;">depends</span><span style="color: #000000;">"</span><span style="color: #000000;">).getValue();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;depends.split(</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;使用递归的方法查找执行顺序<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;element<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;stack<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&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;getExecuteOrder(Element&nbsp;element,&nbsp;Stack</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">String</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;stack)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;cur;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(element.getAttribute(</span><span style="color: #000000;">"</span><span style="color: #000000;">depends</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;已经找到了第一个任务，退出</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;depends&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getDepents(element);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cur&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;depends[</span><span style="color: #000000;">0</span><span style="color: #000000;">];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(depends.length&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;存在多个依赖任务，可能有两种情况：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;（1）多个任务之间有依赖关系，则返回依赖最大的任务；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;（2）多个任务之间没有依赖关系，则返回全部依赖，用逗号分隔</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cur&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getmaxDependence(depends);<br>&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;String[]&nbsp;curs&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;cur.split(</span><span style="colo