﻿<?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/sy1214520/category/32329.html</link><description>痛并快乐着</description><language>zh-cn</language><lastBuildDate>Thu, 15 Apr 2010 15:53:26 GMT</lastBuildDate><pubDate>Thu, 15 Apr 2010 15:53:26 GMT</pubDate><ttl>60</ttl><item><title>使用 XStream 把 Java 对象序列化为 XML</title><link>http://www.blogjava.net/sy1214520/archive/2010/04/14/318294.html</link><dc:creator>小虫旺福</dc:creator><author>小虫旺福</author><pubDate>Wed, 14 Apr 2010 09:58:00 GMT</pubDate><guid>http://www.blogjava.net/sy1214520/archive/2010/04/14/318294.html</guid><wfw:comment>http://www.blogjava.net/sy1214520/comments/318294.html</wfw:comment><comments>http://www.blogjava.net/sy1214520/archive/2010/04/14/318294.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sy1214520/comments/commentRss/318294.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sy1214520/services/trackbacks/318294.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/sy1214520/archive/2010/04/14/318294.html'>阅读全文</a><img src ="http://www.blogjava.net/sy1214520/aggbug/318294.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sy1214520/" target="_blank">小虫旺福</a> 2010-04-14 17:58 <a href="http://www.blogjava.net/sy1214520/archive/2010/04/14/318294.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Appfuse的在线API</title><link>http://www.blogjava.net/sy1214520/archive/2010/02/01/311455.html</link><dc:creator>小虫旺福</dc:creator><author>小虫旺福</author><pubDate>Mon, 01 Feb 2010 01:33:00 GMT</pubDate><guid>http://www.blogjava.net/sy1214520/archive/2010/02/01/311455.html</guid><wfw:comment>http://www.blogjava.net/sy1214520/comments/311455.html</wfw:comment><comments>http://www.blogjava.net/sy1214520/archive/2010/02/01/311455.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sy1214520/comments/commentRss/311455.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sy1214520/services/trackbacks/311455.html</trackback:ping><description><![CDATA[<font style="background-color: #cce8cf">http://static.raibledesigns.com/downloads/struts-resume/api/</font>
<img src ="http://www.blogjava.net/sy1214520/aggbug/311455.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sy1214520/" target="_blank">小虫旺福</a> 2010-02-01 09:33 <a href="http://www.blogjava.net/sy1214520/archive/2010/02/01/311455.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 多线程与并发编程总结（复习一下）</title><link>http://www.blogjava.net/sy1214520/archive/2009/07/15/286869.html</link><dc:creator>小虫旺福</dc:creator><author>小虫旺福</author><pubDate>Wed, 15 Jul 2009 06:24:00 GMT</pubDate><guid>http://www.blogjava.net/sy1214520/archive/2009/07/15/286869.html</guid><wfw:comment>http://www.blogjava.net/sy1214520/comments/286869.html</wfw:comment><comments>http://www.blogjava.net/sy1214520/archive/2009/07/15/286869.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sy1214520/comments/commentRss/286869.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sy1214520/services/trackbacks/286869.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/sy1214520/archive/2009/07/15/286869.html'>阅读全文</a><img src ="http://www.blogjava.net/sy1214520/aggbug/286869.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sy1214520/" target="_blank">小虫旺福</a> 2009-07-15 14:24 <a href="http://www.blogjava.net/sy1214520/archive/2009/07/15/286869.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java性能优化，平时应该注意的事情。不一定全对。</title><link>http://www.blogjava.net/sy1214520/archive/2008/12/22/247733.html</link><dc:creator>小虫旺福</dc:creator><author>小虫旺福</author><pubDate>Mon, 22 Dec 2008 04:05:00 GMT</pubDate><guid>http://www.blogjava.net/sy1214520/archive/2008/12/22/247733.html</guid><wfw:comment>http://www.blogjava.net/sy1214520/comments/247733.html</wfw:comment><comments>http://www.blogjava.net/sy1214520/archive/2008/12/22/247733.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sy1214520/comments/commentRss/247733.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sy1214520/services/trackbacks/247733.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/sy1214520/archive/2008/12/22/247733.html'>阅读全文</a><img src ="http://www.blogjava.net/sy1214520/aggbug/247733.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sy1214520/" target="_blank">小虫旺福</a> 2008-12-22 12:05 <a href="http://www.blogjava.net/sy1214520/archive/2008/12/22/247733.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>log4j配置</title><link>http://www.blogjava.net/sy1214520/archive/2008/11/10/239755.html</link><dc:creator>小虫旺福</dc:creator><author>小虫旺福</author><pubDate>Mon, 10 Nov 2008 15:24:00 GMT</pubDate><guid>http://www.blogjava.net/sy1214520/archive/2008/11/10/239755.html</guid><wfw:comment>http://www.blogjava.net/sy1214520/comments/239755.html</wfw:comment><comments>http://www.blogjava.net/sy1214520/archive/2008/11/10/239755.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sy1214520/comments/commentRss/239755.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sy1214520/services/trackbacks/239755.html</trackback:ping><description><![CDATA[<span style="color: #003366; font-family: 宋体"><span style="font-family: 宋体">在维护系统时，难免会时不时地跟代码再次打些交道。今天想再操刀做个小工具时，居然不太记得了log4j的配置，不得不从apache再重新down了相关的jar与DOC，匆匆看看了一下，快</span>点写下来，日后肯定还用得着，同时也希望对网友们有用。</span><span style="color: #003366; font-family: 宋体"><span style="font-family: 宋体">&nbsp;</span></span>
<p><span style="color: #003366; font-family: 宋体"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; Log4j</span></span></span><span style="color: #003366; font-family: 宋体"><span style="font-family: 宋体"><span style="font-size: 10pt">基本上已经是java里的首选日志工具了，它主要由三部分组成：Loggers, Appenders和Layouts (注意后面都加了s啦，顾名思义一个配置中可以分别允许有多个此类对象存在，后面将详细介绍)。<br />
</span></span></span></p>
<p><span style="color: #003366; font-family: 宋体"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; Loggers</span></span></span><span style="color: #003366; font-family: 宋体"><span style="font-family: 宋体"><span style="font-size: 10pt">－用来定义日志消息的类型及级别；<br />
</span></span></span></p>
<p><span style="color: #003366; font-family: 宋体"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; Appenders</span></span></span><span style="color: #003366; font-family: 宋体"><span style="font-family: 宋体"><span style="font-size: 10pt">－用来定义日志消息的输出终端；<br />
</span></span></span></p>
<p><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366; font-family: 宋体">&nbsp;&nbsp;&nbsp; Layouts</span><span style="color: #003366; font-family: 宋体">－用来定义日志消息的输出格式。</span></span></span></p>
<p><span style="color: #003366; font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;</span></span><span style="color: #003366; font-family: 宋体"><br />
&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 15pt; color: #003366; font-family: 宋体">Logger</span></strong></p>
<p><span style="color: #003366; font-family: 宋体">&nbsp;&nbsp;&nbsp; <strong>Loggers</strong></span><strong><span style="color: #003366; font-family: 宋体">层次：<br />
</span></strong></p>
<p><span style="color: #003366; font-family: 宋体">&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体"><span style="color: #003366; font-family: "><span style="font-size: 10pt; font-family: ">对<span style="font-family: ">logger的名字是大小写敏感。</span></span></span></span></span></p>
<p>
<table style="border-right: medium none; border-top: medium none; background: #b3b3b3; border-left: medium none; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 426.1pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="568">
            <p><span style="color: #003366; font-family: 宋体"><span style="font-family: 宋体"><span style="font-size: 10pt">规则－如果类P的名字是另一个类C的名字的前缀，且P与C之间以&#8220;.&#8221;号连接起来，那么称P为祖先层次；如果层次A与其子层次之间没有任何父层次，则认为层次A为父层次。</span></span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="color: #003366; font-family: 宋体">例如，org.apache.log4j是org.apache.log4j.Logger的父层次；而org.apache是org.apache.log4j与org.apache.log4j.Logger的祖先层次。</span></span></span></p>
