ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美福利视频一区,亚洲色在线视频,中文网丁香综合网http://www.aygfsteel.com/sy1214520/category/32329.htmlç—›åÆˆå¿«ä¹ç€zh-cnThu, 15 Apr 2010 15:53:26 GMTThu, 15 Apr 2010 15:53:26 GMT60使用 XStream æŠ?Java å¯¹è±¡åºåˆ—åŒ–äØ“ XMLhttp://www.aygfsteel.com/sy1214520/archive/2010/04/14/318294.htmlž®è™«æ—ºç¦ž®è™«æ—ºç¦Wed, 14 Apr 2010 09:58:00 GMThttp://www.aygfsteel.com/sy1214520/archive/2010/04/14/318294.htmlhttp://www.aygfsteel.com/sy1214520/comments/318294.htmlhttp://www.aygfsteel.com/sy1214520/archive/2010/04/14/318294.html#Feedback0http://www.aygfsteel.com/sy1214520/comments/commentRss/318294.htmlhttp://www.aygfsteel.com/sy1214520/services/trackbacks/318294.html阅读全文

ž®è™«æ—ºç¦ 2010-04-14 17:58 发表评论
]]>
Appfuse的在¾U¿APIhttp://www.aygfsteel.com/sy1214520/archive/2010/02/01/311455.htmlž®è™«æ—ºç¦ž®è™«æ—ºç¦Mon, 01 Feb 2010 01:33:00 GMThttp://www.aygfsteel.com/sy1214520/archive/2010/02/01/311455.htmlhttp://www.aygfsteel.com/sy1214520/comments/311455.htmlhttp://www.aygfsteel.com/sy1214520/archive/2010/02/01/311455.html#Feedback0http://www.aygfsteel.com/sy1214520/comments/commentRss/311455.htmlhttp://www.aygfsteel.com/sy1214520/services/trackbacks/311455.htmlhttp://static.raibledesigns.com/downloads/struts-resume/api/

ž®è™«æ—ºç¦ 2010-02-01 09:33 发表评论
]]>
Java 多线½E‹ä¸Žòq¶å‘¾~–程æ€È»“åQˆå¤ä¹ ä¸€ä¸‹ï¼‰http://www.aygfsteel.com/sy1214520/archive/2009/07/15/286869.htmlž®è™«æ—ºç¦ž®è™«æ—ºç¦Wed, 15 Jul 2009 06:24:00 GMThttp://www.aygfsteel.com/sy1214520/archive/2009/07/15/286869.htmlhttp://www.aygfsteel.com/sy1214520/comments/286869.htmlhttp://www.aygfsteel.com/sy1214520/archive/2009/07/15/286869.html#Feedback0http://www.aygfsteel.com/sy1214520/comments/commentRss/286869.htmlhttp://www.aygfsteel.com/sy1214520/services/trackbacks/286869.html阅读全文

ž®è™«æ—ºç¦ 2009-07-15 14:24 发表评论
]]>
java性能优化åQŒåã^时应该注意的事情。不一定全寏V€?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/sy1214520/archive/2008/12/22/247733.html</guid><wfw:comment>http://www.aygfsteel.com/sy1214520/comments/247733.html</wfw:comment><comments>http://www.aygfsteel.com/sy1214520/archive/2008/12/22/247733.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/sy1214520/comments/commentRss/247733.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/sy1214520/services/trackbacks/247733.html</trackback:ping><description><![CDATA[     摘要:   <a href='http://www.aygfsteel.com/sy1214520/archive/2008/12/22/247733.html'>阅读全文</a><img src ="http://www.aygfsteel.com/sy1214520/aggbug/247733.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/sy1214520/" target="_blank">ž®è™«æ—ºç¦</a> 2008-12-22 12:05 <a href="http://www.aygfsteel.com/sy1214520/archive/2008/12/22/247733.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>log4j配置http://www.aygfsteel.com/sy1214520/archive/2008/11/10/239755.htmlž®è™«æ—ºç¦ž®è™«æ—ºç¦Mon, 10 Nov 2008 15:24:00 GMThttp://www.aygfsteel.com/sy1214520/archive/2008/11/10/239755.htmlhttp://www.aygfsteel.com/sy1214520/comments/239755.htmlhttp://www.aygfsteel.com/sy1214520/archive/2008/11/10/239755.html#Feedback0http://www.aygfsteel.com/sy1214520/comments/commentRss/239755.htmlhttp://www.aygfsteel.com/sy1214520/services/trackbacks/239755.html在维护系¾lŸæ—¶åQŒéš¾å…ä¼šæ—¶ä¸æ—¶åœ°è·Ÿä»£ç å†‹Æ¡æ‰“些交道。今天想再操刀做个ž®å·¥å…äh—¶åQŒå±…然不太记得了log4j的配¾|®ï¼Œä¸å¾—不从apache再重新down了相关的jar与DOCåQŒåŒ†åŒ†çœ‹çœ‹äº†ä¸€ä¸‹ï¼Œå¿?/span>点写下来åQŒæ—¥åŽè‚¯å®šè¿˜ç”¨å¾—着åQŒåŒæ—¶ä¹Ÿå¸Œæœ›å¯¹ç½‘友们有用ã€?/span> 

    Log4j基本上已¾læ˜¯java里的首选日志工具了åQŒå®ƒä¸»è¦ç”׃¸‰éƒ¨åˆ†¾l„成åQšLoggers, Appenderså’ŒLayouts (注意后面都加了s啦,™å‘֐æ€ä¹‰ä¸€ä¸ªé…¾|®ä¸­å¯ä»¥åˆ†åˆ«å…è®¸æœ‰å¤šä¸ªæ­¤¾cÕd¯¹è±¡å­˜åœ¨ï¼ŒåŽé¢ž®†è¯¦¾l†ä»‹¾l?ã€?br />

    LoggersåQç”¨æ¥å®šä¹‰æ—¥å¿—消息的¾cÕdž‹åŠçñ”别;

    AppendersåQç”¨æ¥å®šä¹‰æ—¥å¿—消息的输出¾lˆç«¯åQ?br />

    LayoutsåQç”¨æ¥å®šä¹‰æ—¥å¿—消息的输出格式ã€?/span>

  
   
Logger

    Loggers层次åQ?br />

    å¯?span style="font-family: ">logger的名字是大小写敏感ã€?/span>

规则åQå¦‚果类P的名字是另一个类C的名字的前缀åQŒä¸”P与C之间ä»?#8220;.”可‚¿žæŽ¥è“v来,那么¿U°P为祖先层‹Æ¡ï¼›å¦‚果层次A与其子层‹Æ¡ä¹‹é—´æ²¡æœ‰ä“Q何父层次åQŒåˆ™è®¤äؓ层次A为父层次ã€?/span>

    例如åQŒorg.apache.log4j是org.apache.log4j.Logger的父层次åQ›è€Œorg.apache是org.apache.log4j与org.apache.log4j.Logger的祖先层‹Æ¡ã€?/span>

    另外åQŒæ³¨æ„log4j中有个默认的root¾U§åˆ«çš„loggeråQŒåœ¨æ‰€æœ‰logger中,它是最高çñ”别,其它所有logger均ç‘ô承于rootåQŒroot有以下二个特性:

    1. 它æ€ÀL˜¯å­˜åœ¨çš„ã€?br />

    2. 它不能通过名字直接获取其实ä¾?root实例可以通过¾c»Logger的静态方法Logger.getRootLogger获得åQŒè€Œå…¶å®ƒlogger则可以直接通过名字来获取Logger.getLogger)ã€?/span>

    关于Loggers中的¾U§åˆ«åQ?/span>

   å¯Òޝä¸ªloggeråQŒå¯ä»¥æŒ‡å®šå…¶¾U§åˆ«åQŒåœ¨¾pȝ»Ÿorg.apache.log4j.Level中,已经定义了五个çñ”别,分别为debug, info, warn, error, fatalã€?/span>

规则åQè®¾å½“前logger为XåQŒä»ŽX开始往X的父¾cÀL–¹å‘开始算(包括X本èín)åQŒç›´åˆ°åä¸ºrootçš„loggeråQŒç¬¬ä¸€ä¸ªä¸ä¸ºnullçš„çñ”别值就是Xçš„çñ”别倹{€?/span>

    日志昄¡¤ºåQ?/span>  
    
¾U§åˆ«çš„定义是ä¸ÞZº†˜q‡æ×o性地选择日志ã€?/span>

规则åQè‹¥å½“前è¯äh–¹å¼çñ”åˆ«äØ“PåQŒè€Œå½“前的loggerçš„çñ”åˆ«äØ“QåQŒå½“且仅当在P>=Q的情况下åQŒæ—¥å¿—信息才能显½Cºã€?/span>


   
关于日志中çñ”别的关系为:DEBUG < INFO < WARN < ERROR < FATALã€?br />
    关于此规则的说明åQŒæœ‰ä»¥ä¸‹ä»£ç ä¸ºå®žä¾‹ï¼š   

// get a logger instance named "com.foo"

   Logger logger = Logger.getLogger("com.foo");

   // Now set its level. Normally you do not need to set the

   // level of a logger programmatically. This is usually done

   // in configuration files.

   logger.setLevel(Level.INFO);

   Logger barlogger = Logger.getLogger("com.foo.Bar");

   // This request is enabled, because WARN >= INFO.

  logger.warn("Low fuel level.");

   // This request is disabled, because DEBUG < INFO.

   logger.debug("Starting search for nearest gas station.");

   // The logger instance barlogger, named "com.foo.Bar",

   // will inherit its level from the logger named

   // "com.foo" Thus, the following request is enabled

   // because INFO >= INFO.

   barlogger.info("Located nearest gas station.");

   // This request is disabled, because DEBUG < INFO.

   barlogger.debug("Exiting gas station search");

Appenders与Layouts

Appender正如前面所˜qŽÍ¼Œæ˜¯ç”¨æ¥å®šä¹‰æ—¥å¿—信息的输出¾lˆç«¯åQŒæœ€è§‰çš„输出¾lˆç«¯æœ‰console与file了,另外˜q˜æœ‰å…¶å®ƒå¦‚GUI components, JMS, NT Event Loggers, remote socket servers½{‰ç­‰ã€?/span>

    Appender也有¾cÖM¼¼¾l§æ‰¿çš„原则,卛_½“前loggerçš„appender包括其它父类的appender。这样就会出çŽîC¸€ä¸ªlogger可能拥有多个appender了,在现实中看来åQŒå°±æ˜¯log4j的日志信息可以同˜q›è¾“出到console, file½{‰ç­‰¾lˆç«¯äº†ã€‚当ç„Óž¼Œä¸ÞZº†ä¸ä‹Éæ­¤appender恶性叠加,可以通过讄¡½®additivity标志来阻止ç‘ôæ‰Ñ€?/span>

    规则åQè‹¥å½“前logger为CåQŒåˆ™C拥有包括其自己及其父¾cÈš„æ‰€æœ‰appender。另外,若C的父logger为PåQŒä¸”Pçš„additivity标志已经讄¡½®æˆäØ“falseåQŒåˆ™C只拥有自己及Pçš„appender了,而P则只能拥有本íw«çš„appenderã€?/span>

    以下表格可以清晰说明此规则:
    
Logger
Name
Added
Appenders
Additivity
Flag
Output Targets Comment
root A1 not applicable A1 The root logger is anonymous but can be accessed with the Logger.getRootLogger() method. There is no default appender attached to root.
x A-x1, A-x2 true A1, A-x1, A-x2 Appenders of "x" and root.
x.y none true A1, A-x1, A-x2 Appenders of "x" and root.
x.y.z A-xyz1 true A1, A-x1, A-x2, A-xyz1 Appenders in "x.y.z", "x" and root.
security A-sec false A-sec No appender accumulation since the additivity flag is set to false.
security.access none true A-sec Only appenders of "security" because the additivity flag in "security" is set to false.
    
    
    å¯¹äºŽlayoutåQŒä¹Ÿæ­£å¦‚前面所˜qŽÍ¼Œæ˜¯ç”¨æ¥å®šä¹‰æ—¥å¿—信息的输出格式åQŒå®ƒçš„与C语言ä¸?/span>printf函数的格式定义基本相ä¼û|¼Œæœ¬äh对printf中的格式参数不太熟悉åQŒæ€ÀL„Ÿè§‰æœ‰äº›å¤æ‚,一般是òqÏx—¶çœ‹åˆ°è‡ªå·±è®¤äؓ有用的格式就è®îC¸€ä¸‹ï¼Œåˆ°æ—¶ç›´æŽ¥æ¬è¿‡æ¥ã€‚如

log4j.appender.R.layout.ConversionPattern=--->%-d{yyyy-MM-dd HH:mm:ss} [%5p]%l - %m%n

æ—Óž¼Œæ—¥å¿—信息格式为:

--->2008-07-11 01:13:40 [ INFO]com.test.Log4jTest.main(Log4jTest.java:27) - Exiting application.

    
    å¥½å•¦åQŒçŽ°åœ¨log4j的理论很肤浅地扯了一下,现在可以开始配¾|®äº†ã€?/span>

   é…ç½®åQ?/strong>   

    Log4j
的配¾|®å¯ä»¥é€šè¿‡åŠ è²Javaçš„properties配置文äšg或者XMLæ–‡äšg来完成ã€?br />

    Log4j默认的配¾|®äØ“åQŒé€šè¿‡è¯Õd–¾pȝ»Ÿå˜é‡log4j.configuration来找到配¾|®æ–‡ä»Óž¼Œå½“然变量的默认å€égØ“log4j.propertiesåQŒæ‰€ä»¥è‹¥æ²¡æœ‰è®„¡½®æ­¤ç³»¾lŸå˜é‡ï¼Œå¯ä»¥ç›´æŽ¥ž®†é…¾|®æ–‡ä»¶å‘½åäØ“log4j.propertiesåQŒç„¶åŽæ”¾åˆ°ç±»è·¯å¾„下即可。另外,若想引用通过其它配置文äšgåQŒåˆ™å¯ä»¥é€šè¿‡

    Loader.getResource(java.lang.String)来读取指定的配置文äšgã€?/span>

    其它åQ?/span>

    1. ç”׃ºŽæœ‰äº†log4j中的¾U§åˆ«¾l§æ‰¿æœºåˆ¶åQŒæ‰€ä»¥å¯ä»¥å¾ˆæ–¹ä¾¿åœ°è¿‡æ»¤ä¿¡æ¯äº†åQŒä¸ä»…可以很方便地限制日志的输出量,也可以同时将日志输出åˆîC¸åŒçš„¾lˆç«¯ã€?br />     å¦å¤–åQŒå› ä¸ºåœ¨javaæ–‡äšg中,文äšg的物理层‹Æ¡å…³¾pÖM¹Ÿæ˜¯ç›´æŽ¥é€šè¿‡“.”½W¦å·æ¥æŽ§åˆ¶çš„åQŒä¸”在很在程度上˜q™ä¸ªç‰©ç†å±‚次也决定了文äšg的逻辑层次åQŒæ‰€ä»¥æˆ‘们在当前文äšg中获取loggeræ—Óž¼Œå¯ä»¥ç›´æŽ¥é€šè¿‡å½“前文äšg的类名来获取åQŒå¦‚åQ?br />     
    static Logger logger = Logger.getLogger(MyApp.class);
    ˜q™æ ·åQŒåœ¨˜q‡æ×o消息时就很简单了åQŒç®€å•示例如下:
    åœ¨é…¾|®æ–‡ä»¶ä¸­æœ?br />     log4j.rootLogger=ERROR,stdout,R
    log4j.category.com.db=DEBUG
    log4j.category.com.i18n=INFO
    log4j.category.com.zyx=fatal

    é»˜è®¤çš„root logger的日志çñ”åˆ«äØ“ErroråQŒæ ¹æ®çñ”别关¾p»è¿™ä¸ªçñ”别也相当高了åQŒè¿™æ ·å¯ä»¥å‡ž®‘ç³»¾lŸä¸­æ—¥å¿—的输出量åQŒä½†æœ‰äº›åœ°æ–¹å¯èƒ½å¾—输出更详细信息åQŒå¦‚数据库部分,所以可以将com.db讄¡½®æˆäº†debug。另外,我在com.zyxä¸‹ï¼Œæˆ‘åªæƒ³çœ‹åˆ°ç±»åž‹äØ“fatal的日志,也可以如上所设ã€?/span>

 

    2. log4j.rootLogger=ERROR,stdout, ROLLING_FILE˜q™ä¸ªå®šä¹‰è¡?/span>½Cºroot logger的日志çñ”åˆ«äØ“ErroråQŒåŽé¢çš„stdout, ROLLING_FILE表示此root有二个appenderåQŒé€šå¸¸å¯ä»¥é€šè¿‡˜q™æ ·æ¥å®šä¹‰æ—¥å¿—可以同时向多个¾lˆç«¯è¾“出åQŒå› ä¸ºå­logger可以¾l§æ‰¿æ‰€æœ‰çˆ¶loggerçš„appender.

    å¦‚我可以通过以下定义ž®†æ—¥å¿—同时往console及file输出åQ?/span>

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=--->%-d{yyyy-MM-dd HH:mm:ss} [%5p]%l - %m%n

 

log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender

log4j.appender.ROLLING_FILE.File=myapp.log

log4j.appender.ROLLING_FILE.Append=true

log4j.appender.ROLLING_FILE.MaxFileSize=1024KB

log4j.appender.ROLLING_FILE.MaxBackupIndex=10

log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout

log4j.appender.ROLLING_FILE.layout.ConversionPattern==[slf5s.start]%d{DATE}[slf5s.DATE]%n"

   %p[slf5s.PRIORITY]%n%x[slf5s.NDC]%n%t[slf5s.THREAD]%n"

   %c[slf5s.CATEGORY]%n%l[slf5s.LOCATION]%n%m[slf5s.MESSAGE]%n%n

 

    马马虎虎æ€È»“了一下,但也èŠÞp´¹äº†äºŒä¸ªå¤šž®æ—¶åQŒå‘µå‘µï¼



]]>
Java正则表达式详è§?转蝲)http://www.aygfsteel.com/sy1214520/archive/2008/11/02/238172.htmlž®è™«æ—ºç¦ž®è™«æ—ºç¦Sun, 02 Nov 2008 06:26:00 GMThttp://www.aygfsteel.com/sy1214520/archive/2008/11/02/238172.htmlhttp://www.aygfsteel.com/sy1214520/comments/238172.htmlhttp://www.aygfsteel.com/sy1214520/archive/2008/11/02/238172.html#Feedback0http://www.aygfsteel.com/sy1214520/comments/commentRss/238172.htmlhttp://www.aygfsteel.com/sy1214520/services/trackbacks/238172.html 如果你曾¾lç”¨˜q‡Perl或ä“Q何其他内建正则表辑ּæ”¯æŒçš„语­a€åQŒä½ ä¸€å®šçŸ¥é“用正则表达式处理文本和匚w…æ¨¡å¼æ˜¯å¤šä¹ˆç®€å•。如果你不熟悉这个术语,那么“正则表达å¼?#8221;åQˆRegular ExpressionåQ‰å°±æ˜¯ä¸€ä¸ªå­—½W¦æž„成的ä¸ÔŒ¼Œå®ƒå®šä¹‰äº†ä¸€ä¸ªç”¨æ¥æœç´¢åŒ¹é…å­—½W¦ä¸²çš„æ¨¡å¼ã€?/td>
许多语言åQŒåŒ…括Perl、PHP、Python、JavaScriptå’ŒJScriptåQŒéƒ½æ”¯æŒç”¨æ­£åˆ™è¡¨è¾‘Ö¼å¤„理文本åQŒä¸€äº›æ–‡æœ¬ç¼–辑器用正则表辑ּå®žçŽ°é«˜çñ”“搜烦-替换”功能。那么Java又怎样呢?本文写作æ—Óž¼Œä¸€ä¸ªåŒ…含了用正则表辑ּ˜q›è¡Œæ–‡æœ¬å¤„理的Java规范需求(Specification RequeståQ‰å·²¾lå¾—到认可,你可以期待在JDK的下一版本中看到它ã€?/td>
然而,如果现在ž®±éœ€è¦ä‹É用正则表辑ּåQŒåˆè¯¥æ€Žä¹ˆåŠžå‘¢åQŸä½ å¯ä»¥ä»ŽApache.org下蝲源代码开攄¡š„Jakarta-ORO库。本文接下来的内容先½Ž€è¦åœ°ä»‹ç»æ­£åˆ™è¡¨è¾¾å¼çš„入门知识åQŒç„¶åŽä»¥Jakarta-ORO APIä¸ÞZ¾‹ä»‹ç»å¦‚何使用正则表达式ã€?/td>
一、正则表辑ּåŸºç¡€çŸ¥è¯†
我们先从½Ž€å•的开始。假设你要搜索一个包含字½W?#8220;cat”的字½W¦ä¸²åQŒæœç´¢ç”¨çš„æ­£åˆ™è¡¨è¾‘Ö¼ž®±æ˜¯“cat”。如果搜索对大小写不敏感åQŒå•è¯?#8220;catalog”ã€?#8220;Catherine”ã€?#8220;sophisticated”都可以匹配。也ž®±æ˜¯è¯ß_¼š
1.1 句点½W¦å·
假设你在玩英文拼字游戏,惌™¦æ‰‘Ö‡ºä¸‰ä¸ªå­—母的单词,而且˜q™äº›å•词必须ä»?#8220;t”字母开å¤ß_¼Œä»?#8220;n”字母¾l“束。另外,假设有一本英文字典,你可以用正则表达式搜索它的全部内宏V€‚要构造出˜q™ä¸ªæ­£åˆ™è¡¨è¾¾å¼ï¼Œä½ å¯ä»¥ä‹É用一个通配½W¦â€”—句点符å?#8220;.”ã€‚è¿™æ øP¼Œå®Œæ•´çš„表辑ּž®±æ˜¯“t.n”åQŒå®ƒåŒšw…“tan”ã€?#8220;ten”ã€?#8220;tin”å’?#8220;ton”åQŒè¿˜åŒšw…“t#n”ã€?#8220;tpn”甚至“t n”åQŒè¿˜æœ‰å…¶ä»–许多无意义的组合。这是因为句点符号匹配所有字½W¦ï¼ŒåŒ…括½Iºæ ¼ã€Tab字符甚至换行½W¦ï¼š
1.2 æ–ÒŽ‹¬åïL¬¦å?/strong>
ä¸ÞZº†è§£å†³å¥ç‚¹½W¦å·åŒšw…èŒƒå›´˜q‡äºŽòq¿æ³›˜q™ä¸€é—®é¢˜åQŒä½ å¯ä»¥åœ¨æ–¹æ‹¬å·åQ?#8220;[]”åQ‰é‡Œé¢æŒ‡å®šçœ‹æ¥æœ‰æ„ä¹‰çš„å­—½W¦ã€‚æ­¤æ—Óž¼Œåªæœ‰æ–ÒŽ‹¬å·é‡Œé¢æŒ‡å®šçš„字符才参与匹配。也ž®±æ˜¯è¯ß_¼Œæ­£åˆ™è¡¨è¾¾å¼?#8220;t[aeio]n”只匹é…?#8220;tan”ã€?#8220;Ten”ã€?#8220;tin”å’?#8220;ton”。但“Toon”ä¸åŒ¹é…ï¼Œå› äØ“åœ¨æ–¹æ‹¬å·ä¹‹å†…ä½ åªèƒ½åŒ¹é…å•ä¸ªå­—½W¦ï¼š
1.3 “æˆ?#8221;½W¦å·
如果除了上面匚w…çš„æ‰€æœ‰å•词之外,你还惌™¦åŒšw…“toon”åQŒé‚£ä¹ˆï¼Œä½ å¯ä»¥ä‹Éç”?#8220;|”操作½W¦ã€?#8220;|”操作½W¦çš„基本意义ž®±æ˜¯“æˆ?#8221;˜qç®—。要匚w…“toon”åQŒä‹Éç”?#8220;t(a|e|i|o|oo)n”正则表达式。这里不能ä‹É用方扩号åQŒå› ä¸ºæ–¹æ‹¬å·åªå…è®¸åŒ¹é…å•个字½W¦ï¼›˜q™é‡Œå¿…须使用圆括å?#8220;()”。圆括号˜q˜å¯ä»¥ç”¨æ¥åˆ†¾l„,具体请参见后面介¾lã€?/td>
1.4 表示匚w…‹Æ¡æ•°çš„符å?/strong>
表一昄¡¤ºäº†è¡¨½CºåŒ¹é…æ¬¡æ•°çš„½W¦å·åQŒè¿™äº›ç¬¦åïL”¨æ¥ç¡®å®šç´§é è¯¥½W¦å·å·¦è¾¹çš„符号出现的‹Æ¡æ•°åQ?/td>

假设我们要在文本文äšg中搜索美国的½C¾ä¼šå®‰å…¨åïL ã€‚这个号码的格式æ˜?99-99-9999。用来匹配它的正则表辑ּå¦‚图一所½Cºã€‚在正则表达式中åQŒè¿žå­—符åQ?#8220;-”åQ‰æœ‰ç€ç‰ÒŽ®Šçš„æ„ä¹‰ï¼Œå®ƒè¡¨½CÞZ¸€ä¸ªèŒƒå›ß_¼Œæ¯”如ä»?åˆ?。因此,匚w…½C¾ä¼šå®‰å…¨åïL ä¸­çš„˜qžå­—½W¦å·æ—Óž¼Œå®ƒçš„前面要加上一个è{义字½W?#8220;\”ã€?/td>

图一åQšåŒ¹é…æ‰€æœ?23-12-1234形式的社会安全号ç ?/p>

假设˜q›è¡Œæœçƒ¦çš„æ—¶å€™ï¼Œä½ å¸Œæœ›è¿žå­—符号可以出玎ͼŒä¹Ÿå¯ä»¥ä¸å‡ºçŽ°â€”â€”å³åQ?99-99-9999å’?99999999都属于正¼‹®çš„æ ¼å¼ã€‚è¿™æ—Óž¼Œä½ å¯ä»¥åœ¨˜qžå­—½W¦å·åŽé¢åŠ ä¸Š“åQ?#8221;数量限定½W¦å·åQŒå¦‚图二所½Cºï¼š

图二åQšåŒ¹é…æ‰€æœ?23-12-1234å’?23121234形式的社会安全号ç ?/p>

下面我们再来看另外一个例子。美国汽车牌照的一¿Uæ ¼å¼æ˜¯å››ä¸ªæ•°å­—加上二个字母。它的正则表辑ּå‰é¢æ˜¯æ•°å­—部åˆ?#8220;[0-9]{4}”åQŒå†åŠ ä¸Šå­—æ¯éƒ¨åˆ†“[A-Z]{2}”。图三显½CÞZº†å®Œæ•´çš„æ­£åˆ™è¡¨è¾‘Ö¼ã€?/td>

图三åQšåŒ¹é…å…¸åž‹çš„¾ŸŽå›½æ±½èžR牌照åïL åQŒå¦‚8836KV

1.5 “å?#8221;½W¦å·
“^”½W¦å·¿UîCØ““å?#8221;½W¦å·ã€‚如果用在方括号内,“^”表示不想要匹配的字符。例如,囑֛›çš„æ­£åˆ™è¡¨è¾‘Ö¼åŒšw…æ‰€æœ‰å•词,但以“X”字母开头的单词除外ã€?/td>

囑֛›åQšåŒ¹é…æ‰€æœ‰å•词,ä½?#8220;X”开头的除外

1.6 圆括号和½Iºç™½½W¦å·
假设要从格式ä¸?#8220;June 26, 1951”的生日日期中提取出月份部分,用来匚w…è¯¥æ—¥æœŸçš„æ­£åˆ™è¡¨è¾¾å¼å¯ä»¥å¦‚图五所½Cºï¼š

图五åQšåŒ¹é…æ‰€æœ‰Moth DD,YYYY格式的日æœ?/p>

新出现的“\s”½W¦å·æ˜¯ç©ºç™½ç¬¦åøP¼ŒåŒšw…æ‰€æœ‰çš„½Iºç™½å­—符åQŒåŒ…括Tab字符。如果字½W¦ä¸²æ­£ç¡®åŒšw…åQŒæŽ¥ä¸‹æ¥å¦‚何提取出月份部分呢åQŸåªéœ€åœ¨æœˆä»½å‘¨å›´åŠ ä¸Šä¸€ä¸ªåœ†æ‹¬å·åˆ›å¾ä¸€ä¸ªç»„åQŒç„¶åŽç”¨ORO APIåQˆæœ¬æ–‡åŽé¢è¯¦¾l†è®¨è®ºï¼‰æå–出它的倹{€‚修改后的正则表辑ּå¦‚图六所½Cºï¼š

囑օ­åQšåŒ¹é…æ‰€æœ‰Month DD,YYYY格式的日期,定义月䆾å€égØ“½W¬ä¸€ä¸ªç»„

1.7 其它½W¦å·
为简便è“v见,你可以ä‹Éç”¨ä¸€äº›äØ“å¸¸è§æ­£åˆ™è¡¨è¾¾å¼åˆ›å»ºçš„å¿«æ·½W¦å·ã€‚如表二所½Cºï¼š
表二åQšå¸¸ç”¨ç¬¦å?/td>

例如åQŒåœ¨å‰é¢½C¾ä¼šå®‰å…¨åïL çš„例子中åQŒæ‰€æœ‰å‡ºçŽ?#8220;[0-9]”的地æ–ÒŽˆ‘们都可以使用“\d”。修改后的正则表辑ּå¦‚图七所½Cºï¼š

图七åQšåŒ¹é…æ‰€æœ?23-12-1234格式的社会安全号ç ?/p>

二、Jakarta-ORO�/font>
有许多源代码开攄¡š„正则表达式库可供Java½E‹åºå‘˜ä‹É用,而且它们中的许多支持Perl 5兼容的正则表辑ּè¯­æ³•。我在这里选用的是Jakarta-ORO正则表达式库åQŒå®ƒæ˜¯æœ€å…¨é¢çš„æ­£åˆ™è¡¨è¾‘Ö¼API之一åQŒè€Œä¸”它与Perl 5正则表达式完全兼宏V€‚另外,它也是优化得最好的API之一ã€?/td>
Jakarta-ORO库以前叫做OROMatcheråQŒDaniel Savarese大方地把它赠送给了Jakarta Project。你可以按照本文最后参考资源的说明下蝲它ã€?/td>
我首先将½Ž€è¦ä»‹¾lä‹É用Jakarta-ORO库时你必™åÕdˆ›å»ºå’Œè®‰K—®çš„对象,然后介绍如何使用Jakarta-ORO APIã€?/td>
�PatternCompiler对象
首先åQŒåˆ›å»ÞZ¸€ä¸ªPerl5Compiler¾cȝš„实例åQŒåƈ把它赋值给PatternCompiler接口对象。Perl5Compiler是PatternCompiler接口的一个实玎ͼŒå…è®¸ä½ æŠŠæ­£åˆ™è¡¨è¾¾å¼ç¼–译成用来匚w…çš„Pattern对象ã€?/td>
�Pattern对象
要把正则表达式编译成Pattern对象åQŒè°ƒç”¨compiler对象的compile()æ–ÒŽ³•åQŒåƈ在调用参æ•îC¸­æŒ‡å®šæ­£åˆ™è¡¨è¾¾å¼ã€‚例如,你可以按照下面这¿Uæ–¹å¼ç¼–译正则表辑ּ“t[aeio]n”åQ?/td>
默认情况下,¾~–译器创å»ÞZ¸€ä¸ªå¤§ž®å†™æ•æ„Ÿçš„æ¨¡å¼ï¼ˆpatternåQ‰ã€‚因此,上面代码¾~–译得到的模式只匚w…“tin”ã€?#8220;tan”ã€?“ten”å’?#8220;ton”åQŒä½†ä¸åŒ¹é…?#8220;Tin”å’?#8220;taN”。要创徏一个大ž®å†™ä¸æ•æ„Ÿçš„æ¨¡å¼åQŒä½ åº”该在调用编译器的时候指定一个额外的参数åQ?/td>
创徏好Pattern对象之后åQŒä½ ž®±å¯ä»¥é€šè¿‡PatternMatcher¾cȝ”¨è¯¥Pattern对象˜q›è¡Œæ¨¡å¼åŒšw…ã€?/td>
�PatternMatcher对象
PatternMatcher对象æ ÒŽ®Pattern对象和字½W¦ä¸²˜q›è¡ŒåŒšw…‹‚€æŸ¥ã€‚你要实例化一个Perl5Matcher¾cÕdƈ把结果赋值给PatternMatcher接口。Perl5Matcher¾cÀL˜¯PatternMatcher接口的一个实玎ͼŒå®ƒæ ¹æ®Perl 5正则表达式语法进行模式匹配:
使用PatternMatcher对象åQŒä½ å¯ä»¥ç”¨å¤šä¸ªæ–¹æ³•进行匹配操作,˜q™äº›æ–ÒŽ³•的第一个参数都是需要根据正则表辑ּ˜q›è¡ŒåŒšw…çš„å­—½W¦ä¸²åQ?/td>
· boolean matches(String input, Pattern pattern)åQšå½“输入字符串和正则表达式要¾_„¡¡®åŒšw…æ—¶ä‹É用。换句话è¯ß_¼Œæ­£åˆ™è¡¨è¾¾å¼å¿…™åÕd®Œæ•´åœ°æè¿°è¾“入字符丌Ӏ?/td>
· boolean matchesPrefix(String input, Pattern pattern)åQšå½“正则表达式匹配输入字½W¦ä¸²èµ·å§‹éƒ¨åˆ†æ—¶ä‹É用ã€?/td>
· boolean contains(String input, Pattern pattern)åQšå½“正则表达式要匚w…è¾“入字符串的一部分时ä‹É用(卻I¼Œå®ƒå¿…™åÀL˜¯ä¸€ä¸ªå­ä¸ÔŒ¼‰ã€?/td>
另外åQŒåœ¨ä¸Šé¢ä¸‰ä¸ªæ–ÒŽ³•调用中,你还可以用PatternMatcherInputå¯¹è±¡ä½œäØ“å‚æ•°æ›¿ä»£String对象åQ›è¿™æ—Óž¼Œä½ å¯ä»¥ä»Žå­—符串中最后一‹Æ¡åŒ¹é…çš„位置开始ç‘ô¾l­è¿›è¡ŒåŒ¹é…ã€‚当字符串可能有多个子串匚w…¾l™å®šçš„æ­£åˆ™è¡¨è¾‘Ö¼æ—Óž¼Œç”¨PatternMatcherInputå¯¹è±¡ä½œäØ“å‚æ•°ž®±å¾ˆæœ‰ç”¨äº†ã€‚用PatternMatcherInputå¯¹è±¡ä½œäØ“å‚æ•°æ›¿ä»£Stringæ—Óž¼Œä¸Šè¿°ä¸‰ä¸ªæ–ÒŽ³•的语法如下:
· boolean matches(PatternMatcherInput input, Pattern pattern)
· boolean matchesPrefix(PatternMatcherInput input, Pattern pattern)
· boolean contains(PatternMatcherInput input, Pattern pattern)

 
三、应用实�/font>
下面我们来看看Jakarta-ORO库的一些应用实例�/td>
3.1 日志文äšg处理
ä»ÕdŠ¡åQšåˆ†æžä¸€ä¸ªWeb服务器日志文ä»Óž¼Œ¼‹®å®šæ¯ä¸€ä¸ªç”¨æˆ¯‚Š±åœ¨ç½‘ç«™ä¸Šçš„æ—¶é—´ã€‚åœ¨å…¸åž‹çš„BEA WebLogic日志文äšg中,日志记录的格式如下:
分析˜q™ä¸ªæ—¥å¿—记录åQŒå¯ä»¥å‘玎ͼŒè¦ä»Ž˜q™ä¸ªæ—¥å¿—æ–‡äšg提取的内å®ÒŽœ‰ä¸¤é¡¹åQšIP地址和页面访问时间。你可以用分¾l„ç¬¦åøP¼ˆåœ†æ‹¬åøP¼‰ä»Žæ—¥å¿—记录提取出IP地址和时间标记ã€?/td>
首先我们来看看IP地址。IP地址æœ?个字节构成,每一个字节的值在0åˆ?55之间åQŒå„个字节通过一个句点分隔。因此,IP地址中的每一个字节有臛_°‘一个、最多三个数字。图八显½CÞZº†ä¸ºIP地址¾~–写的正则表辑ּåQ?/td>

囑օ«åQšåŒ¹é…IP地址

IP地址中的句点字符必须˜q›è¡Œè½¬ä¹‰å¤„理åQˆå‰é¢åŠ ä¸?#8220;\”åQ‰ï¼Œå› äØ“IP地址中的句点å…ähœ‰å®ƒæœ¬æ¥çš„含义åQŒè€Œä¸æ˜¯é‡‡ç”¨æ­£åˆ™è¡¨è¾‘Ö¼è¯­æ³•中的ç‰ÒŽ®Šå«ä¹‰ã€‚句点在正则表达式中的特ŒDŠå«ä¹‰æœ¬æ–‡å‰é¢å·²¾lä»‹¾lã€?/td>
日志记录的时间部分由一å¯ÒŽ–¹æ‹¬å·åŒ…围。你可以按照如下思èµ\提取出方括号里面的所有内容:首先搜烦起始æ–ÒŽ‹¬å·å­—½W¦ï¼ˆ“[”åQ‰ï¼Œæå–出所有不­‘…过¾l“束æ–ÒŽ‹¬å·å­—½W¦ï¼ˆ“]”åQ‰çš„内容åQŒå‘前寻扄¡›´è‡Ïx‰¾åˆ°ç»“束方括号字符。图九显½CÞZº†˜q™éƒ¨åˆ†çš„æ­£åˆ™è¡¨è¾¾å¼ã€?/td>

图九åQšåŒ¹é…è‡³ž®‘一个字½W¦ï¼Œç›´è‡³æ‰‘Öˆ°“]”

现在åQŒæŠŠä¸Šè¿°ä¸¤ä¸ªæ­£åˆ™è¡¨è¾¾å¼åŠ ä¸Šåˆ†¾l„ç¬¦åøP¼ˆåœ†æ‹¬åøP¼‰åŽåˆòq¶æˆå•个表达式,˜q™æ ·ž®±å¯ä»¥ä»Žæ—¥å¿—记录提取出IP地址和时间。注意,ä¸ÞZº†åŒšw…“- -”åQˆä½†ä¸æå–它åQ‰ï¼Œæ­£åˆ™è¡¨è¾¾å¼ä¸­é—´åŠ å…¥äº†“\s-\s-\s”。完整的正则表达式如囑֍æ‰€½Cºã€?/td>

囑֍åQšåŒ¹é…IP地址和时间标è®?/p>

现在正则表达式已¾lç¼–写完毕,接下来可以编写ä‹É用正则表辑ּåº“çš„Java代码了ã€?/td>
ä¸ÞZ‹É用Jakarta-ORO库,首先创徏正则表达式字½W¦ä¸²å’Œå¾…分析的日志记录字½W¦ä¸²åQ?/td>
˜q™é‡Œä½¿ç”¨çš„æ­£åˆ™è¡¨è¾‘Ö¼ä¸Žå›¾åçš„æ­£åˆ™è¡¨è¾¾å¼å·®ä¸å¤šå®Œå…¨ç›¸åŒåQŒä½†æœ‰ä¸€ç‚¹ä¾‹å¤–:在Java中,你必™åÕd¯¹æ¯ä¸€ä¸ªå‘前的斜杠åQ?#8220;\”åQ‰è¿›è¡Œè{义处理。图十不是Java的表½CºåŞ式,所以我们要在每ä¸?#8220;\”前面加上一ä¸?#8220;\”以免出现¾~–译错误。遗憄¡š„是,转义处理˜q‡ç¨‹å¾ˆå®¹æ˜“出现错误,所以应该小心è°}慎。你可以首先输入未经转义处理的正则表辑ּåQŒç„¶åŽä»Žå·¦åˆ°å³ä¾‹Æ¡æŠŠæ¯ä¸€ä¸?#8220;\”替换æˆ?#8220;\\”。如果要复检åQŒä½ å¯ä»¥è¯•着把它输出到屏òq•上ã€?/td>
初始化字½W¦ä¸²ä¹‹åŽåQŒå®žä¾‹åŒ–PatternCompiler对象åQŒç”¨PatternCompiler¾~–译正则表达式创å»ÞZ¸€ä¸ªPattern对象åQ?/td>
现在åQŒåˆ›å»ºPatternMatcher对象åQŒè°ƒç”¨PatternMatcher接口的contain()æ–ÒŽ³•‹‚€æŸ¥åŒ¹é…æƒ…况:
接下来,利用PatternMatcher接口˜q”回的MatchResult对象åQŒè¾“出匹配的¾l„。由于logEntry字符串包含匹配的内容åQŒä½ å¯ä»¥çœ‹åˆ°¾cÕd¦‚下面的输出:
3.2 HTML处理实例一
下面一个ä“Q务是分析HTML™åµé¢å†…FONT标记的所有属性。HTML™åµé¢å†…典型的FONT标记如下所½Cºï¼š
½E‹åºž®†æŒ‰ç…§å¦‚下åŞ式,输出每一个FONT标记的属性:
在这¿Uæƒ…况下åQŒæˆ‘廸™®®ä½ ä‹É用两个正则表辑ּã€‚第一个如囑֍ä¸€æ‰€½Cºï¼Œå®ƒä»Žå­—体标记提取å‡?#8220;"face="Arial, Serif" size="+2" color="red"”ã€?/td>

囑֍ä¸€åQšåŒ¹é…FONT标记的所有属æ€?/p>

½W¬äºŒä¸ªæ­£åˆ™è¡¨è¾‘Ö¼å¦‚图十二所½Cºï¼Œå®ƒæŠŠå„个属性分割成名字-值对ã€?/td>

囑֍äºŒï¼šåŒšw…å•个属性,òq¶æŠŠå®ƒåˆ†å‰²æˆåå­—-值对

分割¾l“果为:
现在我们来看看完成这个ä“Q务的Java代码。首先创å»ÞZ¸¤ä¸ªæ­£åˆ™è¡¨è¾‘Ö¼å­—符ä¸ÔŒ¼Œç”¨Perl5Compiler把它们编译成Pattern对象。编译正则表辑ּçš„æ—¶å€™ï¼ŒæŒ‡å®šPerl5Compiler.CASE_INSENSITIVE_MASK选项åQŒä‹É得匹配操作不区分大小写ã€?/td>
接下来,创徏一个执行匹配操作的Perl5Matcher对象�/td>
假设有一个String¾cÕdž‹çš„变量htmlåQŒå®ƒä»£è¡¨äº†HTMLæ–‡äšg中的一行内宏V€‚如果html字符串包含FONT标记åQŒåŒ¹é…å™¨ž®†è¿”回true。此æ—Óž¼Œä½ å¯ä»¥ç”¨åŒšw…å™¨å¯¹è±¡è¿”回的MatchResult对象获得½W¬ä¸€ä¸ªç»„åQŒå®ƒåŒ…含了FONT的所有属性:
接下来创å»ÞZ¸€ä¸ªPatternMatcherInputå¯¹è±¡ã€‚è¿™ä¸ªå¯¹è±¡å…è®æ€½ ä»Žæœ€åŽä¸€‹Æ¡åŒ¹é…çš„位置开始ç‘ô¾l­è¿›è¡ŒåŒ¹é…æ“ä½œï¼Œå› æ­¤åQŒå®ƒå¾ˆé€‚合于提取FONT标记内属性的名字-值对。创建PatternMatcherInput对象åQŒä»¥å‚数形式传入待匹配的字符丌Ӏ‚然后,用匹配器实例提取出每一个FONT的属性。这通过指定PatternMatcherInput对象åQˆè€Œä¸æ˜¯å­—½W¦ä¸²å¯¹è±¡åQ‰äؓ参数åQŒåå¤åœ°è°ƒç”¨PatternMatcher对象的contains()æ–ÒŽ³•完成。PatternMatcherInput对象之中的每一‹Æ¡è„P代将把它内部的指针向前移动,下一‹Æ¡æ£€‹¹‹å°†ä»Žå‰ä¸€‹Æ¡åŒ¹é…ä½¾|®çš„后面开始ã€?/td>
本例的输出结果如下:
3.3 HTML处理实例�/strong>
下面我们来看看另一个处理HTML的例子。这一‹Æ¡ï¼Œæˆ‘们假定Web服务器从widgets.acme.com¿UÕdˆ°äº†newserver.acme.com。现在你要修改一些页面中的链接:
执行˜q™ä¸ªæœçƒ¦çš„æ­£åˆ™è¡¨è¾‘Ö¼å¦‚图十三所½Cºï¼š

囑֍ä¸‰ï¼šåŒšw…ä¿®æ”¹å‰çš„链接

如果能够匚w…˜q™ä¸ªæ­£åˆ™è¡¨è¾¾å¼ï¼Œä½ å¯ä»¥ç”¨ä¸‹é¢çš„内å®ÒŽ›¿æ¢å›¾åä¸‰çš„链接:
注意#字符的后面加上了$1。Perl正则表达式语法用$1ã€?2½{‰è¡¨½Cºå·²¾låŒ¹é…ä¸”提取出来的组。图十三的表辑ּæŠŠæ‰€æœ‰ä½œä¸ÞZ¸€ä¸ªç»„匚w…å’Œæå–出来的内容附加到链接的后面ã€?/td>
现在åQŒè¿”回Java。就象前面我们所做的那样åQŒä½ å¿…须创徏‹¹‹è¯•字符ä¸ÔŒ¼Œåˆ›å¾æŠŠæ­£åˆ™è¡¨è¾‘Ö¼¾~–译到Pattern对象所必需的对象,以及创徏一个PatternMatcher对象åQ?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" />
接下来,用com.oroinc.text.regex包Util¾cȝš„substitute()静态方法进行替换,输出¾l“果字符ä¸ÔŒ¼š
Util.substitute()æ–ÒŽ³•的语法如下:
˜q™ä¸ªè°ƒç”¨çš„前两个参数是以前创建的PatternMatcherå’ŒPattern对象。第三个参数是一个Substiution对象åQŒå®ƒå†›_®šäº†æ›¿æ¢æ“ä½œå¦‚何进行。本例ä‹É用的是Perl5Substitution对象åQŒå®ƒèƒ½å¤Ÿ˜q›è¡ŒPerl5风格的替换。第四个参数是想要进行替换操作的字符ä¸ÔŒ¼Œæœ€åŽä¸€ä¸ªå‚数允许指定是否替换模式的所有匹配子ä¸ÔŒ¼ˆUtil.SUBSTITUTE_ALLåQ‰ï¼Œæˆ–只替换指定的次数ã€?/td>
【结束语ã€?/strong>在这½‹‡æ–‡ç« ä¸­åQŒæˆ‘ä¸ÞZ½ ä»‹ç»äº†æ­£åˆ™è¡¨è¾‘Ö¼çš„强大功能。只要正¼‹®è¿ç”¨ï¼Œæ­£åˆ™è¡¨è¾¾å¼èƒ½å¤Ÿåœ¨å­—符串提取和文本修改中è“v到很大的作用。另外,我还介绍了如何在Java½E‹åºä¸­é€šè¿‡Jakarta-ORO库利用正则表辑ּã€‚至于最¾lˆé‡‡ç”¨è€å¼çš„å­—½W¦ä¸²å¤„理方式åQˆä‹É用StringTokenizeråQŒcharAtåQŒå’ŒsubstringåQ‰ï¼Œ˜q˜æ˜¯é‡‡ç”¨æ­£åˆ™è¡¨è¾¾å¼ï¼Œ˜q™å°±æœ‰å¾…你自己决定了ã€?/td>



]]>
常用java date æ–ÒŽ³•集合http://www.aygfsteel.com/sy1214520/archive/2008/11/02/238171.htmlž®è™«æ—ºç¦ž®è™«æ—ºç¦Sun, 02 Nov 2008 06:23:00 GMThttp://www.aygfsteel.com/sy1214520/archive/2008/11/02/238171.htmlhttp://www.aygfsteel.com/sy1214520/comments/238171.htmlhttp://www.aygfsteel.com/sy1214520/archive/2008/11/02/238171.html#Feedback0http://www.aygfsteel.com/sy1214520/comments/commentRss/238171.htmlhttp://www.aygfsteel.com/sy1214520/services/trackbacks/238171.html计算某一月䆾的最大天æ•?br />
Calendar time=Calendar.getInstance();
time.clear();
time.set(Calendar.YEAR,year); //year �int
time.set(Calendar.MONTH,i-1);//注意,Calendarå¯¹è±¡é»˜è®¤ä¸€æœˆäØ“0          
int day=time.getActualMaximum(Calendar.DAY_OF_MONTH);//本月份的天数
注:在ä‹É用setæ–ÒŽ³•之前åQŒå¿…™åÕd…ˆclear一下,否则很多信息会ç‘ô承自¾pȝ»Ÿå½“前旉™—´