<p><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="color: #003366; font-family: 宋体">另外，注意log4j中有个默认的root级别的logger，在所有logger中，它是最高级别，其它所有logger均继承于root，root有以下二个特性：</span></span></span></p>
<p><span style="color: #003366; font-family: 宋体"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; 1. </span></span></span><span style="color: #003366; font-family: 宋体"><span style="font-family: 宋体"><span style="font-size: 10pt">它总是存在的。<br />
</span></span></span></p>
<p><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366; font-family: 宋体">&nbsp;&nbsp;&nbsp; 2. </span><span style="color: #003366; font-family: 宋体">它不能通过名字直接获取其实例(root实例可以通过类Logger的静态方法Logger.getRootLogger获得，而其它logger则可以直接通过名字来获取Logger.getLogger)。</span></span></span></p>
<p><span style="color: #003366; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><strong><span style="color: #003366; font-family: 宋体">关于Loggers中的级别：</span></strong></p>
<p><span style="color: #003366; font-family: 宋体">&nbsp;&nbsp;&nbsp;</span><span style="color: #003366; font-family: 宋体"><span style="font-family: 宋体"><span style="font-size: 10pt">对每个logger，可以指定其级别，在系统org.apache.log4j.Level中，已经定义了五个级别，分别为debug, info, warn, error, fatal。</span></span></span></p>
<p>
<table style="border-right: medium none; border-top: medium none; background: #b3b3b3; border-left: medium none; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 426.1pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="568">
            <p style="margin-left: 5.25pt; text-indent: -5.25pt"><span style="color: #003366; font-family: 宋体"><span style="font-family: 宋体"><span style="font-size: 10pt">规则－设当前logger为X，从X开始往X的父类方向开始算(包括X本身)，直到名为root的logger，第一个不为null的级别值就是X的级别值。</span></span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><span style="color: #003366; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><strong><span style="color: #003366; font-family: 宋体">日志显示：</span></strong><span style="color: #003366; font-family: 宋体">&nbsp;<span style="font-family: 宋体">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="color: #003366; font-family: 宋体"><span style="font-family: 宋体"><span style="font-size: 10pt">级别的定义是为了过滤性地选择日志。</span></span></span></p>
<p>
<table style="border-right: medium none; border-top: medium none; background: #b3b3b3; border-left: medium none; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 426.1pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="568">
            <p><span style="color: #003366; font-family: 宋体"><span style="font-family: 宋体"><span style="font-size: 10pt">规则－若当前请方式级别为P，而当前的logger的级别为Q，当且仅当在P&gt;=Q的情况下，日志信息才能显示。</span></span></span></p>
            </td>
        </tr>
    </tbody>
</table>
<span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366; font-family: 宋体"><br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #003366; font-family: 宋体">关于日志中级别的关系为：</span><code><span style="color: #003366">DEBUG &lt; INFO &lt; WARN &lt; ERROR &lt; FATAL</span></code><code><span style="color: #003366">。<br />
</span></code></span></span><span style="font-family: 宋体"><code><span style="color: #003366">&nbsp;&nbsp;&nbsp; </span></code><code><span style="color: #003366">关于此规则的说明，有以下代码为实例：</span></code></span><code><span style="color: #003366">&nbsp;&nbsp;&nbsp; </span></code></p>
<p>
<table style="border-right: medium none; border-top: medium none; background: #b3b3b3; border-left: medium none; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; font-size: 10pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 426.1pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; font-family: Verdana" valign="top" width="568">
            <p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="color: #003366; font-family: 宋体">// get a logger instance named "com.foo"</span></p>
            <p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="color: #003366; font-family: 宋体">&nbsp;&nbsp; Logger&nbsp;logger = Logger.getLogger(<strong>"com.foo"</strong>);</span></p>
            <p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="color: #003366; font-family: 宋体">&nbsp;&nbsp; // Now set its level. Normally you do not need to set the</span></p>
            <p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="color: #003366; font-family: 宋体">&nbsp;&nbsp; // level of a logger programmatically. This is usually done</span></p>
            <p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="color: #003366; font-family: 宋体">&nbsp;&nbsp; // in configuration files.</span></p>
            <p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="color: #003366; font-family: 宋体">&nbsp;&nbsp; <strong>logger</strong>.setLevel(<strong>Level.INFO</strong>);</span></p>
            <p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="color: #003366; font-family: 宋体">&nbsp;&nbsp; Logger barlogger = Logger.getLogger(<strong>"com.foo.Bar"</strong>);</span></p>
            <p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="color: #003366; font-family: 宋体">&nbsp;&nbsp; // This request is enabled, because <strong>WARN</strong> &gt;= <strong>INFO</strong>.</span></p>
            <p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="color: #003366; font-family: 宋体">&nbsp;&nbsp;logger.<strong>warn</strong>("Low fuel level.");</span></p>
            <p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="color: #003366; font-family: 宋体">&nbsp;&nbsp; // This request is disabled, because <strong>DEBUG</strong> &lt; <strong>INFO</strong>.</span></p>
            <p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="color: #003366; font-family: 宋体">&nbsp;&nbsp; logger.<strong>debug</strong>("Starting search for nearest gas station.");</span></p>
            <p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="color: #003366; font-family: 宋体">&nbsp;&nbsp; // The logger instance barlogger, named "com.foo.Bar",</span></p>
            <p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="color: #003366; font-family: 宋体">&nbsp;&nbsp; // will inherit its level from the logger named</span></p>
            <p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="color: #003366; font-family: 宋体">&nbsp;&nbsp; // "com.foo" Thus, the following request is enabled</span></p>
            <p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="color: #003366; font-family: 宋体">&nbsp;&nbsp; // because <strong>INFO</strong> &gt;= <strong>INFO</strong>.</span></p>
            <p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="color: #003366; font-family: 宋体">&nbsp;&nbsp; barlogger.<strong>info</strong>("Located nearest gas station.");</span></p>
            <p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="color: #003366; font-family: 宋体">&nbsp;&nbsp; // This request is disabled, because <strong>DEBUG</strong> &lt; <strong>INFO</strong>.</span></p>
            <p><span style="color: #003366; font-family: 宋体">&nbsp;&nbsp; barlogger.<strong>debug</strong>("Exiting gas station search");</span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><strong><span style="font-size: 15pt; color: #003366; font-family: 宋体">Appenders</span></strong><strong><span style="font-size: 15pt; color: #003366; font-family: 宋体">与Layouts</span></strong></p>