2.Calendarå’ŒDateçš„è{åŒ?br />
(1) Calendar转化为Date
Calendar cal=Calendar.getInstance();
Date date=cal.getTime();

(2) Date转化为Calendar
Date date=new Date();
Calendar cal=Calendar.getInstance();
cal.setTime(date);

3.格式化输出日期时é—?åQˆè¿™ä¸ªç”¨çš„æ¯”较多åQ?br />
Date date=new Date();
SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String time=df.format(date);
System.out.println(time);

4.计算一òq´ä¸­çš„第几星æœ?br />
(1)计算某一天是一òq´ä¸­çš„第几星æœ?br /> Calendar cal=Calendar.getInstance();
cal.set(Calendar.YEAR, 2006);
cal.set(Calendar.MONTH, 8);
cal.set(Calendar.DAY_OF_MONTH, 3);
int weekno=cal.get(Calendar.WEEK_OF_YEAR);

(2)计算一òq´ä¸­çš„第几星期是几号
SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");
Calendar cal=Calendar.getInstance();
cal.set(Calendar.YEAR, 2006);
cal.set(Calendar.WEEK_OF_YEAR, 1);
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.println(df.format(cal.getTime()));
输出:
2006-01-02

5.add()和roll()的用�不太常用)

(1)add()æ–ÒŽ³•
SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");
Calendar cal=Calendar.getInstance();
cal.set(Calendar.YEAR, 2006);
cal.set(Calendar.MONTH, 8);
cal.set(Calendar.DAY_OF_MONTH, 3);
cal.add(Calendar.DATE, -4);
Date date=cal.getTime();
System.out.println(df.format(date));
cal.add(Calendar.DATE, 4);
date=cal.getTime();
System.out.println(df.format(date));
输出åQ?br />     2006-08-30
    2006-09-03