<p style="text-indent: 21pt"><span style="font-size: 10pt; font-family: 宋体"><span style="color: #003366; font-family: 宋体">Appender</span><span style="color: #003366; font-family: 宋体">正如前面所述，是用来定义日志信息的输出终端，最觉的输出终端有console与file了，另外还有其它如GUI components, JMS, NT Event Loggers, remote socket servers等等。</span></span></p>
<p><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366; font-family: 宋体">&nbsp;&nbsp;&nbsp; Appender</span><span style="color: #003366; font-family: 宋体">也有类似继承的原则，即当前logger的appender包括其它父类的appender。这样就会出现一个logger可能拥有多个appender了，在现实中看来，就是log4j的日志信息可以同进输出到console, file等等终端了。当然，为了不使此appender恶性叠加，可以通过设置additivity标志来阻止继承。</span></span></span></p>
<p><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="color: #003366; font-family: 宋体">规则－若当前logger为C，则C拥有包括其自己及其父类的所有appender。另外，若C的父logger为P，且P的additivity标志已经设置成为false，则C只拥有自己及P的appender了，而P则只能拥有本身的appender。</span></span></span></p>
<p><span style="color: #003366; font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; </span></span><span style="color: #003366; font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-size: 10pt; color: #003366; font-family: "><span style="font-family: ">以下表格可以清晰说明此规则：</span><br style="font-family: " />
</span></span></span>&nbsp;&nbsp;&nbsp;&nbsp;
<table cellpadding="10" align="center" border="3">
    <tbody>
        <tr rowspan="2">
            <th style="color: #003366">Logger<br />
            Name
            <th style="color: #003366">Added<br />
            Appenders
            <th style="color: #003366">Additivity<br />
            Flag
            <th style="color: #003366">Output Targets
            <th style="color: #003366">Comment
            <tr>
                <td><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366">root </span></span></span>
                <td><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366">A1 </span></span></span>
                <td><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366">not applicable </span></span></span>
                <td><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366">A1 </span></span></span>
                <td><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366">The root logger is anonymous but can be accessed with the Logger.getRootLogger() method. There is no default appender attached to root. </span></span></span>
                <tr>
                    <td><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366">x </span></span></span>
                    <td><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366">A-x1, A-x2 </span></span></span>
                    <td><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366">true </span></span></span>
                    <td><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366">A1, A-x1, A-x2 </span></span></span>
                    <td><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366">Appenders of "x" and root. </span></span></span>
                    <tr>
                        <td><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366">x.y </span></span></span>
                        <td><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366">none </span></span></span>
                        <td><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366">true </span></span></span>
                        <td><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366">A1, A-x1, A-x2 </span></span></span>
                        <td><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366">Appenders of "x" and root. </span></span></span>
                        <tr>
                            <td><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366">x.y.z </span></span></span>
                            <td><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366">A-xyz1 </span></span></span>
                            <td><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366">true </span></span></span>
                            <td><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366">A1, A-x1, A-x2, A-xyz1 </span></span></span>
                            <td><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366">Appenders in "x.y.z", "x" and root. </span></span></span>
                            <tr>
                                <td><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366">security </span></span></span>
                                <td><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366">A-sec </span></span></span>
                                <td><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366">false </span></span></span>
                                <td><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366">A-sec </span></span></span>
                                <td><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366">No appender accumulation since the additivity flag is set to <code>false</code>. </span></span></span>
                                <tr>
                                    <td><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366">security.access </span></span></span>
                                    <td><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366">none </span></span></span>
                                    <td><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366">true </span></span></span>
                                    <td><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366">A-sec </span></span></span>
                                    <td><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366">Only appenders of "security" because the additivity flag in "security" is set to <code>false</code>.</span></span></span> </td>
                                </tr>
                            </tbody>
                        </table>
                        </span><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;<br />
                        </span><span style="color: #003366; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;对于layout，也正如前面所述，是用来定义日志信息的输出格式，它的与C语言中</span><code><span style="color: #003366">printf</span></code><code><span style="color: #003366">函数的格式定义基本相似，本人对printf中的格式参数不太熟悉，总感觉有些复杂，一般是平时看到自己认为有用的格式就记一下，到时直接搬过来。如<br />
                        </span></code></span></span></p>
                        <p><span style="font-family: 宋体"><span style="font-size: 10pt"><code><span style="color: #003366">log4j.appender.R.layout.ConversionPattern=---&gt;%-d{yyyy-MM-dd HH:mm:ss} [%5p]%l - %m%n<br />
                        </span></code><code><span style="color: #003366"><br />
                        时，日志信息格式为：</span></code></span></span></p>
                        <p><code><span style="color: #003366"><span style="font-family: 宋体"><span style="font-size: 10pt">---&gt;2008-07-11 01:13:40 [ INFO]com.test.Log4jTest.main(Log4jTest.java:27) - Exiting application.</span></span></span></code></p>
                        <p><span style="font-family: 宋体"><span style="font-size: 10pt"><code><span style="color: #003366">&nbsp;&nbsp;&nbsp;&nbsp;<br />
                        </span></code><code><span style="color: #003366">&nbsp;&nbsp;&nbsp;&nbsp;好啦，现在log4j的理论很肤浅地扯了一下，现在可以开始配置了。</span></code></span></span></p>
                        <p><span style="font-family: 宋体"><span style="font-size: 10pt"><code><span style="color: #003366">&nbsp;&nbsp;&nbsp;<span style="font-size: 18pt"><span style="font-family: 宋体"><code><span style="color: #003366"></code><code><span style="color: #003366"><strong>配置：</strong></code></span></span></span></span></span></code></span></span><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366; font-family: 宋体">&nbsp;&nbsp;&nbsp;<br />
                        <br />
                        &nbsp;&nbsp;&nbsp;&nbsp;Log4j</span><span style="color: #003366; font-family: 宋体">的配置可以通过加载Java的properties配置文件或者XML文件来完成。<br />
                        </span></span></span></p>
                        <p><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366; font-family: 宋体">&nbsp;&nbsp;&nbsp; Log4j</span><span style="color: #003366; font-family: 宋体">默认的配置为，通过读取系统变量log4j.configuration来找到配置文件，当然变量的默认值为log4j.properties，所以若没有设置此系统变量，可以直接将配置文件命名为log4j.properties，然后放到类路径下即可。另外，若想引用通过其它配置文件，则可以通过</span></span></span></p>
                        <p style="font-size: 10pt; font-family: 宋体"><span style="font-family: 宋体"><span style="color: #003366; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;Loader.getResource(java.lang.String)</span><span style="color: #003366; font-family: 宋体">来读取指定的配置文件。</span></span></p>
                        <p><span style="color: #003366; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 15pt; color: #003366; font-family: 宋体">其它：</span></strong></p>
                        <span style="color: #003366; font-family: 宋体"><span style="font-family: 宋体"><span>
                        <p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;1. 由于有了log4j中的级别继承机制，所以可以很方便地过滤信息了，不仅可以很方便地限制日志的输出量，也可以同时将日志输出到不同的终端。<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;另外，因为在java文件中，文件的物理层次关系也是直接通过&#8220;.&#8221;符号来控制的，且在很在程度上这个物理层次也决定了文件的逻辑层次，所以我们在当前文件中获取logger时，可以直接通过当前文件的类名来获取，如：<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;static Logger logger = Logger.getLogger(MyApp.class);<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;这样，在过滤消息时就很简单了，简单示例如下：<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;在配置文件中有<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;log4j.rootLogger=ERROR,stdout,R<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;log4j.category.com.db=DEBUG<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;log4j.category.com.i18n=INFO<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;log4j.category.com.zyx=fatal</span></span></p>
                        <p><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;默认的root logger的日志级别为Error，根据级别关系这个级别也相当高了，这样可以减少系统中日志的输出量，但有些地方可能得输出更详细信息，如数据库部分，所以可以将com.db设置成了debug。另外，我在com.zyx下，我只想看到类型为fatal的日志，也可以如上所设。</span></span></span></p>
                        </span></span></span>
                        <p><span style="color: #003366; font-family: 宋体"><span style="font-family: 宋体">&nbsp;</span></span></p>
                        <p><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366; font-family: 宋体"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;2. log4j.rootLogger=ERROR,stdout, ROLLING_FILE</span></span></span><span style="color: #003366; font-family: 宋体"><span style="font-family: 宋体">这个定义表</span>示root logger的日志级别为Error，后面的stdout, ROLLING_FILE表示此root有二个appender，通常可以通过这样来定义日志可以同时向多个终端输出，因为子logger可以继承所有父logger的appender.</span></span></span></p>
                        <p><span style="color: #003366; font-family: 宋体"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;如我可以通过以下定义将日志同时往console及file输出：</span></span></span></p>
                        <p>
                        <table style="border-right: medium none; border-top: medium none; background: #b3b3b3; border-left: medium none; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" border="1">
                            <tbody>
                                <tr>
                                    <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; font-size: 10pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 426.1pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; font-family: Verdana" valign="top" width="568">
                                    <p><span style="color: #003366; font-family: 宋体"><span style="font-family: 宋体"><span style="font-size: 10pt">log4j.appender.stdout=org.apache.log4j.ConsoleAppender</span></span></span></p>
                                    <p><span style="color: #003366; font-family: 宋体"><span style="font-family: 宋体"><span style="font-size: 10pt">log4j.appender.stdout.layout=org.apache.log4j.PatternLayout</span></span></span></p>
                                    <p><span style="color: #003366; font-family: 宋体"><span style="font-family: 宋体"><span style="font-size: 10pt">log4j.appender.stdout.layout.ConversionPattern=---&gt;%-d{yyyy-MM-dd HH:mm:ss} [%5p]%l - %m%n</span></span></span></p>
                                    <p><span style="color: #003366; font-family: 宋体"><span style="font-family: 宋体">&nbsp;</span></span></p>
                                    <p><span style="color: #003366; font-family: 宋体"><span style="font-family: 宋体"><span style="font-size: 10pt">log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender</span></span></span></p>
                                    <p><span style="color: #003366; font-family: 宋体"><span style="font-family: 宋体"><span style="font-size: 10pt">log4j.appender.ROLLING_FILE.File=myapp.log</span></span></span></p>
                                    <p><span style="color: #003366; font-family: 宋体"><span style="font-family: 宋体"><span style="font-size: 10pt">log4j.appender.ROLLING_FILE.Append=true</span></span></span></p>
                                    <p><span style="color: #003366; font-family: 宋体"><span style="font-family: 宋体"><span style="font-size: 10pt">log4j.appender.ROLLING_FILE.MaxFileSize=1024KB</span></span></span></p>
                                    <p><span style="color: #003366; font-family: 宋体"><span style="font-family: 宋体"><span style="font-size: 10pt">log4j.appender.ROLLING_FILE.MaxBackupIndex=10</span></span></span></p>
                                    <p><span style="color: #003366; font-family: 宋体"><span style="font-family: 宋体"><span style="font-size: 10pt">log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout</span></span></span></p>
                                    <p><span style="color: #003366; font-family: 宋体"><span style="font-family: 宋体"><span style="font-size: 10pt">log4j.appender.ROLLING_FILE.layout.ConversionPattern==[slf5s.start]%d{DATE}[slf5s.DATE]%n"</span></span></span></p>
                                    <p><span style="color: #003366; font-family: 宋体"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;&nbsp; %p[slf5s.PRIORITY]%n%x[slf5s.NDC]%n%t[slf5s.THREAD]%n"</span></span></span></p>
                                    <p><span style="color: #003366; font-family: 宋体"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;&nbsp; %c[slf5s.CATEGORY]%n%l[slf5s.LOCATION]%n%m[slf5s.MESSAGE]%n%n</span></span></span></p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </p>
                        <p><span style="color: #003366; font-family: 宋体"><span style="font-family: 宋体">&nbsp;</span></span></p>
                        <p><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="color: #003366; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="color: #003366; font-family: 宋体">马马虎虎总结了一下，但也花费了二个多小时，呵呵！</span></span></span></p>
<img src ="http://www.blogjava.net/sy1214520/aggbug/239755.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sy1214520/" target="_blank">小虫旺福</a> 2008-11-10 23:24 <a href="http://www.blogjava.net/sy1214520/archive/2008/11/10/239755.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java正则表达式详解(转载)</title><link>http://www.blogjava.net/sy1214520/archive/2008/11/02/238172.html</link><dc:creator>小虫旺福</dc:creator><author>小虫旺福</author><pubDate>Sun, 02 Nov 2008 06:26:00 GMT</pubDate><guid>http://www.blogjava.net/sy1214520/archive/2008/11/02/238172.html</guid><wfw:comment>http://www.blogjava.net/sy1214520/comments/238172.html</wfw:comment><comments>http://www.blogjava.net/sy1214520/archive/2008/11/02/238172.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sy1214520/comments/commentRss/238172.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sy1214520/services/trackbacks/238172.html</trackback:ping><description><![CDATA[<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">如果你曾经用过Perl或任何其他内建正则表达式支持的语言，你一定知道用正则表达式处理文本和匹配模式是多么简单。如果你不熟悉这个术语，那么&#8220;正则表达式&#8221;（Regular Expression）就是一个字符构成的串，它定义了一个用来搜索匹配字符串的模式。</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">许多语言，包括Perl、PHP、Python、JavaScript和JScript，都支持用正则表达式处理文本，一些文本编辑器用正则表达式实现高级&#8220;搜索-替换&#8221;功能。那么Java又怎样呢？本文写作时，一个包含了用正则表达式进行文本处理的Java规范需求（Specification Request）已经得到认可，你可以期待在JDK的下一版本中看到它。</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">然而，如果现在就需要使用正则表达式，又该怎么办呢？你可以从Apache.org下载源代码开放的Jakarta-ORO库。本文接下来的内容先简要地介绍正则表达式的入门知识，然后以Jakarta-ORO API为例介绍如何使用正则表达式。</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true"><strong _extended="true"><font size="4" _extended="true">一、正则表达式基础知识</font></strong></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">我们先从简单的开始。假设你要搜索一个包含字符&#8220;cat&#8221;的字符串，搜索用的正则表达式就是&#8220;cat&#8221;。如果搜索对大小写不敏感，单词&#8220;catalog&#8221;、&#8220;Catherine&#8221;、&#8220;sophisticated&#8221;都可以匹配。也就是说：</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true"><img alt="" src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_a.jpg" border="0" _extended="true" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true"><strong _extended="true">1.1 句点符号</strong></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">假设你在玩英文拼字游戏，想要找出三个字母的单词，而且这些单词必须以&#8220;t&#8221;字母开头，以&#8220;n&#8221;字母结束。另外，假设有一本英文字典，你可以用正则表达式搜索它的全部内容。要构造出这个正则表达式，你可以使用一个通配符——句点符号&#8220;.&#8221;。这样，完整的表达式就是&#8220;t.n&#8221;，它匹配&#8220;tan&#8221;、&#8220;ten&#8221;、&#8220;tin&#8221;和&#8220;ton&#8221;，还匹配&#8220;t#n&#8221;、&#8220;tpn&#8221;甚至&#8220;t n&#8221;，还有其他许多无意义的组合。这是因为句点符号匹配所有字符，包括空格、Tab字符甚至换行符：</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true"><img alt="" src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_b.jpg" border="0" _extended="true" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true"><strong _extended="true">1.2 方括号符号</strong></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">为了解决句点符号匹配范围过于广泛这一问题，你可以在方括号（&#8220;[]&#8221;）里面指定看来有意义的字符。此时，只有方括号里面指定的字符才参与匹配。也就是说，正则表达式&#8220;t[aeio]n&#8221;只匹配&#8220;tan&#8221;、&#8220;Ten&#8221;、&#8220;tin&#8221;和&#8220;ton&#8221;。但&#8220;Toon&#8221;不匹配，因为在方括号之内你只能匹配单个字符：</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true"><img alt="" src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_c.jpg" border="0" _extended="true" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true"><strong _extended="true">1.3 &#8220;或&#8221;符号</strong></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">如果除了上面匹配的所有单词之外，你还想要匹配&#8220;toon&#8221;，那么，你可以使用&#8220;|&#8221;操作符。&#8220;|&#8221;操作符的基本意义就是&#8220;或&#8221;运算。要匹配&#8220;toon&#8221;，使用&#8220;t(a|e|i|o|oo)n&#8221;正则表达式。这里不能使用方扩号，因为方括号只允许匹配单个字符；这里必须使用圆括号&#8220;()&#8221;。圆括号还可以用来分组，具体请参见后面介绍。</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true"><img alt="" src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_d.jpg" border="0" _extended="true" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true"><strong _extended="true">1.4 表示匹配次数的符号</strong></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">表一显示了表示匹配次数的符号，这些符号用来确定紧靠该符号左边的符号出现的次数：</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">
            <p align="center" _extended="true"><img alt="" src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4n.jpg" border="0" _extended="true" /></p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">假设我们要在文本文件中搜索美国的社会安全号码。这个号码的格式是999-99-9999。用来匹配它的正则表达式如图一所示。在正则表达式中，连字符（&#8220;-&#8221;）有着特殊的意义，它表示一个范围，比如从0到9。因此，匹配社会安全号码中的连字符号时，它的前面要加上一个转义字符&#8220;\&#8221;。</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">
            <p align="center" _extended="true"><img alt="" src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4a.gif" border="0" _extended="true" /></p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">
            <p align="center" _extended="true">图一：匹配所有123-12-1234形式的社会安全号码</p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">假设进行搜索的时候，你希望连字符号可以出现，也可以不出现——即，999-99-9999和999999999都属于正确的格式。这时，你可以在连字符号后面加上&#8220;？&#8221;数量限定符号，如图二所示：</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">
            <p align="center" _extended="true"><img style="width: 500px; height: 90px" alt="" src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4b.gif" border="0" _extended="true" /></p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">
            <p align="center" _extended="true">图二：匹配所有123-12-1234和123121234形式的社会安全号码</p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">下面我们再来看另外一个例子。美国汽车牌照的一种格式是四个数字加上二个字母。它的正则表达式前面是数字部分&#8220;[0-9]{4}&#8221;，再加上字母部分&#8220;[A-Z]{2}&#8221;。图三显示了完整的正则表达式。</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">
            <p align="center" _extended="true"><img alt="" src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4c.gif" border="0" _extended="true" /></p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">
            <p align="center" _extended="true">图三：匹配典型的美国汽车牌照号码，如8836KV</p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">1.5 &#8220;否&#8221;符号</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">&#8220;^&#8221;符号称为&#8220;否&#8221;符号。如果用在方括号内，&#8220;^&#8221;表示不想要匹配的字符。例如，图四的正则表达式匹配所有单词，但以&#8220;X&#8221;字母开头的单词除外。</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">
            <p align="center" _extended="true"><img alt="" src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4d.gif" border="0" _extended="true" /></p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">
            <p align="center" _extended="true">图四：匹配所有单词，但&#8220;X&#8221;开头的除外</p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">1.6 圆括号和空白符号</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">假设要从格式为&#8220;June 26, 1951&#8221;的生日日期中提取出月份部分，用来匹配该日期的正则表达式可以如图五所示：</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">
            <p align="center" _extended="true"><img style="width: 500px; height: 107px" alt="" src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4e.gif" border="0" _extended="true" /></p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">
            <p align="center" _extended="true">图五：匹配所有Moth DD,YYYY格式的日期</p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">新出现的&#8220;\s&#8221;符号是空白符号，匹配所有的空白字符，包括Tab字符。如果字符串正确匹配，接下来如何提取出月份部分呢？只需在月份周围加上一个圆括号创建一个组，然后用ORO API（本文后面详细讨论）提取出它的值。修改后的正则表达式如图六所示：</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">
            <p align="center" _extended="true"><img style="width: 500px; height: 118px" alt="" src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4f.gif" border="0" _extended="true" /></p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">
            <p align="center" _extended="true">图六：匹配所有Month DD,YYYY格式的日期，定义月份值为第一个组</p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true"><strong _extended="true">1.7 其它符号</strong></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">为简便起见，你可以使用一些为常见正则表达式创建的快捷符号。如表二所示：</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">表二：常用符号</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">
            <p align="center" _extended="true"><img alt="" src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4o.jpg" border="0" _extended="true" /></p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">例如，在前面社会安全号码的例子中，所有出现&#8220;[0-9]&#8221;的地方我们都可以使用&#8220;\d&#8221;。修改后的正则表达式如图七所示：</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">
            <p align="center" _extended="true"><img alt="" src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4g.gif" border="0" _extended="true" /></p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">
            <p align="center" _extended="true">图七：匹配所有123-12-1234格式的社会安全号码</p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true"><strong _extended="true"><font size="4" _extended="true">二、Jakarta-ORO库</font></strong></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">有许多源代码开放的正则表达式库可供Java程序员使用，而且它们中的许多支持Perl 5兼容的正则表达式语法。我在这里选用的是Jakarta-ORO正则表达式库，它是最全面的正则表达式API之一，而且它与Perl 5正则表达式完全兼容。另外，它也是优化得最好的API之一。</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">Jakarta-ORO库以前叫做OROMatcher，Daniel Savarese大方地把它赠送给了Jakarta Project。你可以按照本文最后参考资源的说明下载它。</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">我首先将简要介绍使用Jakarta-ORO库时你必须创建和访问的对象，然后介绍如何使用Jakarta-ORO API。</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true"><strong _extended="true">▲ PatternCompiler对象</strong></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">首先，创建一个Perl5Compiler类的实例，并把它赋值给PatternCompiler接口对象。Perl5Compiler是PatternCompiler接口的一个实现，允许你把正则表达式编译成用来匹配的Pattern对象。</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true"><img alt="" src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_e.jpg" border="0" _extended="true" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true"><strong _extended="true">▲ Pattern对象</strong></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">要把正则表达式编译成Pattern对象，调用compiler对象的compile()方法，并在调用参数中指定正则表达式。例如，你可以按照下面这种方式编译正则表达式&#8220;t[aeio]n&#8221;：</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true"><img alt="" src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_f.jpg" border="0" _extended="true" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">默认情况下，编译器创建一个大小写敏感的模式（pattern）。因此，上面代码编译得到的模式只匹配&#8220;tin&#8221;、&#8220;tan&#8221;、 &#8220;ten&#8221;和&#8220;ton&#8221;，但不匹配&#8220;Tin&#8221;和&#8220;taN&#8221;。要创建一个大小写不敏感的模式，你应该在调用编译器的时候指定一个额外的参数：</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true"><img alt="" src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_g.jpg" border="0" _extended="true" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">创建好Pattern对象之后，你就可以通过PatternMatcher类用该Pattern对象进行模式匹配。</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true"><strong _extended="true">▲ PatternMatcher对象</strong></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">PatternMatcher对象根据Pattern对象和字符串进行匹配检查。你要实例化一个Perl5Matcher类并把结果赋值给PatternMatcher接口。Perl5Matcher类是PatternMatcher接口的一个实现，它根据Perl 5正则表达式语法进行模式匹配：</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true"><img alt="" src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_h.jpg" border="0" _extended="true" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">使用PatternMatcher对象，你可以用多个方法进行匹配操作，这些方法的第一个参数都是需要根据正则表达式进行匹配的字符串：</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">&#183; boolean matches(String input, Pattern pattern)：当输入字符串和正则表达式要精确匹配时使用。换句话说，正则表达式必须完整地描述输入字符串。</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">&#183; boolean matchesPrefix(String input, Pattern pattern)：当正则表达式匹配输入字符串起始部分时使用。</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">&#183; boolean contains(String input, Pattern pattern)：当正则表达式要匹配输入字符串的一部分时使用（即，它必须是一个子串）。</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">另外，在上面三个方法调用中，你还可以用PatternMatcherInput对象作为参数替代String对象；这时，你可以从字符串中最后一次匹配的位置开始继续进行匹配。当字符串可能有多个子串匹配给定的正则表达式时，用PatternMatcherInput对象作为参数就很有用了。用PatternMatcherInput对象作为参数替代String时，上述三个方法的语法如下：</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">&#183; boolean matches(PatternMatcherInput input, Pattern pattern)</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">&#183; boolean matchesPrefix(PatternMatcherInput input, Pattern pattern)</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">&#183; boolean contains(PatternMatcherInput input, Pattern pattern)</td>
        </tr>
    </tbody>