(2)rollæ–ÒŽ³•
cal.set(Calendar.YEAR, 2006);
cal.set(Calendar.MONTH, 8);
cal.set(Calendar.DAY_OF_MONTH, 3);
cal.roll(Calendar.DATE, -4);
date=cal.getTime();
System.out.println(df.format(date));
cal.roll(Calendar.DATE, 4);
date=cal.getTime();
System.out.println(df.format(date));
输出åQ?br />     2006-09-29
    2006-09-03
可见åQŒroll()æ–ÒŽ³•在本月内循环åQŒä¸€èˆ¬ä‹É用add()æ–ÒŽ³•åQ?br />
6.计算两个ä»ÀL„æ—‰™—´ä¸­é—´çš„间隔天敎ͼˆ˜q™ä¸ªæ¯”较常用åQ?br /> (1)ä¼ è¿›Calendar对象
    public int getIntervalDays(Calendar startday,Calendar endday)...{      
        if(startday.after(endday))...{
            Calendar cal=startday;
            startday=endday;
            endday=cal;
        }   
        long sl=startday.getTimeInMillis();
        long el=endday.getTimeInMillis();
      
        long ei=el-sl;          
        return (int)(ei/(1000*60*60*24));
    }
(2)传进Date对象

    public int getIntervalDays(Date startday,Date endday)...{       
        if(startday.after(endday))...{
            Date cal=startday;
            startday=endday;
            endday=cal;
        }       
        long sl=startday.getTime();
        long el=endday.getTime();      
        long ei=el-sl;          
        return (int)(ei/(1000*60*60*24));
    }