</table>
<p>&nbsp;
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true"><strong _extended="true"><font size="4" _extended="true">三、应用实例</font></strong></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">下面我们来看看Jakarta-ORO库的一些应用实例。</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true"><strong _extended="true">3.1 日志文件处理</strong></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">任务：分析一个Web服务器日志文件，确定每一个用户花在网站上的时间。在典型的BEA WebLogic日志文件中，日志记录的格式如下：</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true"><img alt="" src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_i.jpg" border="0" _extended="true" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">分析这个日志记录，可以发现，要从这个日志文件提取的内容有两项：IP地址和页面访问时间。你可以用分组符号（圆括号）从日志记录提取出IP地址和时间标记。</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">首先我们来看看IP地址。IP地址有4个字节构成，每一个字节的值在0到255之间，各个字节通过一个句点分隔。因此，IP地址中的每一个字节有至少一个、最多三个数字。图八显示了为IP地址编写的正则表达式：</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">
            <p align="center" _extended="true"><img style="width: 500px; height: 118px" alt="" src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4h.gif" border="0" _extended="true" /></p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">
            <p align="center" _extended="true">图八：匹配IP地址</p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">IP地址中的句点字符必须进行转义处理（前面加上&#8220;\&#8221;），因为IP地址中的句点具有它本来的含义，而不是采用正则表达式语法中的特殊含义。句点在正则表达式中的特殊含义本文前面已经介绍。</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">日志记录的时间部分由一对方括号包围。你可以按照如下思路提取出方括号里面的所有内容：首先搜索起始方括号字符（&#8220;[&#8221;），提取出所有不超过结束方括号字符（&#8220;]&#8221;）的内容，向前寻找直至找到结束方括号字符。图九显示了这部分的正则表达式。</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">
            <p align="center" _extended="true"><img alt="" src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4i.gif" border="0" _extended="true" /></p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">
            <p align="center" _extended="true">图九：匹配至少一个字符，直至找到&#8220;]&#8221;</p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">现在，把上述两个正则表达式加上分组符号（圆括号）后合并成单个表达式，这样就可以从日志记录提取出IP地址和时间。注意，为了匹配&#8220;- -&#8221;（但不提取它），正则表达式中间加入了&#8220;\s-\s-\s&#8221;。完整的正则表达式如图十所示。</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">
            <p align="center" _extended="true"><img style="width: 500px; height: 73px" alt="" src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4j.gif" border="0" _extended="true" /></p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">
            <p align="center" _extended="true">图十：匹配IP地址和时间标记</p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">现在正则表达式已经编写完毕，接下来可以编写使用正则表达式库的Java代码了。</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">为使用Jakarta-ORO库，首先创建正则表达式字符串和待分析的日志记录字符串：</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true"><img alt="" src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_j.jpg" border="0" _extended="true" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">这里使用的正则表达式与图十的正则表达式差不多完全相同，但有一点例外：在Java中，你必须对每一个向前的斜杠（&#8220;\&#8221;）进行转义处理。图十不是Java的表示形式，所以我们要在每个&#8220;\&#8221;前面加上一个&#8220;\&#8221;以免出现编译错误。遗憾的是，转义处理过程很容易出现错误，所以应该小心谨慎。你可以首先输入未经转义处理的正则表达式，然后从左到右依次把每一个&#8220;\&#8221;替换成&#8220;\\&#8221;。如果要复检，你可以试着把它输出到屏幕上。</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">初始化字符串之后，实例化PatternCompiler对象，用PatternCompiler编译正则表达式创建一个Pattern对象：</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true"><img alt="" src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_k.jpg" border="0" _extended="true" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">现在，创建PatternMatcher对象，调用PatternMatcher接口的contain()方法检查匹配情况：</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true"><img alt="" src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_l.jpg" border="0" _extended="true" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">接下来，利用PatternMatcher接口返回的MatchResult对象，输出匹配的组。由于logEntry字符串包含匹配的内容，你可以看到类如下面的输出：</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true"><img alt="" src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_m.jpg" border="0" _extended="true" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true"><strong _extended="true">3.2 HTML处理实例一</strong></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">下面一个任务是分析HTML页面内FONT标记的所有属性。HTML页面内典型的FONT标记如下所示：</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true"><img alt="" src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_n.jpg" border="0" _extended="true" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">程序将按照如下形式，输出每一个FONT标记的属性：</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true"><img alt="" src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_o.jpg" border="0" _extended="true" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">在这种情况下，我建议你使用两个正则表达式。第一个如图十一所示，它从字体标记提取出&#8220;"face="Arial, Serif" size="+2" color="red"&#8221;。</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">
            <p align="center" _extended="true"><img style="width: 500px; height: 91px" alt="" src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4k.gif" border="0" _extended="true" /></p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">
            <p align="center" _extended="true">图十一：匹配FONT标记的所有属性</p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">第二个正则表达式如图十二所示，它把各个属性分割成名字-值对。</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">
            <p align="center" _extended="true"><img style="width: 500px; height: 140px" alt="" src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4l.gif" border="0" _extended="true" /></p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">
            <p align="center" _extended="true">图十二：匹配单个属性，并把它分割成名字-值对</p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">分割结果为：</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true"><img alt="" src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_p.jpg" border="0" _extended="true" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">现在我们来看看完成这个任务的Java代码。首先创建两个正则表达式字符串，用Perl5Compiler把它们编译成Pattern对象。编译正则表达式的时候，指定Perl5Compiler.CASE_INSENSITIVE_MASK选项，使得匹配操作不区分大小写。</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">接下来，创建一个执行匹配操作的Perl5Matcher对象。</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true"><img alt="" src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_q.jpg" border="0" _extended="true" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">假设有一个String类型的变量html，它代表了HTML文件中的一行内容。如果html字符串包含FONT标记，匹配器将返回true。此时，你可以用匹配器对象返回的MatchResult对象获得第一个组，它包含了FONT的所有属性：</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true"><img alt="" src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_r.jpg" border="0" _extended="true" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">接下来创建一个PatternMatcherInput对象。这个对象允许你从最后一次匹配的位置开始继续进行匹配操作，因此，它很适合于提取FONT标记内属性的名字-值对。创建PatternMatcherInput对象，以参数形式传入待匹配的字符串。然后，用匹配器实例提取出每一个FONT的属性。这通过指定PatternMatcherInput对象（而不是字符串对象）为参数，反复地调用PatternMatcher对象的contains()方法完成。PatternMatcherInput对象之中的每一次迭代将把它内部的指针向前移动，下一次检测将从前一次匹配位置的后面开始。</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">本例的输出结果如下：</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true"><img alt="" src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_s.jpg" border="0" _extended="true" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true"><strong _extended="true">3.3 HTML处理实例二</strong></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">下面我们来看看另一个处理HTML的例子。这一次，我们假定Web服务器从widgets.acme.com移到了newserver.acme.com。现在你要修改一些页面中的链接：</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true"><img alt="" src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_t.jpg" border="0" _extended="true" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">执行这个搜索的正则表达式如图十三所示：</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">
            <p align="center" _extended="true"><img style="width: 500px; height: 108px" alt="" src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4m.gif" border="0" _extended="true" /></p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">
            <p align="center" _extended="true">图十三：匹配修改前的链接</p>
            </td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">如果能够匹配这个正则表达式，你可以用下面的内容替换图十三的链接：</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true"><a href="http://newserver.acme.com/interface.html#$1" _extended="true"></a><img alt="" src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_u.jpg" border="0" _extended="true" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">注意#字符的后面加上了$1。Perl正则表达式语法用$1、$2等表示已经匹配且提取出来的组。图十三的表达式把所有作为一个组匹配和提取出来的内容附加到链接的后面。</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">现在，返回Java。就象前面我们所做的那样，你必须创建测试字符串，创建把正则表达式编译到Pattern对象所必需的对象，以及创建一个PatternMatcher对象：<img style="width: 500px; height: 181px" alt="" src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_v.jpg" border="0" _extended="true" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">接下来，用com.oroinc.text.regex包Util类的substitute()静态方法进行替换，输出结果字符串：</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true"><img alt="" src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_w.jpg" border="0" _extended="true" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">Util.substitute()方法的语法如下：</td>
        </tr>
    </tbody>