(3)改进¾_„¡¡®è®¡ç®—ç›”Rš”天数的方æ³?br />     public int getDaysBetween (Calendar d1, Calendar d2) ...{
        if (d1.after(d2)) ...{
            java.util.Calendar swap = d1;
            d1 = d2;
            d2 = swap;
        }
        int days = d2.get(Calendar.DAY_OF_YEAR) - d1.get(Calendar.DAY_OF_YEAR);
        int y2 = d2.get(Calendar.YEAR);
        if (d1.get(Calendar.YEAR) != y2) ...{
            d1 = (Calendar) d1.clone();
            do ...{
                days += d1.getActualMaximum(Calendar.DAY_OF_YEAR);//得到当年的实际天æ•?br />                 d1.add(Calendar.YEAR, 1);
            } while (d1.get(Calendar.YEAR) != y2);
        }
        return days;
    }
注意åQšé€šè¿‡ä¸Šé¢çš„æ–¹æ³•可以衍生出求ä“Q何时é—ß_¼Œå¦‚要查出邮箱三周之内收到的邮ä»Óž¼ˆå¾—到当前¾pȝ»Ÿæ—‰™—´åQå†å¾—到三周前时é—ß_¼‰ç”¨æ”¶ä»¶çš„æ—‰™—´åŽÕdŒ¹é…?最好装化成 longåŽÀL¯”è¾?br /> 如:1òq´å‰æ—¥æœŸåQˆæ³¨æ„æ¯«¿U’的转换åQ?br />    java.util.Date myDate=new java.util.Date();
   long myTime=(myDate.getTime()/1000)-60*60*24*365;
   myDate.setTime(myTime*1000);
   String mDate=formatter.format(myDate);

7. String å’?Date åQŒLong ä¹‹é—´ç›æ€º’转换 åQˆæœ€å¸¸ç”¨åQ?br />
字符串è{化成旉™—´¾cÕdž‹åQˆå­—½W¦ä¸²å¯ä»¥æ˜¯ä“Q意类型,只要和SimpleDateFormat中的格式一致即可)
通常我们取时间跨度的时候,会substring出具体时é—ß_¼åQlongåQæ¯”è¾?br />
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("M/dd/yyyy hh:mm:ss a",java.util.Locale.US);
java.util.Date d = sdf.parse("5/13/2003 10:31:37 AM");
long dvalue=d.getTime();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String mDateTime1=formatter.format(d);

8. 通过旉™—´æ±‚æ—¶é—?br />
òq´æœˆå‘¨æ±‚日期
SimpleDateFormat formatter2 = new SimpleDateFormat("yyyy-MM F E");
java.util.Date date2= formatter2.parse("2003-05 5 星期�);
SimpleDateFormat formatter3 = new SimpleDateFormat("yyyy-MM-dd");
String mydate2=formatter3.format(date2);

求是星期�br /> mydate= myFormatter.parse("2001-1-1");
SimpleDateFormat formatter4 = new SimpleDateFormat("E");
String mydate3=formatter4.format(mydate);

9. java å’?具体的数据库¾l“合

在开发web应用中,针对不同的数据库日期¾cÕdž‹åQŒæˆ‘们需要在我们的程序中å¯ÒŽ—¥æœŸç±»åž‹åšå„种不同的è{换。若对应数据库数据是oracleçš„Date¾cÕdž‹åQŒå³åªéœ€è¦å¹´æœˆæ—¥çš„,可以选择使用java.sql.Date¾cÕdž‹åQŒè‹¥å¯¹åº”的是MSsqlserver 数据库的DateTime¾cÕdž‹åQŒå³éœ€è¦å¹´æœˆæ—¥æ—¶åˆ†¿U’çš„åQŒé€‰æ‹©java.sql.Timestamp¾cÕdž‹
你可以ä‹É用dateFormat定义旉™—´æ—¥æœŸçš„æ ¼å¼ï¼Œè½¬ä¸€ä¸ªå­—½W¦ä¸²å›_¯

class Datetest{
*method ž®†å­—½W¦ä¸²¾cÕdž‹çš„æ—¥æœŸè{æ¢äØ“ä¸€ä¸ªtimestampåQˆæ—¶é—´æˆ³è®°java.sql.TimestampåQ?br /> *@param dateString 需要è{æ¢äØ“timestamp的字½W¦ä¸²
*@return dataTime timestamp

public final static java.sql.Timestamp string2Time(String dateString)
throws java.text.ParseException {
DateFormat dateFormat;
dateFormat = new SimpleDateFormat("yyyy-MM-dd kk:mm:ss.SSS", Locale.ENGLISH);//è®‘Ö®šæ ¼å¼
//dateFormat = new SimpleDateFormat("yyyy-MM-dd kk:mm:ss", Locale.ENGLISH);
dateFormat.setLenient(false);
java.util.Date timeDate = dateFormat.parse(dateString);//util¾cÕdž‹
java.sql.Timestamp dateTime = new java.sql.Timestamp(timeDate.getTime());//Timestamp¾cÕdž‹,timeDate.getTime()˜q”回一个longåž?br /> return dateTime;
}

*method ž®†å­—½W¦ä¸²¾cÕdž‹çš„æ—¥æœŸè{æ¢äØ“ä¸€ä¸ªDateåQˆjava.sql.DateåQ?br /> *@param dateString 需要è{æ¢äØ“Date的字½W¦ä¸²
*@return dataTime Date

public final static java.sql.Date string2Date(String dateString)
throws java.lang.Exception {
DateFormat dateFormat;
dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
dateFormat.setLenient(false);
java.util.Date timeDate = dateFormat.parse(dateString);//util¾cÕdž‹
java.sql.Date dateTime = new java.sql.Date(timeDate.getTime());//sql¾cÕdž‹
return dateTime;
}

public static void main(String[] args){
Date da = new Date();
注意åQšè¿™ä¸ªåœ°æ–¹da.getTime()得到的是一个long型的å€?br /> System.out.println(da.getTime());

由日期date转换为timestamp

½W¬ä¸€¿Uæ–¹æ³•:使用new Timestamp(long)
Timestamp t = new Timestamp(new Date().getTime());
System.out.println(t);

½W¬äºŒ¿Uæ–¹æ³•:使用Timestamp(int year,int month,int date,int hour,int minute,int second,int nano)
Timestamp tt = new Timestamp(Calendar.getInstance().get(
      Calendar.YEAR) - 1900, Calendar.getInstance().get(
      Calendar.MONTH), Calendar.getInstance().get(
      Calendar.DATE), Calendar.getInstance().get(
      Calendar.HOUR), Calendar.getInstance().get(
      Calendar.MINUTE), Calendar.getInstance().get(
      Calendar.SECOND), 0);
System.out.println(tt);

try {
String sToDate = "2005-8-18";//用于转换成java.sql.Date的字½W¦ä¸²
      String sToTimestamp = "2005-8-18 14:21:12.123";//用于转换成java.sql.Timestamp的字½W¦ä¸²
      Date date1 = string2Date(sToDate);
      Timestamp date2 = string2Time(sToTimestamp);
System.out.println("Date:"+date1.toString());//¾l“果昄¡¤º
System.out.println("Timestamp:"+date2.toString());//¾l“果昄¡¤º
}catch(Exception e) {
e.printStackTrace();
}
}



]]>
java中各¿UæŽ’åº?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/sy1214520/archive/2008/06/19/209127.html</guid><wfw:comment>http://www.aygfsteel.com/sy1214520/comments/209127.html</wfw:comment><comments>http://www.aygfsteel.com/sy1214520/archive/2008/06/19/209127.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/sy1214520/comments/commentRss/209127.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/sy1214520/services/trackbacks/209127.html</trackback:ping><description><![CDATA[     摘要: 把以前æ€È»“的一个java常用排序整理了一下ã€? 插入排序åQ? package org.rut.util.algorithm.support;       import org.rut.util.algorithm.SortUtil;    /** *//** &nb...  <a href='http://www.aygfsteel.com/sy1214520/archive/2008/06/19/209127.html'>阅读全文</a><img src ="http://www.aygfsteel.com/sy1214520/aggbug/209127.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/sy1214520/" target="_blank">ž®è™«æ—ºç¦</a> 2008-06-19 12:00 <a href="http://www.aygfsteel.com/sy1214520/archive/2008/06/19/209127.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java对各¿Uæ–‡ä»¶çš„æ“ä½œè¯¦è§£http://www.aygfsteel.com/sy1214520/archive/2008/06/19/209120.htmlž®è™«æ—ºç¦ž®è™«æ—ºç¦Thu, 19 Jun 2008 03:40:00 GMThttp://www.aygfsteel.com/sy1214520/archive/2008/06/19/209120.htmlhttp://www.aygfsteel.com/sy1214520/comments/209120.htmlhttp://www.aygfsteel.com/sy1214520/archive/2008/06/19/209120.html#Feedback0http://www.aygfsteel.com/sy1214520/comments/commentRss/209120.htmlhttp://www.aygfsteel.com/sy1214520/services/trackbacks/209120.html阅读全文

]]>
Ö÷Õ¾Ö©Öë³ØÄ£°å£º Íû¿üÏØ| ÀäË®½­ÊÐ| ÑŽ­ÏØ| ¹®ÁôÏØ| ±±´¨| °ÍÁÖÓÒÆì| ¶ýÔ´ÏØ| ÎåָɽÊÐ| ¸ßÖÝÊÐ| ²ÔÎàÏØ| ÎýÁÖºÆÌØÊÐ| Å©°²ÏØ| °²ÇðÊÐ| Ð˰²ÏØ| ÒËÁ¼ÏØ| ÉÛ¶«ÏØ| ÅíÉ½ÏØ| ãþÑôÏØ| ¹óÑôÊÐ| °¢°ÓÏØ| ÐËÉ½ÏØ| Ñ·¿ËÏØ| ½ð²ýÊÐ| ÒËÖÝÊÐ| ÔúÀ¼ÍÍÊÐ| ¹±¸ÂÏØ| µ±ÐÛÏØ| ͨºÓÏØ| ÓÀÈÊÏØ| ½ªÑßÊÐ| ƽ²ýÏØ| ¾Ą̊ÊÐ| ÈýÌ¨ÏØ| ·ïɽÊÐ| ÜÝÆ½ÏØ| ÁÉÄþÊ¡| ·ÖÒËÏØ| ¶÷ƽÊÐ| ÏóÖÝÏØ| ÕòÔ¶ÏØ| ´ïÈÕÏØ|