</table>
<table height="17" width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" height="13" _extended="true"><img alt="" src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_x.jpg" border="0" _extended="true" /></td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true">这个调用的前两个参数是以前创建的PatternMatcher和Pattern对象。第三个参数是一个Substiution对象，它决定了替换操作如何进行。本例使用的是Perl5Substitution对象，它能够进行Perl5风格的替换。第四个参数是想要进行替换操作的字符串，最后一个参数允许指定是否替换模式的所有匹配子串（Util.SUBSTITUTE_ALL），或只替换指定的次数。</td>
        </tr>
    </tbody>
</table>
<table width="620" align="center" _extended="true">
    <tbody _extended="true">
        <tr _extended="true">
            <td class="a14" _extended="true"><strong _extended="true">【结束语】</strong>在这篇文章中，我为你介绍了正则表达式的强大功能。只要正确运用，正则表达式能够在字符串提取和文本修改中起到很大的作用。另外，我还介绍了如何在Java程序中通过Jakarta-ORO库利用正则表达式。至于最终采用老式的字符串处理方式（使用StringTokenizer，charAt，和substring），还是采用正则表达式，这就有待你自己决定了。</td>
        </tr>
    </tbody>
</table>
</p>
<img src ="http://www.blogjava.net/sy1214520/aggbug/238172.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sy1214520/" target="_blank">小虫旺福</a> 2008-11-02 14:26 <a href="http://www.blogjava.net/sy1214520/archive/2008/11/02/238172.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用java date 方法集合</title><link>http://www.blogjava.net/sy1214520/archive/2008/11/02/238171.html</link><dc:creator>小虫旺福</dc:creator><author>小虫旺福</author><pubDate>Sun, 02 Nov 2008 06:23:00 GMT</pubDate><guid>http://www.blogjava.net/sy1214520/archive/2008/11/02/238171.html</guid><wfw:comment>http://www.blogjava.net/sy1214520/comments/238171.html</wfw:comment><comments>http://www.blogjava.net/sy1214520/archive/2008/11/02/238171.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sy1214520/comments/commentRss/238171.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sy1214520/services/trackbacks/238171.html</trackback:ping><description><![CDATA[<div class="postText">计算某一月份的最大天数<br />
<br />
Calendar time=Calendar.getInstance();<br />
time.clear();<br />
time.set(Calendar.YEAR,year); //year 为 int <br />
time.set(Calendar.MONTH,i-1);//注意,Calendar对象默认一月为0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
int day=time.getActualMaximum(Calendar.DAY_OF_MONTH);//本月份的天数<br />
注：在使用set方法之前，必须先clear一下，否则很多信息会继承自系统当前时间<br />
<br />
2.Calendar和Date的转化<br />
<br />
(1) Calendar转化为Date<br />
Calendar cal=Calendar.getInstance();<br />
Date date=cal.getTime();<br />
<br />
(2) Date转化为Calendar<br />
Date date=new Date();<br />
Calendar cal=Calendar.getInstance();<br />
cal.setTime(date);<br />
<br />
3.格式化输出日期时间 （这个用的比较多）<br />
<br />
Date date=new Date();<br />
SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");<br />
String time=df.format(date);<br />
System.out.println(time);<br />
<br />
4.计算一年中的第几星期<br />
<br />
(1)计算某一天是一年中的第几星期<br />
Calendar cal=Calendar.getInstance();<br />
cal.set(Calendar.YEAR, 2006);<br />
cal.set(Calendar.MONTH, 8);<br />
cal.set(Calendar.DAY_OF_MONTH, 3);<br />
int weekno=cal.get(Calendar.WEEK_OF_YEAR);<br />
<br />
(2)计算一年中的第几星期是几号<br />
SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");<br />
Calendar cal=Calendar.getInstance();<br />
cal.set(Calendar.YEAR, 2006);<br />
cal.set(Calendar.WEEK_OF_YEAR, 1);<br />
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);<br />
System.out.println(df.format(cal.getTime()));<br />
输出:<br />
2006-01-02<br />
<br />
5.add()和roll()的用法(不太常用)<br />
<br />
(1)add()方法<br />
SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");<br />
Calendar cal=Calendar.getInstance();<br />
cal.set(Calendar.YEAR, 2006);<br />
cal.set(Calendar.MONTH, 8);<br />
cal.set(Calendar.DAY_OF_MONTH, 3);<br />
cal.add(Calendar.DATE, -4);<br />
Date date=cal.getTime();<br />
System.out.println(df.format(date));<br />
cal.add(Calendar.DATE, 4);<br />
date=cal.getTime();<br />
System.out.println(df.format(date));<br />
输出：<br />
&nbsp;&nbsp;&nbsp; 2006-08-30<br />
&nbsp;&nbsp;&nbsp; 2006-09-03<br />
(2)roll方法<br />
cal.set(Calendar.YEAR, 2006);<br />
cal.set(Calendar.MONTH, 8);<br />
cal.set(Calendar.DAY_OF_MONTH, 3);<br />
cal.roll(Calendar.DATE, -4);<br />
date=cal.getTime();<br />
System.out.println(df.format(date));<br />
cal.roll(Calendar.DATE, 4);<br />
date=cal.getTime();<br />
System.out.println(df.format(date));<br />
输出：<br />
&nbsp;&nbsp;&nbsp; 2006-09-29<br />
&nbsp;&nbsp;&nbsp; 2006-09-03<br />
可见，roll()方法在本月内循环，一般使用add()方法；<br />
<br />
6.计算两个任意时间中间的间隔天数（这个比较常用）<br />
(1)传进Calendar对象<br />
&nbsp;&nbsp;&nbsp; public int getIntervalDays(Calendar startday,Calendar endday)...{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(startday.after(endday))...{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Calendar cal=startday;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; startday=endday;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; endday=cal;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long sl=startday.getTimeInMillis();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long el=endday.getTimeInMillis();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long ei=el-sl;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (int)(ei/(1000*60*60*24));<br />
&nbsp;&nbsp;&nbsp; }<br />
(2)传进Date对象<br />
<br />
&nbsp;&nbsp;&nbsp; public int getIntervalDays(Date startday,Date endday)...{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(startday.after(endday))...{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Date cal=startday;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; startday=endday;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; endday=cal;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long sl=startday.getTime();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long el=endday.getTime();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long ei=el-sl;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (int)(ei/(1000*60*60*24));<br />
&nbsp;&nbsp;&nbsp; }<br />
(3)改进精确计算相隔天数的方法<br />
&nbsp;&nbsp;&nbsp; public int getDaysBetween (Calendar d1, Calendar d2) ...{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (d1.after(d2)) ...{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; java.util.Calendar swap = d1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d1 = d2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d2 = swap;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int days = d2.get(Calendar.DAY_OF_YEAR) - d1.get(Calendar.DAY_OF_YEAR);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int y2 = d2.get(Calendar.YEAR);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (d1.get(Calendar.YEAR) != y2) ...{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d1 = (Calendar) d1.clone();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; do ...{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; days += d1.getActualMaximum(Calendar.DAY_OF_YEAR);//得到当年的实际天数<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d1.add(Calendar.YEAR, 1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } while (d1.get(Calendar.YEAR) != y2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return days;<br />
&nbsp;&nbsp;&nbsp; }<br />
注意：通过上面的方法可以衍生出求任何时间，如要查出邮箱三周之内收到的邮件（得到当前系统时间－再得到三周前时间）用收件的时间去匹配 最好装化成 long去比较<br />
如：1年前日期（注意毫秒的转换）<br />
&nbsp;&nbsp; java.util.Date myDate=new java.util.Date();<br />
&nbsp;&nbsp; long myTime=(myDate.getTime()/1000)-60*60*24*365;<br />
&nbsp;&nbsp; myDate.setTime(myTime*1000);<br />
&nbsp;&nbsp; String mDate=formatter.format(myDate);<br />
<br />
7. String 和 Date ，Long 之间相互转换 （最常用）<br />
<br />
字符串转化成时间类型（字符串可以是任意类型，只要和SimpleDateFormat中的格式一致即可）<br />
通常我们取时间跨度的时候，会substring出具体时间－－long－比较<br />
<br />
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("M/dd/yyyy hh:mm:ss a",java.util.Locale.US);<br />
java.util.Date d = sdf.parse("5/13/2003 10:31:37 AM");<br />
long dvalue=d.getTime();<br />
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");<br />
String mDateTime1=formatter.format(d);<br />
<br />
8. 通过时间求时间<br />
<br />
年月周求日期<br />
SimpleDateFormat formatter2 = new SimpleDateFormat("yyyy-MM F E");<br />
java.util.Date date2= formatter2.parse("2003-05 5 星期五");<br />
SimpleDateFormat formatter3 = new SimpleDateFormat("yyyy-MM-dd");<br />
String mydate2=formatter3.format(date2);<br />
<br />
求是星期几<br />
mydate= myFormatter.parse("2001-1-1");<br />
SimpleDateFormat formatter4 = new SimpleDateFormat("E");<br />
String mydate3=formatter4.format(mydate);<br />
<br />
9. java 和 具体的数据库结合<br />
<br />
在开发web应用中，针对不同的数据库日期类型，我们需要在我们的程序中对日期类型做各种不同的转换。若对应数据库数据是oracle的Date类型，即只需要年月日的，可以选择使用java.sql.Date类型，若对应的是MSsqlserver 数据库的DateTime类型，即需要年月日时分秒的，选择java.sql.Timestamp类型<br />
你可以使用dateFormat定义时间日期的格式，转一个字符串即可<br />
<br />
class Datetest{<br />
*method 将字符串类型的日期转换为一个timestamp（时间戳记java.sql.Timestamp）<br />
*@param dateString 需要转换为timestamp的字符串<br />
*@return dataTime timestamp<br />
<br />
public final static java.sql.Timestamp string2Time(String dateString)<br />
throws java.text.ParseException {<br />
DateFormat dateFormat;<br />
dateFormat = new SimpleDateFormat("yyyy-MM-dd kk:mm:ss.SSS", Locale.ENGLISH);//设定格式<br />
//dateFormat = new SimpleDateFormat("yyyy-MM-dd kk:mm:ss", Locale.ENGLISH);<br />
dateFormat.setLenient(false);<br />
java.util.Date timeDate = dateFormat.parse(dateString);//util类型<br />
java.sql.Timestamp dateTime = new java.sql.Timestamp(timeDate.getTime());//Timestamp类型,timeDate.getTime()返回一个long型<br />
return dateTime;<br />
}<br />
<br />
*method 将字符串类型的日期转换为一个Date（java.sql.Date）<br />
*@param dateString 需要转换为Date的字符串<br />
*@return dataTime Date<br />
<br />
public final static java.sql.Date string2Date(String dateString)<br />
throws java.lang.Exception {<br />
DateFormat dateFormat;<br />
dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);<br />
dateFormat.setLenient(false);<br />
java.util.Date timeDate = dateFormat.parse(dateString);//util类型<br />
java.sql.Date dateTime = new java.sql.Date(timeDate.getTime());//sql类型<br />
return dateTime;<br />
}<br />
<br />
public static void main(String[] args){<br />
Date da = new Date();<br />
注意：这个地方da.getTime()得到的是一个long型的值<br />
System.out.println(da.getTime());<br />
<br />
由日期date转换为timestamp<br />
<br />
第一种方法：使用new Timestamp(long)<br />
Timestamp t = new Timestamp(new Date().getTime());<br />
System.out.println(t);<br />
<br />
第二种方法：使用Timestamp(int year,int month,int date,int hour,int minute,int second,int nano)<br />
Timestamp tt = new Timestamp(Calendar.getInstance().get(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Calendar.YEAR) - 1900, Calendar.getInstance().get(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Calendar.MONTH), Calendar.getInstance().get(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Calendar.DATE), Calendar.getInstance().get(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Calendar.HOUR), Calendar.getInstance().get(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Calendar.MINUTE), Calendar.getInstance().get(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Calendar.SECOND), 0);<br />
System.out.println(tt);<br />
<br />
try {<br />
String sToDate = "2005-8-18";//用于转换成java.sql.Date的字符串<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String sToTimestamp = "2005-8-18 14:21:12.123";//用于转换成java.sql.Timestamp的字符串<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Date date1 = string2Date(sToDate);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Timestamp date2 = string2Time(sToTimestamp);<br />
System.out.println("Date:"+date1.toString());//结果显示<br />
System.out.println("Timestamp:"+date2.toString());//结果显示<br />
}catch(Exception e) {<br />
e.printStackTrace();<br />
}<br />
}<br />
}&nbsp;<br />
</div>
<img src ="http://www.blogjava.net/sy1214520/aggbug/238171.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sy1214520/" target="_blank">小虫旺福</a> 2008-11-02 14:23 <a href="http://www.blogjava.net/sy1214520/archive/2008/11/02/238171.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中各种排序</title><link>http://www.blogjava.net/sy1214520/archive/2008/06/19/209127.html</link><dc:creator>小虫旺福</dc:creator><author>小虫旺福</author><pubDate>Thu, 19 Jun 2008 04:00:00 GMT</pubDate><guid>http://www.blogjava.net/sy1214520/archive/2008/06/19/209127.html</guid><wfw:comment>http://www.blogjava.net/sy1214520/comments/209127.html</wfw:comment><comments>http://www.blogjava.net/sy1214520/archive/2008/06/19/209127.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sy1214520/comments/commentRss/209127.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sy1214520/services/trackbacks/209127.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 把以前总结的一个java常用排序整理了一下。插入排序：package&nbsp;org.rut.util.algorithm.support;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;import&nbsp;org.rut.util.algorithm.SortUtil;&nbsp;&nbsp;&nbsp;/**&nbsp;*//**&nbsp;&nb...&nbsp;&nbsp;<a href='http://www.blogjava.net/sy1214520/archive/2008/06/19/209127.html'>阅读全文</a><img src ="http://www.blogjava.net/sy1214520/aggbug/209127.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sy1214520/" target="_blank">小虫旺福</a> 2008-06-19 12:00 <a href="http://www.blogjava.net/sy1214520/archive/2008/06/19/209127.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java对各种文件的操作详解</title><link>http://www.blogjava.net/sy1214520/archive/2008/06/19/209120.html</link><dc:creator>小虫旺福</dc:creator><author>小虫旺福</author><pubDate>Thu, 19 Jun 2008 03:40:00 GMT</pubDate><guid>http://www.blogjava.net/sy1214520/archive/2008/06/19/209120.html</guid><wfw:comment>http://www.blogjava.net/sy1214520/comments/209120.html</wfw:comment><comments>http://www.blogjava.net/sy1214520/archive/2008/06/19/209120.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sy1214520/comments/commentRss/209120.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sy1214520/services/trackbacks/209120.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 这里不讨论有关apache的commons-io中的FileUtils，只是一些基本的对文件的操作的代码，有时间会整理一个FileUtils的用法的文章。java中提供了io类库，可以轻松的用java实现对文件的各种操作。下面就来说一下如何用java来实现这些操作。&nbsp;新建目录&lt;%@&nbsp;page&nbsp;contentType="text/html;ch...&nbsp;&nbsp;<a href='http://www.blogjava.net/sy1214520/archive/2008/06/19/209120.html'>阅读全文</a><img src ="http://www.blogjava.net/sy1214520/aggbug/209120.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sy1214520/" target="_blank">小虫旺福</a> 2008-06-19 11:40 <a href="http://www.blogjava.net/sy1214520/archive/2008/06/19/209120.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>