??xml version="1.0" encoding="utf-8" standalone="yes"?>精品亚洲成a人在线观看,欧美午夜精品久久久久久蜜,每日更新在线观看avhttp://www.aygfsteel.com/Titan/articles/30523.htmlTitanTitanMon, 13 Feb 2006 14:34:00 GMThttp://www.aygfsteel.com/Titan/articles/30523.htmlhttp://www.aygfsteel.com/Titan/comments/30523.htmlhttp://www.aygfsteel.com/Titan/articles/30523.html#Feedback0http://www.aygfsteel.com/Titan/comments/commentRss/30523.htmlhttp://www.aygfsteel.com/Titan/services/trackbacks/30523.html使用javamail发送html邮g比较复杂

package org.tatan.mail;

import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
import javax.mail.Session;
import javax.mail.MessagingException;
import javax.mail.Transport;

public class SendHtmlMail {
    public static void sendMessage(String smtpHost,
                                   String from, String to,
                                   String subject, String messageText)
            throws MessagingException,java.io.UnsupportedEncodingException {

        // Step 1:  Configure the mail session
        System.out.println("Configuring mail session for: " + smtpHost);
        java.util.Properties props = new java.util.Properties();
        props.setProperty("mail.smtp.auth", "true");//指定是否需要SMTP验证
        props.setProperty("mail.smtp.host", smtpHost);//指定SMTP服务?BR>        props.put("mail.transport.protocol", "smtp");
        Session mailSession = Session.getDefaultInstance(props);
        mailSession.setDebug(true);//是否在控制台昄debug信息

        // Step 2:  Construct the message
        System.out.println("Constructing message -  from=" + from + "  to=" + to);
        InternetAddress fromAddress = new InternetAddress(from);
        InternetAddress toAddress = new InternetAddress(to);

        MimeMessage testMessage = new MimeMessage(mailSession);
        testMessage.setFrom(fromAddress);
        testMessage.addRecipient(javax.mail.Message.RecipientType.TO, toAddress);
        testMessage.setSentDate(new java.util.Date());
        testMessage.setSubject(MimeUtility.encodeText(subject,"gb2312","B"));

        testMessage.setContent(messageText, "text/html;charset=gb2312");
        System.out.println("Message constructed");

        // Step 3:  Now send the message
        Transport transport = mailSession.getTransport("smtp");
        transport.connect(smtpHost, "webmaster", "password");
        transport.sendMessage(testMessage, testMessage.getAllRecipients());
        transport.close();


        System.out.println("Message sent!");
    }

    public static void main(String[] args) {

        String smtpHost = "localhost";
        String from = "webmaster@mymail.com";
        String to = "mfc42d@sohu.com";
        String subject = "html邮g试"; //subject javamail自动转码

        StringBuffer theMessage = new StringBuffer();
        theMessage.append("<h2><font color=red>q倒霉孩子</font></h2>");
        theMessage.append("<hr>");
        theMessage.append("<i>q年失望q年?lt;/i>");

        try {
            SendHtmlMail.sendMessage(smtpHost, from, to, subject, theMessage.toString());
        }
        catch (javax.mail.MessagingException exc) {
            exc.printStackTrace();
        }
        catch (java.io.UnsupportedEncodingException exc) {
            exc.printStackTrace();
        }
    }
}
邮g?参见RFC822QRFC2047)只能包含US-ASCII字符?BR>邮g头中M包含非US-ASCII字符的部分必进行编码,使其只包含US-ASCII字符?BR>但是java mail可以Ҏ(gu)JVM发送中文邮件自行编码,Q用它自带的MimeUtilitycȝencodeTextҎ(gu)对中文信息进行编码也可以?BR>邮g正文必须有charset=gb2312否则?BR>Content-Type: text/html; charset=us-ascii
Content-Transfer-Encoding: 7bit
打开邮gZؕ?讄charset=gb2312?BR>Content-Type: text/html;charset=gb2312
Content-Transfer-Encoding: quoted-printable
它不能用MimeUtility里的Ҏ(gu)来编码?BR>邮g正文的编码方式的信息是要攑֜Content-Transfer-Encodingq个邮g头参C的,
而MimeUtility里面的方法是编码方式的信息攑֜~码后的正文内容中?BR>所以如果你Ҏ(gu)文也用MimeUtilityq行处理Q那么其他邮件程序就不会(x)正常昄你编码的邮gQ?BR>因ؓ(f)其他邮g软g如outlook,foxmail只会(x)Ҏ(gu)Content-Transfer-Encodingq个里面的信息来寚w件正文进行解码?/P>

Titan 2006-02-13 22:34 发表评论
]]>
javamail发送带有附件的html邮ghttp://www.aygfsteel.com/Titan/articles/30522.htmlTitanTitanMon, 13 Feb 2006 14:32:00 GMThttp://www.aygfsteel.com/Titan/articles/30522.htmlhttp://www.aygfsteel.com/Titan/comments/30522.htmlhttp://www.aygfsteel.com/Titan/articles/30522.html#Feedback0http://www.aygfsteel.com/Titan/comments/commentRss/30522.htmlhttp://www.aygfsteel.com/Titan/services/trackbacks/30522.htmlpackage org.tatan.mail;

import javax.mail.Session;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMultipart;
import javax.activation.FileDataSource;
import javax.activation.DataHandler;


public class SendAttachMail {
    public static void sendMessage(String smtpHost,
                                   String from, String to,
                                   String subject, String messageText,
                                   String fileName)
            throws MessagingException {

        // Step 1:  Configure the mail session
        java.util.Properties props = new java.util.Properties();
        props.setProperty("mail.smtp.auth", "true");//指定是否需要SMTP验证
        props.setProperty("mail.smtp.host", smtpHost);//指定SMTP服务?BR>        props.put("mail.transport.protocol", "smtp");
        Session mailSession = Session.getDefaultInstance(props);
        mailSession.setDebug(true);//是否在控制台昄debug信息

        // Step 2:  Construct the message
        System.out.println("Constructing message -  from=" + from + "  to=" + to);
        InternetAddress fromAddress = new InternetAddress(from);
        InternetAddress toAddress = new InternetAddress(to);

        MimeMessage testMessage = new MimeMessage(mailSession);
        testMessage.setFrom(fromAddress);
        testMessage.addRecipient(javax.mail.Message.RecipientType.TO, toAddress);
        testMessage.setSentDate(new java.util.Date());
        testMessage.setSubject(subject);

        //  Step 3:  Create a body part to hold the "text" portion of the message
        System.out.println("Constructing 'text' body part");
        MimeBodyPart textBodyPart = new MimeBodyPart();
        textBodyPart.setContent(messageText,"text/html;charset=gb2312");

        //  Step 4:  Create a body part to hold the "file" portion of the message
        System.out.println("Attaching 'file' body part: " + fileName);
        MimeBodyPart fileBodyPart = new MimeBodyPart();
        FileDataSource fds = new FileDataSource("c:\\a.rar");
        fileBodyPart.setDataHandler(new DataHandler(fds));
        fileBodyPart.setFileName(fds.getName());
        System.out.println("Finished attaching file");

        // Step 5:  Create a Multipart/container and add the parts
        Multipart container = new MimeMultipart();
        container.addBodyPart(textBodyPart);
        container.addBodyPart(fileBodyPart);

        // Step 6:  Add the Multipart to the actual message
        testMessage.setContent(container);
        System.out.println("Message constructed");

        // Step 7:  Now send the message
        Transport transport = mailSession.getTransport("smtp");
        transport.connect(smtpHost, "webmaster", "password");
        transport.sendMessage(testMessage, testMessage.getAllRecipients());
        transport.close();


        System.out.println("Message sent!");
    }

    public static void main(String[] args) {

        String fileName = "a.rar";
        String smtpHost = "localhost";
        String from = "webmaster@mymail.com";
        String to = "mfc42d@sohu.com";
        String subject = "html邮g附g试"; //subject javamail自动转码
         StringBuffer theMessage = new StringBuffer();
        theMessage.append("<h2><font color=red>q倒霉孩子</font></h2>");
        theMessage.append("<hr>");
        theMessage.append("<i>q年失望q年?lt;/i>");

        try {
            SendAttachMail.sendMessage(smtpHost, from, to, subject, theMessage.toString(), fileName);
        }
        catch (javax.mail.MessagingException exc) {
            exc.printStackTrace();
        }
    }
}



Titan 2006-02-13 22:32 发表评论
]]>
执行的Runtimec调用程序停掉的原因http://www.aygfsteel.com/Titan/articles/30521.htmlTitanTitanMon, 13 Feb 2006 14:30:00 GMThttp://www.aygfsteel.com/Titan/articles/30521.htmlhttp://www.aygfsteel.com/Titan/comments/30521.htmlhttp://www.aygfsteel.com/Titan/articles/30521.html#Feedback0http://www.aygfsteel.com/Titan/comments/commentRss/30521.htmlhttp://www.aygfsteel.com/Titan/services/trackbacks/30521.html牛牛发现问题的原因,Process  process=Runtime.getRuntime().exec("");中生停滞(dQblockingQ?/P>

q个是因为Runtime.getRuntime().exec()要自己去处理stdout和stderr的?nbsp;
所以如果你惌E序正常q行的话Q请务必上q用别的U程取走?nbsp;
 
>test.bat 
haha 
exit  99 
 
>RuntimeTest.java 
public  class  RuntimeTest  { 
 
           public  static  void  main(String[]  args)  { 
                       try  { 
                                   Process  process=Runtime.getRuntime().exec("test.bat"); 
                                   StreamGobbler  errorGobbler  =  new  StreamGobbler(process.getErrorStream(),  "ERROR");                         
                
                           //  kick  off  stderr 
                           errorGobbler.start(); 
                            
                           StreamGobbler  outGobbler  =  new  StreamGobbler(process.getInputStream(),  "STDOUT"); 
                           //  kick  off  stdout 
                           outGobbler.start(); 
                            
                                   process.waitFor(); 
                                   System.out.println(process.exitValue()); 
                       }  catch(Exception  e)  {}             
           } 

 
 
>StreamGobbler.java 
import  java.io.BufferedReader; 
import  java.io.IOException; 
import  java.io.InputStream; 
import  java.io.InputStreamReader; 
import  java.io.OutputStream; 
import  java.io.PrintWriter; 
 
public  class  StreamGobbler  extends  Thread  { 
           InputStream  is; 
           String  type; 
           OutputStream  os; 
        
           StreamGobbler(InputStream  is,  String  type)  { 
                       this(is,  type,  null); 
           } 
 
       StreamGobbler(InputStream  is,  String  type,  OutputStream  redirect)  { 
               this.is  =  is; 
               this.type  =  type; 
               this.os  =  redirect; 
       } 
        
       public  void  run()  { 
               try  { 
                       PrintWriter  pw  =  null; 
                       if  (os  !=  null) 
                               pw  =  new  PrintWriter(os); 
                                
                       InputStreamReader  isr  =  new  InputStreamReader(is); 
                       BufferedReader  br  =  new  BufferedReader(isr); 
                       String  line=null; 
                       while  (  (line  =  br.readLine())  !=  null)  { 
                               if  (pw  !=  null) 
                                       pw.println(line); 
                               System.out.println(type  +  ">"  +  line);         
                       } 
                       if  (pw  !=  null) 
                               pw.flush(); 
               }  catch  (IOException  ioe)  { 
                       ioe.printStackTrace();     
               } 
       } 
}
自己mark一?/P>

 



Titan 2006-02-13 22:30 发表评论
]]>
java语言Ҏ(gu)间的处理http://www.aygfsteel.com/Titan/articles/30520.htmlTitanTitanMon, 13 Feb 2006 14:27:00 GMThttp://www.aygfsteel.com/Titan/articles/30520.htmlhttp://www.aygfsteel.com/Titan/comments/30520.htmlhttp://www.aygfsteel.com/Titan/articles/30520.html#Feedback0http://www.aygfsteel.com/Titan/comments/commentRss/30520.htmlhttp://www.aygfsteel.com/Titan/services/trackbacks/30520.html1.处理数据库,有DATE Java.sql.Date 日期Q?BR>TIME Java.sql.Time 时戳QTIMESTAMP Java.sql.Timestamp 当日日期和时_(d)
对应的ResultSet的方?BR>DATE                          java.sql.Date                               java.sql.Date getDate()
TIME                           java.sql.Time                               java.sql.Time getTime()
TIMESTAMP              java.sql.Timestamp                   java.sql.Timestamp getTimestamp()
Ҏ(gu)java2的规范要求用Java.sql.TimestampQ这样不?x)失ȝ度详见?A >http://blogger.org.cn/blog/more.asp?name=hongrui&id=7557Q。对于oracle数据库比较例外,可以用oracle.sql.TIMESTAMP
q和他的版本也有关系?FONT color=#f73809>注意QSQLserver中timestamp 对应的是 DateTimecd?BR>使用spring的jdbcӞ可能用Java.sql.Timestamp详见Q?A >http://blogger.org.cn/blog/more.asp?name=hongrui&id=9521Q?BR>下面l个例子
public static java.sql.Timestamp getDBSysdate(Connection conn)
throws Exception {
Statement stmt = null;
ResultSet rs = null;
Timestamp sysTime = null;

try {
stmt = conn.createStatement();
rs = stmt.executeQuery("SELECT SYSDATE FROM DUAL");
if (rs.next()) {
sysTime = rs.getTimestamp("SYSDATE");
}
} catch (Exception e) {

} finally {
try {
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
} catch (Exception e) {

}
}

return sysTime;
}
最好的办法使用long存时_(d)使用Calendar 处理Q就是表C日期时间不直观?BR>2.字符串{化时_(d)注意不能判断旉输入是否正确Q判断时间输入是否正,请用正则?BR>try
     {
      String st="2005-13-32 12:00";
     java.text.DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm");
              Date  starttime = df.parse(st);
     System.out.println(starttime.toString());       
     }
catch(Exception ex)
{
 
}
不要搞؜?jin)try-catch的功能。只有程序或pȝ抛出?jin)异常,try-catch才能捕获 Q得到Wed Feb 01 00:00:00 CST 2006
q样操作是错误的QTimestamp是java.util.DateQ会(x)得到java.lang.ClassCastExceptionQ你犯了(jin)向下转型的错误?/P>

try
     {
      String st="2005-13-32 12:00";
     java.text.DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm");
              Timestamp  starttime =(Timestamp) df.parse(st);
     System.out.println(starttime.toString());       
     }
catch(Exception ex)
{
 ex.printStackTrace();
}
应该使用
try {
   String st = "2005-12-2 12:00:00";
   Timestamp starttime = Timestamp.valueOf(st);
   System.out.println(starttime.toString());
  } catch (Exception ex) {
   ex.printStackTrace();
  }
  ?BR>  import java.sql.*;
import java.util.*;

public class CreateTimestamp {
   public static void main(String [] args) {

   Calendar cal = Calendar.getInstance();

   cal.set(Calendar.YEAR, 2000);
   cal.set(Calendar.MONTH, Calendar.JANUARY);
   cal.set(Calendar.DATE, 1);
   cal.set(Calendar.HOUR_OF_DAY, 11);
   cal.set(Calendar.MINUTE, 45);
   cal.set(Calendar.SECOND, 30);
   cal.set(Calendar.MILLISECOND, 0);

   long millis = cal.getTime().getTime();
   System.out.println("milliseconds in millis = " + millis);
   java.sql.Timestamp ts = new java.sql.Timestamp(millis);
   System.out.println("Timestamp ts before setting nanos = " + ts);

   ts.setNanos(500);
   System.out.println("Timestamp ts with nanos set = " + ts);
   }
}


下面l出javadoc的方?BR>1. java.sql.Date.valueOf(java.lang.String)

    public static Date valueOf(String s)
 Converts a string in JDBC date escape format to a Date value.

 Parameters:
 s - a String object representing a date in in the format "yyyy-mm-dd"
 Returns:
 a java.sql.Date object representing the given date
 Throws:
 IllegalArgumentException - if the date given is not in the JDBC date escape format (yyyy-mm-dd)

2. java.sql.Time.valueOf(java.lang.String)

    public static Time valueOf(String s)
 Converts a string in JDBC time escape format to a Time value.

 Parameters:
 s - time in format "hh:mm:ss"
 Returns:
 a corresponding Time object

3. java.sql.Timestamp.valueOf(java.lang.String)
  
   public static Timestamp valueOf(String s)
 Converts a String object in JDBC timestamp escape format to a Timestamp value.

 Parameters:
 s - timestamp in format yyyy-mm-dd hh:mm:ss.fffffffff
 Returns:
 corresponding Timestamp value
 Throws:
 IllegalArgumentException - if the given argument does not have the format yyyy-mm-dd hh:mm:ss.fffffffff



Titan 2006-02-13 22:27 发表评论
]]>
java如何计算两个日期之间相差的天?/title><link>http://www.aygfsteel.com/Titan/articles/30519.html</link><dc:creator>Titan</dc:creator><author>Titan</author><pubDate>Mon, 13 Feb 2006 14:25:00 GMT</pubDate><guid>http://www.aygfsteel.com/Titan/articles/30519.html</guid><wfw:comment>http://www.aygfsteel.com/Titan/comments/30519.html</wfw:comment><comments>http://www.aygfsteel.com/Titan/articles/30519.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/Titan/comments/commentRss/30519.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/Titan/services/trackbacks/30519.html</trackback:ping><description><![CDATA[<P>看完?jin)jdk的helpQ发现sun没有提供q样的一个函敎ͼ朋友l了(jin)几个实现Ҏ(gu)</P> <P>//取得剩余天数<BR>   SimpleDateFormat df=new SimpleDateFormat("yyyymmdd");<BR>   Date d0=new java.util.Date();<BR>   Date d1=df.parse(end_date);<BR>   long time0=d0.getTime();<BR>   long time1=d1.getTime();<BR>   System.out.println((time1-time0)/(1000*60*60*24)); </P> <P>q样两个时间相差的天数比较?</P> <P>/**<BR>     * 计算两个日期之间相差的天?BR>     * <BR>     * @param date1<BR>     * @param date2<BR>     * @return<BR>     */<BR>    public static int diffdates(Date date1, Date date2) {<BR>        int result = 0;<BR>        ElapsedTime et = new ElapsedTime();</P> <P>        GregorianCalendar gc1 = new GregorianCalendar();<BR>        GregorianCalendar gc2 = new GregorianCalendar();</P> <P>        gc1.setTime(date1);<BR>        gc2.setTime(date2);<BR>        result = et.getDays(gc1, gc2);</P> <P>        return result;<BR>    } <BR><BR>然后ElapseTime中的Ҏ(gu)是:(x)<BR>public int getDays(GregorianCalendar g1, GregorianCalendar g2) {<BR>  int elapsed = 0;<BR>  GregorianCalendar gc1, gc2;</P> <P>  if (g2.after(g1)) {<BR>   gc2 = (GregorianCalendar) g2.clone();<BR>   gc1 = (GregorianCalendar) g1.clone();<BR>  } else {<BR>   gc2 = (GregorianCalendar) g1.clone();<BR>   gc1 = (GregorianCalendar) g2.clone();<BR>  }</P> <P>  gc1.clear(Calendar.MILLISECOND);<BR>  gc1.clear(Calendar.SECOND);<BR>  gc1.clear(Calendar.MINUTE);<BR>  gc1.clear(Calendar.HOUR_OF_DAY);</P> <P>  gc2.clear(Calendar.MILLISECOND);<BR>  gc2.clear(Calendar.SECOND);<BR>  gc2.clear(Calendar.MINUTE);<BR>  gc2.clear(Calendar.HOUR_OF_DAY);</P> <P>  while (gc1.before(gc2)) {<BR>   gc1.add(Calendar.DATE, 1);<BR>   elapsed++;<BR>  }<BR>  return elapsed;<BR> }<BR>其实使用<FONT size=2>joda最?/FONT></P> <P>public boolean isRentalOverdue(<B>DateTime</B> datetimeRented) {<BR>  <B>Period</B> rentalPeriod = Period.days(2);<BR>  return datetimeRented.plus(rentalPeriod).isBeforeNow()<BR>}<BR></P><img src ="http://www.aygfsteel.com/Titan/aggbug/30519.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/Titan/" target="_blank">Titan</a> 2006-02-13 22:25 <a href="http://www.aygfsteel.com/Titan/articles/30519.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]正则表达式之?/title><link>http://www.aygfsteel.com/Titan/articles/28844.html</link><dc:creator>Titan</dc:creator><author>Titan</author><pubDate>Fri, 20 Jan 2006 15:58:00 GMT</pubDate><guid>http://www.aygfsteel.com/Titan/articles/28844.html</guid><wfw:comment>http://www.aygfsteel.com/Titan/comments/28844.html</wfw:comment><comments>http://www.aygfsteel.com/Titan/articles/28844.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/Titan/comments/commentRss/28844.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/Titan/services/trackbacks/28844.html</trackback:ping><description><![CDATA[<CENTER> <P>原著QSteve Mansour <BR>sman@scruznet.com <BR><FONT size=-1>Revised: June 5, 1999<BR>(copied by jm /at/ jmason.org from http://www.scruz.net/%7esman/regexp.htm, after the original disappeared! ) </FONT></P> <P>译QNeo Lee<BR>neo.lee@gmail.com<BR><FONT size=-1>2004q?0?6?/FONT></P></CENTER> <HR> <P><A >英文版原?/A></P> <P>译者按Q原文因为年代久q,文中很多链接早已q期Q主要是关于vi、sed{工L(fng)介绍和手册)(j)Q本译文中已此c链接删除,如需(g)查这些链接可以查看上面链接的原文。除此之外基本照原文直译Q括号中有“译者按”的部分是译者补充的说明。如有内Ҏ(gu)面的问题L(fng)接和Steve Mansor联系Q当?dng)如果你只写中文,也可以和我联pR?/P> <HR> <H1>??/H1> <P><B><A >什么是正则表达?/A></B> <BR><B><A >范例</A></B> <BR>   <A >?/A> <BR>   <A >中Q神奇的咒语Q?/A> <BR>   <A >困难Q不可思议的象形文字)(j)</A><BR><B><A >不同工具中的正则表达?/A></B> </P> <P></P> <HR width="100%"> <H1><A name=WhatAreRegularExpressions></A>什么是正则表达?/H1>一个正则表辑ּQ就是用某种模式d配一cdW串的一个公式。很多h因ؓ(f)它们看上L较古怪而且复杂所以不敢去使用——很不幸Q这文章也不能够改变这一点,不过Q经q一点点l习(fn)之后我就开始觉得这些复杂的表达式其实写hq是相当单的Q而且Q一旦你弄懂它们Q你p把数时辛苦而且易错的文本处理工作压~在几分钟(甚至几秒钟)(j)内完成。正则表辑ּ被各U文本编辑Y件、类库(例如Rogue Wave的tools.h++Q、脚本工P像awk/grep/sedQ广泛的支持Q而且像Microsoft的Visual C++q种交互式IDE也开始支持它?jin)? <P>我们在如下的章节中利用一些例子来解释正则表达式的用法Q绝大部分的例子是基?B><TT>vi</TT></B>中的文本替换命o(h)?B><TT>grep</TT></B>文g搜烦(ch)命o(h)来书写的Q不q它们都是比较典型的例子Q其中的概念可以在sed、awk、perl和其他支持正则表辑ּ的编E语a中用。你可以看看<A >不同工具中的正则表达?/A>q一节,其中有一些在别的工具中用正则表辑ּ的例子。还有一个关于vi中文本替换命令(sQ的<A >单说?/A>附在文后供参考?/P> <H2>正则表达式基</H2>正则表达式由一些普通字W和一?I>元字W(metacharactersQ?/I>l成。普通字W包括大写的字母和数字Q而元字符则具有特D的含义Q我们下面会(x)l予解释? <P>在最单的情况下,一个正则表辑ּ看上d是一个普通的查找丌Ӏ例如,正则表达?testing"中没有包含Q何元字符Q,它可以匹?testing"?123testing"{字W串Q但是不能匹?Testing"?/P> <P>要想真正的用好正则表辑ּQ正的理解元字W是最重要的事情。下表列Z(jin)所有的元字W和对它们的一个简短的描述? <P> <TABLE cellSpacing=2 cellPadding=2> <TBODY> <TR vAlign=baseline> <TH align=left><B><I>元字W?/I></B></TH> <TD> </TD> <TH align=left><B><I>描述</I></B></TH></TR> <TR> <TD> <HR width="100%"> </TD> <TD></TD> <TD> <HR width="100%"> </TD></TR> <TR> <TD vAlign=top align=middle> <CENTER><B><TT><FONT face="Courier New"><FONT size=+1>.</FONT></FONT></TT></B> </CENTER></TD> <TD></TD> <TD>匚wM单个字符。例如正则表辑ּ<B><TT>r.t</TT></B>匚wq些字符Ԍ(x)<I>rat</I>?I>rut</I>?I>r t</I>Q但是不匚w<I>root</I>?nbsp;</TD></TR> <TR> <TD vAlign=top> <CENTER><B><TT><FONT face="Courier New"><FONT size=+1>$</FONT></FONT></TT></B> </CENTER></TD> <TD></TD> <TD>匚w行结束符。例如正则表辑ּ<B><TT>weasel$</TT></B> 能够匚w字符?<I>He's a weasel</I>"的末,但是不能匚w字符?<I>They are a bunch of weasels.</I>"?nbsp;</TD></TR> <TR> <TD vAlign=top> <CENTER><B><FONT size=+1>^</FONT></B> </CENTER></TD> <TD></TD> <TD>匚w一行的开始。例如正则表辑ּ<B><TT>^When in</TT></B>能够匚w字符?<I>When in the course of human events</I>"的开始,但是不能匚w"<I>What and When in the"?/I></TD></TR> <TR> <TD vAlign=top> <CENTER><B><TT><FONT face="Courier New"><FONT size=+1>*</FONT></FONT></TT></B> </CENTER></TD> <TD></TD> <TD>匚w0或多个正好在它之前的那个字符。例如正则表辑ּ<B><TT></TT></B><B><TT>.*</TT></B>意味着能够匚wL数量的Q何字W?/TD></TR> <TR> <TD vAlign=top> <CENTER><B><TT><FONT face="Courier New"><FONT size=+1>\</FONT></FONT></TT></B> </CENTER></TD> <TD></TD> <TD>q是引用府,用来这里列出的q些元字W当作普通的字符来进行匹配。例如正则表辑ּ<B><TT>\$</TT></B>被用来匹配美元符P而不是行,cM的,正则表达?TT><STRONG>\.</STRONG></TT>用来匚w点字W,而不是Q何字W的通配W?/TD></TR> <TR> <TD vAlign=top> <CENTER><B><TT><FONT face="Courier New"><FONT size=+1>[ ] </FONT></FONT></TT></B> <BR><B><TT><FONT face="Courier New"><FONT size=+1>[c</FONT><FONT size=-1>1</FONT><FONT size=+1>-c</FONT><FONT size=-1>2</FONT><FONT size=+1>]</FONT></FONT></TT></B> <BR><B><TT><FONT face="Courier New"><FONT size=+1>[^c</FONT><FONT size=-1>1</FONT><FONT size=+1>-c</FONT><FONT size=-1>2</FONT><FONT size=+1>]</FONT></FONT></TT></B> </CENTER></TD> <TD></TD> <TD>匚w括号中的M一个字W。例如正则表辑ּ<B><TT>r[aou]t</TT></B>匚w<I>rat</I>?I>rot</I>?I>rut</I>Q但是不匚w<I>ret</I>。可以在括号中用连字符-来指定字W的区间Q例如正则表辑ּ<B><TT>[0-9]</TT></B>可以匚wM数字字符Q还可以制定多个区间Q例如正则表辑ּ<B><TT>[A-Za-z]</TT></B>可以匚wM大小写字母。另一个重要的用法是“排除”,要想匚w<I>除了(jin)</I>指定区间之外的字W——也是所谓的补集——在左边的括号和W一个字W之间用^字符Q例如正则表辑ּ<B><TT>[^269A-Z]</TT></B> 匹配除???和所有大写字母之外的M字符?/TD></TR> <TR> <TD vAlign=top> <CENTER><B><TT><FONT face="Courier New"><FONT size=+1>\< \></FONT></FONT></TT></B> </CENTER></TD> <TD></TD> <TD>匚w词(<EM>word</EM>Q的开始(\<Q和l束Q\>Q。例如正则表辑ּ<B><TT><FONT face="Courier New">\<the</FONT></TT></B>能够匚w字符?<I>for the wise</I>"中的"the"Q但是不能匹配字W串"<I>otherwise</I>"中的"the"?STRONG>注意</STRONG>Q这个元字符不是所有的软g都支持的?/TD></TR> <TR> <TD vAlign=top> <CENTER><B><TT><FONT face="Courier New"><FONT size=+1>\( \)</FONT></FONT></TT></B> </CENTER></TD> <TD></TD> <TD>?\( ?\) 之间的表辑ּ定义为“组”(<EM>group</EM>Q,q且匹配这个表辑ּ的字W保存到一个(f)时区域(一个正则表辑ּ中最多可以保?个)(j)Q它们可以用 <B><TT>\1</TT></B> ?B><TT>\9</TT></B> 的符h引用?/TD></TR> <TR> <TD vAlign=baseline> <CENTER><B><TT><FONT face="Courier New"><FONT size=+1>|</FONT></FONT></TT></B> </CENTER></TD> <TD></TD> <TD>两个匹配条件进行逻辑“或”(<EM>Or</EM>Q运。例如正则表辑ּ<B><TT><FONT face="Courier New">(him|her)</FONT></TT></B> 匚w"<I>it belongs to him</I>"?<I>it belongs to her</I>"Q但是不能匹?<I>it belongs to them.</I>"?STRONG>注意</STRONG>Q这个元字符不是所有的软g都支持的?/TD></TR> <TR vAlign=baseline> <TD> <CENTER><B><TT><FONT face="Courier New"><FONT size=+1>+</FONT></FONT></TT></B> </CENTER></TD> <TD></TD> <TD>匚w1或多个正好在它之前的那个字符。例如正则表辑ּ<B><TT></TT></B><B><TT></TT></B><B><TT>9+</TT></B>匚w9?9?99{?STRONG>注意</STRONG>Q这个元字符不是所有的软g都支持的?/TD></TR> <TR vAlign=baseline> <TD> <CENTER><B><TT><FONT size=+1>?</FONT></TT></B> </CENTER></TD> <TD></TD> <TD>匚w0?个正好在它之前的那个字符?STRONG>注意</STRONG>Q这个元字符不是所有的软g都支持的?/TD></TR> <TR vAlign=baseline> <TD> <CENTER><B><FONT size=+1><TT><FONT face="Courier New">\{</FONT></TT><I>i</I><TT><FONT face="Courier New">\}</FONT></TT></FONT></B> <BR><B><FONT size=+1><TT><FONT face="Courier New">\{</FONT></TT><I>i</I><TT><FONT face="Courier New">,</FONT></TT><I>j</I><TT><FONT face="Courier New">\}</FONT></TT></FONT></B> </CENTER></TD> <TD></TD> <TD vAlign=baseline>匚w指定数目的字W,q些字符是在它之前的表达式定义的。例如正则表辑ּ<B><TT><FONT face="Courier New">A[0-9]\{3\}</FONT></TT></B> 能够匚w字符"A"后面跟着正好3个数字字W的Ԍ例如A123、A348{,但是不匹配A1234。而正则表辑ּ<B><TT><FONT face="Courier New">[0-9]\{4,6\}</FONT></TT></B> 匚wq箋(hu)的Q?个?个或?个数字字W?STRONG>注意</STRONG>Q这个元字符不是所有的软g都支持的?/TD></TR></TBODY></TABLE></P> <P></P> <HR width="100%"> <P>最单的元字W是点,它能够匹配Q何单个字W(注意<STRONG>?/STRONG>包括新行W)(j)。假定有个文件test.txt包含以下几行内容Q?/P> <UL><TT>he is a rat</TT><BR><TT>he is in a rut</TT><BR><TT>the food is Rotten</TT><BR><TT>I like root beer</TT> </UL>我们可以使用grep命o(h)来测试我们的正则表达式,grep命o(h)使用正则表达式去试匚w指定文g的每一行,q将臛_有一处匹配表辑ּ的所有行昄出来。命? <UL><TT>grep r.t test.txt</TT> </UL>在test.txt文g中的每一行中搜烦(ch)正则表达?B><TT>r.t</TT></B>Qƈ打印输出匚w的行。正则表辑ּ<B><TT>r.t</TT></B>匚w一?B><TT>r</TT></B>接着M一个字W再接着一?B><TT>t</TT></B>。所以它?yu)匹配文件中?B><TT>rat</TT></B>?B><TT>rut</TT></B>Q而不能匹?B><TT>Rotten</TT></B>中的<B><TT>Rot</TT></B>Q因为正则表辑ּ是大写敏感的。要惛_时匹配大写和写字母Q应该用字W区间元字符Q方括号Q。正则表辑ּ<B><TT>[Rr]</TT></B>能够同时匚w<B><TT>R</TT></B>?B><TT>r</TT></B>。所以,要想匚w一个大写或者小写的<B><TT>r</TT></B>接着M一个字W再接着一?B><TT>t</TT></B>p使用q个表达式:(x)<B><TT>[Rr].t</TT></B>? <P>要想匚w行首的字W要使用抑扬字符Q?EM>^</EM>Q——又是也被叫做插入符。例如,x(chng)到text.txt中行?he"打头的行Q你可能?x)先用简单表辑ּ<B><TT>he</TT></B>Q但是这?x)匹配第三行?B><TT>the</TT></B>Q所以要使用正则表达?B><TT>^he</TT></B>Q它只匹配在行首出现?B><TT>h</TT></B>?</P> <P>有时候指定“除?jin)×××都匚w”会(x)比较Ҏ(gu)辑ֈ目的Q当抑扬字符Q?EM>^</EM>Q出现在Ҏ(gu)号中是,它表C“排除”,例如要匹?B><TT>he</TT></B> Q但是排除前面是<B><TT>t</TT></B> or <B><TT>s</TT></B>的情性(也就?B><TT>the</TT></B>?B><TT>s</TT></B><B><TT>he</TT></B>Q,可以使用Q?B><TT>[^st]he</TT></B>?</P> <P>可以使用Ҏ(gu)h指定多个字符区间。例如正则表辑ּ<B><TT>[A-Za-z]</TT></B>匚wM字母Q包括大写和写的;正则表达?B><TT>[A-Za-z][A-Za-z]*</TT></B> 匚w一个字母后面接着0或者多个字母(大写或者小写)(j)。当然我们也可以用元字符<B><TT>+</TT></B>做到同样的事情,也就是:(x)<B><TT>[A-Za-z]+</TT></B> Q和<B><TT>[A-Za-z][A-Za-z]*</TT></B>完全{h(hun)。但是要注意元字W?B><TT>+</TT></B> q不是所有支持正则表辑ּ的程序都支持的。关于这一点可以参考后面的<A >正则表达式语法支持情?/A>?/P> <P>要指定特定数量的匚wQ要使用大括P注意必须使用反斜杠来转义Q。想匚w所?B><TT>100</TT></B>?B><TT>1000</TT></B>的实例而排?B><TT>10</TT></B>?B><TT>10000</TT></B>Q可以用:(x)<B><TT>10\{2,3\}</TT></B>Q这个正则表辑ּ匚w数字1后面跟着2或??的模式。在q个元字W的使用中一个有用的变化是忽略第二个数字Q例如正则表辑ּ<B><TT>0\{3,\}</TT></B> 匹配至?个连l的0?/P> <H2><A name=SimpleCommands></A>单的例子</H2> <P>q里有一些有代表性的、比较简单的例子? <P> <TABLE cellSpacing=2 cellPadding=2> <TBODY> <TR> <TD><B><I>vi 命o(h)</I></B></TD> <TD><B><I>作用</I></B></TD></TR> <TR> <TD> <HR width="100%"> </TD> <TD> <HR width="100%"> </TD></TR> <TR> <TD><B><TT><FONT face="Courier New"><FONT size=+1>:%s/ */ /g</FONT></FONT></TT></B></TD> <TD>把一个或者多个空格替换ؓ(f)一个空根{?/TD></TR> <TR> <TD><B><TT><FONT face="Courier New"><FONT size=+1>:%s/ *$//</FONT></FONT></TT></B></TD> <TD>L行尾的所有空根{?/TD></TR> <TR> <TD><B><TT><FONT face="Courier New"><FONT size=+1>:%s/^/ /</FONT></FONT></TT></B></TD> <TD>在每一行头上加入一个空根{?/TD></TR> <TR> <TD><B><TT><FONT face="Courier New"><FONT size=+1>:%s/^[0-9][0-9]* //</FONT></FONT></TT></B></TD> <TD>L行首的所有数字字W?/TD></TR> <TR> <TD><B><TT><FONT face="Courier New"><FONT size=+1>:%s/b[aeio]g/bug/g</FONT></FONT></TT></B></TD> <TD>所有的<I>bag</I>?I>beg</I>?I>big</I>?I>bog</I>改ؓ(f)<I>bug</I>?nbsp;</TD></TR> <TR> <TD><B><TT><FONT face="Courier New"><FONT size=+1>:%s/t\([aou]\)g/h\1t/g</FONT></FONT></TT></B></TD> <TD>所?I>tag</I>?I>tog</I>?I>tug</I>分别改ؓ(f)<I>hat</I>?I>hot</I>?I>hug</I>Q注意用group的用法和使用\1引用前面被匹配的字符Q?/TD></TR> <TR> <TD></TD> <TD></TD></TR></TBODY></TABLE> <H2><A name=MediumDifficultyExamples></A>中的例子(奇的咒语)(j)</H2> <H3>?</H3> <P>所有方法foo(<I>a,b,c</I>)的实例改为foo(<I>b,a,c</I>)。这里a、b和c可以是Q何提供给Ҏ(gu)foo()的参数。也是说我们要实现q样的{换:(x) <P> <TABLE cellSpacing=4 cellPadding=0> <TBODY> <TR> <TD><B>之前</B></TD> <TD> </TD> <TD><B>之后</B></TD></TR> <TR> <TD><TT>foo(10,7,2)</TT></TD> <TD></TD> <TD><TT>foo(7,10,2)</TT></TD></TR> <TR> <TD><TT>foo(x+13,y-2,10)</TT></TD> <TD></TD> <TD><TT>foo(y-2,x+13,10)</TT></TD></TR> <TR> <TD><TT>foo( bar(8), x+y+z, 5)</TT></TD> <TD></TD> <TD><TT>foo( x+y+z, bar(8), 5)</TT></TD></TR></TBODY></TABLE> <P>下面q条替换命o(h)能够实现q一法Q?/P> <UL><B><TT><FONT face="Courier New">:%s/foo(\([^,]*\),\([^,]*\),\([^)]*\))/foo(\2,\1,\3)/g</FONT></TT></B> </UL> <P>现在让我们把它打散来加以分析。写?gu)个表辑ּ的基本思\是找出foo()和它的括号中的三个参数的位置。第一个参数是用这个表辑ּ来识别的Q:(x)<B><TT><FONT face="Courier New">\([^,]*\)</FONT></TT></B>Q我们可以从里向外来分析它:(x)  <P> <TABLE> <TBODY> <TR> <TD><B><TT><FONT face="Courier New">[^,]</FONT></TT></B></TD> <TD> </TD> <TD>除了(jin)逗号之外的Q何字W?/TD></TR> <TR> <TD><B><TT><FONT face="Courier New">[^,]*</FONT></TT></B></TD> <TD></TD> <TD>0或者多个非逗号字符</TD></TR> <TR> <TD><B><TT><FONT face="Courier New">\([^,]*\)</FONT></TT></B></TD> <TD></TD> <TD>这些非逗号字符标记?B><TT>\1</TT></B>Q这样可以在之后的替换模式表辑ּ中引用它</TD></TR> <TR vAlign=baseline> <TD><B><TT><FONT face="Courier New">\([^,]*\),</FONT></TT></B></TD> <TD></TD> <TD>我们必须扑ֈ0或者多个非逗号字符后面跟着一个逗号Qƈ且非逗号字符那部分要标记出来以备后用?/TD></TR></TBODY></TABLE> <P>现在正是指出一个用正则表辑ּ常见错误的最x(chng)机。ؓ(f)什么我们要使用<B><TT><FONT face="Courier New">[^,]*</FONT></TT></B>q样的一个表辑ּQ而不是更加简单直接的写法Q例如:(x)<B><TT><FONT face="Courier New">.*</FONT></TT></B>Q来匚wW一个参数呢Q设x(chng)们用模?B><TT><FONT face="Courier New">.*</FONT></TT></B>来匹配字W串"10,7,2"Q它应该匚w"10,"q是"10,7,"Qؓ(f)?jin)解册个两义性(ambiguityQ,正则表达式规定一律按照最长的串来Q在上面的例子中是"10,7,"Q显然这样就扑և?jin)两个参数而不是我们期望的一个。所以,我们要?B><TT><FONT face="Courier New">[^,]*</FONT></TT></B>来强制取出第一个逗号之前的部分?/P> <P>q个表达式我们已l分析到?jin)?x)<B><TT><FONT face="Courier New">foo(\([^,]*\)</FONT></TT></B>Q这一D可以简单的译为“当你找?B><TT>foo(</TT></B>把其后直到W一个逗号之前的部分标Cؓ(f)<B><TT><FONT face="Courier New">\1</FONT></TT></B>”。然后我们用同L(fng)办法标记W二个参Cؓ(f)<B><TT><FONT face="Courier New">\2</FONT></TT></B>。对W三个参数的标记Ҏ(gu)也是一P只是我们要搜索所有的字符直到x(chng)受我们ƈ没有必要L索第三个参数Q因为我们不需要调整它的位|,但是q样的模式能够保证我们只L换那些有三个参数的foo()Ҏ(gu)调用Q在foo()是一个重载(overoadingQ方法时q种明确的模式往往是比较保险的。然后,在替换部分,我们扑ֈfoo()的对应实例,然后利用标记好的部分q行替换Q是的第一和第二个参数交换位置?/P> <H3>?</H3>假设有一个CSVQcomma separated valueQ文Ӟ里面有一些我们需要的信息Q但是格式却有问题,目前数据的列序是:(x)姓名Q公司名Q州名羃写,邮政~码Q现在我们希望讲q些数据重新l织Q以便在我们的某个Y件中使用Q需要的格式为:(x)姓名Q州名羃?邮政~码Q公司名。也是_(d)我们要调整列序Q还要合q两个列来构成一个新列。另外,我们的Y件不能接受逗号前后面有MI格Q包括空格和制表W)(j)所以我们还必须要去掉逗号前后的所有空根{? <P>q里有几行我们现在的数据Q?/P> <UL><TT>Bill Jones,     HI-TEK Corporation ,  CA, 95011</TT> <BR><TT><FONT face="Courier New">Sharon Lee Smith,  Design Works Incorporated,  CA, 95012</FONT></TT> <BR><TT><FONT face="Courier New">B. Amos   ,  Hill Street Cafe,  CA, 95013</FONT></TT> <BR><TT><FONT face="Courier New">Alexander Weatherworth,  The Crafts Store,  CA, 95014</FONT></TT> <BR><TT><FONT face="Courier New">...</FONT></TT> </UL>我们希望把它变成q个样子Q? <UL><TT>Bill Jones,CA 95011,HI-TEK Corporation</TT> <BR><TT><FONT face="Courier New">Sharon Lee Smith,CA 95012,Design Works Incorporated</FONT></TT> <BR><TT><FONT face="Courier New">B. Amos,CA 95013,Hill Street Cafe</FONT></TT> <BR><TT><FONT face="Courier New">Alexander Weatherworth,CA 95014,The Crafts Store</FONT></TT> <BR><TT><FONT face="Courier New">...</FONT></TT> </UL>我们用两个正则表达式来解决q个问题。第一个移动列和合q列Q第二个用来LI格? <P>下面是W一个替换命令:(x)</P> <UL><B><TT><FONT face="Courier New">:%s/\([^,]*\),\([^,]*\),\([^,]*\),\(.*\)/\1,\3 \4,\2/</FONT></TT></B> </UL>q里的方法跟?基本一PW一个列Q姓名)(j)用这个表辑ּ来匹配:(x)<B><TT><FONT face="Courier New">\([^,]*\)</FONT></TT></B>Q即W一个逗号之前的所有字W,而姓名内容被?B><TT><FONT face="Courier New">\1</FONT></TT></B>标记下来。公司名和州名羃写字D는同样的方法标Cؓ(f)<B><TT><FONT face="Courier New">\2</FONT></TT></B>?B><TT><FONT face="Courier New">\3</FONT></TT></B>Q而最后一个字D는<B><TT><FONT face="Courier New">\(.*\)</FONT></TT></B>来匹配("匚w所有字W直到行?Q。替换部分则引用上面标记的那些内Ҏ(gu)q行构造? <P>下面q个替换命o(h)则用来去除空|(x)</P> <UL><B><TT><FONT face="Courier New">:%s/[ \t]*,[ \t]*/,/g</FONT></TT></B> </UL>我们q是分解来看Q?B><TT><FONT face="Courier New">[ \t]</FONT></TT></B>匚wI格/制表W,<B><TT><FONT face="Courier New">[ \t]*</FONT></TT></B> 匚w0或多个空?制表W,<B><TT>[ \t]*</TT></B>,匚w0或多个空?制表W后面再加一个逗号Q最后,<B><TT><FONT face="Courier New">[ \t]*,[ \t]*</FONT></TT></B>匚w0或多个空?制表W接着一个逗号再接着0或多个空?制表W。在替换部分Q我们简单的我们扑ֈ的所有东西替换成一个逗号。这里我们用了(jin)l尾的可选的<B><TT>g</TT></B>参数Q这表示在每行中Ҏ(gu)有匹配的串执行替换(而不是缺省的只替换第一个匹配串Q? <H3>?</H3>假设有一个多字符的片断重复出玎ͼ例如Q? <BLOCKQUOTE><TT>Billy tried really hard</TT> <BR><TT>Sally tried really really hard</TT> <BR><TT>Timmy tried really really really hard</TT> <BR><TT>Johnny tried really really really really hard</TT></BLOCKQUOTE>而你x(chng)"really"?really really"Q以?qing)Q意数量连l出现的"really"字符串换成一个简单的"very"Qsimple is good!Q,那么以下命o(h)Q? <BLOCKQUOTE><B><TT>:%s/\(really \)\(really \)*/very /</TT></B></BLOCKQUOTE>׃(x)把上q的文本变成Q? <BLOCKQUOTE><TT>Billy tried very hard</TT> <BR><TT>Sally tried very hard</TT> <BR><TT>Timmy tried very hard</TT> <BR><TT>Johnny tried very hard</TT></BLOCKQUOTE>表达?B><TT>\(really \)*</TT></B>匚w0或多个连l的"really "Q注意结有个空|(j)Q?B><TT>\(really \)\(really \)*</TT></B> 匚w1个或多个q箋(hu)?really "实例? <H2><A name=HardExamples></A>困难的例子(不可思议的象形文字)(j)</H2><I>Coming soon</I>. <P></P> <HR> <H1><A name=Regular_Expressions_In_Various_Tools></A>不同工具中的正则表达?/H1>OKQ你已经准备使用REQregular expressionsQ正则表辑ּQ,但是你ƈ准备使用vi。所以,在这里我们给Z些在其他工具中用RE的例子。另外,我还?sh)(x)ȝ一下你在不同程序之间用RE可能发现的区别? <P>当然Q你也可以在Visual C++~辑器中使用RE。选择Edit->ReplaceQ然后选择"Regular expression"选择框,Find What输入框对应上面介l的vi命o(h)<B><TT>:%s/pat1/pat2/g</TT></B>中的pat1部分Q而Replace输入框对应pat2部分。但是,Z(jin)得到vi的执行范围和<B><TT>g</TT></B>选项Q你要用Replace All或者适当的手工Find Next and ReplaceQ译者按Q知道ؓ(f)啥有人骂微Y弱智?jin)吧Q虽然VC中可以选中一个范围的文本Q然后在其中执行替换Q但是M不够vi那么灉|和典雅)(j)?/P> <H2>sed</H2> <P>Sed?B><U>S</U></B>tream <B><U>ED</U></B>itor的羃写,是Unix下常用的Z文g和管道的~辑工具Q可以在手册中得到关于sed的详l信息?</P> <P>q里是一些有的sed脚本Q假定我们正在处理一个叫做price.txt的文件。注意这些编辑ƈ不会(x)改变源文Ӟsed只是处理源文件的每一行ƈ把结果显C在标准输出中(当然很容易用重定向来定Ӟ(j)Q? <P> <TABLE> <TBODY> <TR> <TD><B><I>sed脚本</I></B></TD> <TD> </TD> <TD><B><I>描述</I></B></TD></TR> <TR> <TD> <HR width="100%"> </TD> <TD></TD> <TD> <HR width="100%"> </TD></TR> <TR vAlign=baseline> <TD><B><TT>sed 's/^$/d' price.txt</TT></B></TD> <TD></TD> <TD>删除所有空?/TD></TR> <TR> <TD><B><TT>sed 's/^[ \t]*$/d' price.txt</TT></B></TD> <TD></TD> <TD>删除所有只包含I格或者制表符的行</TD></TR> <TR> <TD><B><TT>sed 's/"http://g' price.txt</TT></B></TD> <TD></TD> <TD>删除所有引?/TD></TR></TBODY></TABLE></P> <H2>awk</H2>awk是一U编E语aQ可以用来对文本数据q行复杂的分析和处理。可以在手册中得到关于awk的详l信息。这个古怪的名字是它作者们的姓的羃写(AhoQW(xu)einberger和KernighanQ? <P>在AhoQW(xu)einberger和Kernighan的书<U>The AWK Programming Language</U>中有很多很好的awk的例子,请不要让下面q些微不道的脚本例子限制你对awk强大能力的理解。我们同样假定我们针对price.txt文gq行处理Q跟sed一Pawk也只是把l果昄在终端上?nbsp; <P> <TABLE> <TBODY> <TR> <TD><B><I>awk脚本</I></B></TD> <TD> </TD> <TD><B><I>描述</I></B></TD></TR> <TR> <TD> <HR width="100%"> </TD> <TD></TD> <TD> <HR width="100%"> </TD></TR> <TR vAlign=baseline> <TD><B><TT>awk '$0 !~ /^$/' price.txt</TT></B></TD> <TD></TD> <TD>删除所有空?/TD></TR> <TR> <TD><B><TT>awk 'NF > 0' price.txt</TT></B></TD> <TD></TD> <TD>awk中一个更好的删除所有行的办?/TD></TR> <TR vAlign=baseline> <TD><B><TT>awk '$2 ~ /^[JT]/ {print $3}' price.txt</TT></B></TD> <TD></TD> <TD>打印所有第二个字段?J'或?T'打头的行中的W三个字D?/TD></TR> <TR vAlign=baseline> <TD noWrap><B><TT>awk '$2 !~ /[Mm]isc/ {print $3 + $4}' price.txt</TT></B></TD> <TD></TD> <TD>针对所有第二个字段不包?Misc'或?misc'的行Q打印第3和第4列的和(假定为数字)(j)</TD></TR> <TR vAlign=baseline> <TD><B><TT>awk '$3 !~ /^[0-9]+\.[0-9]*$/ {print $0}' price.txt</TT></B></TD> <TD></TD> <TD>打印所有第三个字段不是数字的行Q这里数字是?TT>d.d</TT>或?TT>dq样的Ş式,其中</TT><TT>d</TT>??的Q何数?/TD></TR> <TR vAlign=baseline> <TD><B><TT>awk '$2 ~ /John|Fred/ {print $0}' price.txt</TT></B></TD> <TD></TD> <TD>如果W二个字D包?John'或?Fred'则打印整?/TD></TR></TBODY></TABLE></P> <H2>grep</H2>grep是一个用来在一个或者多个文件或者输入流中用REq行查找的程序。它的name~程语言可以用来针对文g和管道进行处理。可以在手册中得到关于grep的完整信息。这个同样古怪的名字来源于vi的一个命令,<B><TT>g/</TT></B><I>re</I><B><TT>/p</TT></B>Q意思是<B>g</B>lobal <B>r</B>egular <B>e</B>xpression <B>p</B>rint? <P>下面的例子中我们假定在文件phone.txt中包含以下的文本Q——其格式是姓加一个逗号Q然后是名,然后是一个制表符Q然后是?sh)话L(fng)Q?/P> <UL> <P><TT>Francis, John           5-3871</TT> <BR><TT>Wong, Fred              4-4123</TT> <BR><TT>Jones, Thomas           1-4122</TT> <BR><TT>Salazar, Richard        5-2522</TT></P></UL> <P> <TABLE> <TBODY> <TR> <TD><B><I>grep命o(h)</I></B></TD> <TD><B><I> </I></B></TD> <TD><B><I>描述</I></B></TD></TR> <TR> <TD> <HR width="100%"> </TD> <TD></TD> <TD> <HR width="100%"> </TD></TR> <TR vAlign=baseline> <TD><B><TT>grep '\t5-...1' phone.txt</TT></B></TD> <TD></TD> <TD>把所有电(sh)话号码以5开头以1l束的行打印出来Q注意制表符是用<B><TT>\t</TT></B>表示?/TD></TR> <TR vAlign=baseline> <TD noWrap><B><TT>grep '^S[^ ]* R' phone.txt</TT></B></TD> <TD></TD> <TD>打印所有姓以S打头和名以R打头的行</TD></TR> <TR vAlign=baseline> <TD><B><TT>grep '^[JW]' phone.txt</TT></B></TD> <TD></TD> <TD>打印所有姓开头是J或者W的行</TD></TR> <TR vAlign=baseline> <TD><B><TT>grep ', ....\t' phone.txt</TT></B></TD> <TD></TD> <TD>打印所有姓?个字W的行,注意制表W是?B><TT>\t</TT></B>表示?/TD></TR> <TR vAlign=baseline> <TD><B><TT>grep -v '^[JW]' phone.txt</TT></B></TD> <TD></TD> <TD>打印所有不以J或者W开头的?/TD></TR> <TR vAlign=baseline> <TD><B><TT>grep '^[M-Z]' phone.txt</TT></B></TD> <TD></TD> <TD>打印所有姓的开头是M到Z之间M字符的行</TD></TR> <TR vAlign=baseline> <TD><B><TT>grep '^[M-Z].*[12]' phone.txt</TT></B></TD> <TD></TD> <TD>打印所有姓的开头是M到Z之间M字符Qƈ且点号号码结是1或?的行</TD></TR></TBODY></TABLE> <H2>egrep</H2>egrep是grep的一个扩展版本,它在它的正则表达式中支持更多的元字符。下面的例子中我们假定在文gphone.txt中包含以下的文本Q——其格式是姓加一个逗号Q然后是名,然后是一个制表符Q然后是?sh)话L(fng)Q? <UL><TT>Francis, John           5-3871</TT> <BR><TT>Wong, Fred              4-4123</TT> <BR><TT>Jones, Thomas           1-4122</TT> <BR><TT>Salazar, Richard        5-2522</TT> </UL> <P> <TABLE> <TBODY> <TR> <TD><B><I>egrep command</I></B></TD> <TD><B><I> </I></B></TD> <TD><B><I>Description</I></B></TD></TR> <TR> <TD> <HR width="100%"> </TD> <TD></TD> <TD> <HR width="100%"> </TD></TR> <TR vAlign=baseline> <TD><B><TT>egrep '(John|Fred)' phone.txt</TT></B></TD> <TD></TD> <TD>打印所有包含名?I>John</I>或?I>Fred</I>的行</TD></TR> <TR vAlign=baseline> <TD noWrap><B><TT>egrep 'John|22$|^W' phone.txt</TT></B></TD> <TD></TD> <TD>打印所有包?I>John</I> 或者以22l束或者以<I>W</I>的行</TD></TR> <TR> <TD><B><TT>egrep 'net(work)?s' report.txt</TT></B></TD> <TD></TD> <TD>从report.txt中找到所有包?I>networks</I>或?I>nets</I>的行</TD></TR></TBODY></TABLE> <H2> <HR width="100%"> </H2> <H1><A name="Regular Expressions Syntax"></A>正则表达式语法支持情?/H1> <TABLE cellSpacing=0 border=1> <TBODY> <TR> <TD><B>命o(h)或环?/B></TD> <TD><B><TT><FONT face="Courier New">.</FONT></TT></B></TD> <TD><B><TT><FONT face="Courier New">[ ]</FONT></TT></B></TD> <TD><B><TT><FONT face="Courier New">^</FONT></TT></B></TD> <TD><B><TT><FONT face="Courier New">$</FONT></TT></B></TD> <TD><B><TT><FONT face="Courier New">\( \)</FONT></TT></B></TD> <TD><B><TT><FONT face="Courier New">\{ \}</FONT></TT></B></TD> <TD><B><TT><FONT face="Courier New">?</FONT></TT></B></TD> <TD><B><TT><FONT face="Courier New">+</FONT></TT></B></TD> <TD><B><TT><FONT face="Courier New">|</FONT></TT></B></TD> <TD><B><TT><FONT face="Courier New">( )</FONT></TT></B></TD></TR> <TR> <TD>vi</TD> <TD> X </TD> <TD> X </TD> <TD> X </TD> <TD> X </TD> <TD> X </TD> <TD> </TD> <TD> </TD> <TD> </TD> <TD> </TD> <TD> </TD></TR> <TR> <TD>Visual C++</TD> <TD> X </TD> <TD> X </TD> <TD> X </TD> <TD> X </TD> <TD> X </TD> <TD> </TD> <TD> </TD> <TD> </TD> <TD> </TD> <TD> </TD></TR> <TR> <TD>awk</TD> <TD> X </TD> <TD> X </TD> <TD> X </TD> <TD> X </TD> <TD> </TD> <TD> </TD> <TD> X </TD> <TD> X </TD> <TD> X </TD> <TD> X </TD></TR> <TR> <TD>sed</TD> <TD> X </TD> <TD> X </TD> <TD> X </TD> <TD> X </TD> <TD> X </TD> <TD> X </TD> <TD> </TD> <TD> </TD> <TD> </TD> <TD> </TD></TR> <TR> <TD>Tcl</TD> <TD> X </TD> <TD> X </TD> <TD> X </TD> <TD> X </TD> <TD> X </TD> <TD> </TD> <TD> X </TD> <TD> X </TD> <TD> X </TD> <TD> X </TD></TR> <TR> <TD>ex</TD> <TD> X </TD> <TD> X </TD> <TD> X </TD> <TD> X </TD> <TD> X </TD> <TD> X </TD> <TD> </TD> <TD> </TD> <TD> </TD> <TD> </TD></TR> <TR> <TD>grep</TD> <TD> X </TD> <TD> X </TD> <TD> X </TD> <TD> X </TD> <TD> X </TD> <TD> X </TD> <TD> </TD> <TD> </TD> <TD> </TD> <TD> </TD></TR> <TR> <TD>egrep</TD> <TD> X </TD> <TD> X</TD> <TD> X </TD> <TD> X </TD> <TD> X </TD> <TD> </TD> <TD> X </TD> <TD> X </TD> <TD> X </TD> <TD> X </TD></TR> <TR> <TD>fgrep</TD> <TD> X </TD> <TD> X </TD> <TD> X </TD> <TD> X </TD> <TD> X </TD> <TD> </TD> <TD> </TD> <TD> </TD> <TD> </TD> <TD> </TD></TR> <TR> <TD>perl</TD> <TD> X</TD> <TD> X</TD> <TD> X</TD> <TD> X</TD> <TD> X</TD> <TD> </TD> <TD> X</TD> <TD> X</TD> <TD> X</TD> <TD> X</TD></TR></TBODY></TABLE> <P> </P> <HR> <H1><A name=ViSubstitutionCommandSyntax></A>vi替换命o(h)?/H1>Vi的替换命令:(x) <UL><B><TT>:</TT></B><I>range</I><B><TT>s/</TT></B><I>pat1</I><B><TT>/</TT></B><I>pat2</I><B><TT>/g</TT></B> </UL>其中 <UL><B><TT>:</TT></B> q是Vi的命令执行界面?</UL> <UL><I>range </I>是命令执行范围的指定Q可以用百分号Q?Q表C所有行Q用点Q?Q表C当前行Q用美元符P$Q表C最后一行。你q可以用行P例如<B><TT>10,20</TT></B>表示W?0?0行,<B><TT>.,$</TT></B>表示当前行到最后一行,<B><TT>.+2,$-5</TT></B>表示当前行后两行直到全文的倒数W五行,{等? <P><B><TT>s</TT></B> 表示其后是一个替换命令?/P> <P><I>pat1 </I>q是要查扄一个正则表辑ּQ这文章中有一大堆例子?/P></UL> <UL><I>pat2 </I>q是希望把匹配串变成的模式的正则表达式,q篇文章中有一大堆例子? <P><B><TT>g</TT></B> 可选标志,带这个标志表C替换将针对行中每个匚w的串q行Q否则则只替换行中第一个匹配串?/P></UL>|上有很多vi的在U手册,你可以访问他们以获得更加完整的信息?<img src ="http://www.aygfsteel.com/Titan/aggbug/28844.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/Titan/" target="_blank">Titan</a> 2006-01-20 23:58 <a href="http://www.aygfsteel.com/Titan/articles/28844.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>1M内存可用来缓存多对象? http://www.aygfsteel.com/Titan/articles/28367.htmlTitanTitanTue, 17 Jan 2006 13:18:00 GMThttp://www.aygfsteel.com/Titan/articles/28367.htmlhttp://www.aygfsteel.com/Titan/comments/28367.htmlhttp://www.aygfsteel.com/Titan/articles/28367.html#Feedback0http://www.aygfsteel.com/Titan/comments/commentRss/28367.htmlhttp://www.aygfsteel.com/Titan/services/trackbacks/28367.html
 1public void testSpike(){
 2        print("最大的内存?sh)?x)"+Runtime.getRuntime().maxMemory()/1024);
 3        print("ȝ内存?sh)?x)"+Runtime.getRuntime().totalMemory()/1024);
 4        print("==================================");
 5        long currMemory=Runtime.getRuntime().freeMemory();
 6        print("目前可用的内存(sh)ؓ(f)Q?/SPAN>"+currMemory/1024);
 7        print("==================================");
 8        Map cache=new HashMap();
 9        for (int i = 0; i < 500000; i++{
10            MockBean bean=new MockBean();
11            bean.setId(i);
12            bean.setName("jerry"+i);
13            bean.setValue(i+"jerry");
14            cache.put(String.valueOf(i), bean);
15            long tempMemory=Runtime.getRuntime().freeMemory();
16            if((currMemory-tempMemory)/1024==1024){
17                print("此时可用的内存(sh)ؓ(f)Q?/SPAN>"+tempMemory/1024);
18                print("此时~存?sh)(jin)?x)"+i+"个对?/SPAN>");
19                break;
20            }

21        }

22        print("==================================");
23        cache.clear();
24        long tempMemory=Runtime.getRuntime().freeMemory();
25        print("目前可用的内存(sh)ؓ(f)Q?/SPAN>"+tempMemory/1024);
26        print("消耗的内存?sh)?x)"+(currMemory-tempMemory)/1024);
27        print("==================================");
28        Runtime.getRuntime().gc();
29        tempMemory=Runtime.getRuntime().freeMemory();
30        print("目前可用的内存(sh)ؓ(f)Q?/SPAN>"+tempMemory/1024);
31        print("消耗的内存?sh)?x)"+(currMemory-tempMemory)/1024);
32    }

33    
34    private void print(String msg){
35        System.out.println(msg);
36    }
在我机器上运行的l果?M内存可缓存大?479个对象,同时可以看到Q在cache.clear后内存ƈ没有变化Q因为gc是没那么?qing)时的,q个时候显式的调用gc则会(x)发现可用的内存量甚至比最初都多,呵呵
当然Q这里只是个单的试Q这里测试的也只是缓存(sh)个非常简单的bean对象Q缓存的对象消耗的内存大小q需要根据这个对象中具体的内容而定Q比如当~存的是blobcd的字D늚时候,可想而知Q这个时候消耗的内存量绝Ҏ(gu)不同的?BR>q里只是大家在对pȝ性能做优化时最好根据需要缓存的内容做一个估,讄好应用所需要的jvm的内存|以便充分利用服务器的g资源?

Titan 2006-01-17 21:18 发表评论
]]>
[转]一些好用的Eclipse 3.0插g http://www.aygfsteel.com/Titan/articles/28063.htmlTitanTitanSat, 14 Jan 2006 16:09:00 GMThttp://www.aygfsteel.com/Titan/articles/28063.htmlhttp://www.aygfsteel.com/Titan/comments/28063.htmlhttp://www.aygfsteel.com/Titan/articles/28063.html#Feedback0http://www.aygfsteel.com/Titan/comments/commentRss/28063.htmlhttp://www.aygfsteel.com/Titan/services/trackbacks/28063.html1.MyEclipse  J2EE开发插Ӟ支持SERVLET/JSP/EJB/数据库操U늭
http://www.myeclipseide.com/
 
2.Properties Editor  ~辑java的属性文Ӟq可以自动存盘(sh)ؓ(f)Unicode格式
http://propedit.sourceforge.jp/index_en.html
 
3.Colorer Take  Z癄cd的文件按语法着?BR>http://colorer.sourceforge.net/
 
4.XMLBuddy ~辑xml文g
http://www.xmlbuddy.com/
 
5.Code Folding  加入多种代码折叠功能Q比eclipse自带的更多)(j)
http://www.coffee-bytes.com/servlet/PlatformSupport
 
6.Easy Explorer  从eclipse中访问选定文g、目录所在的文g?BR>http://easystruts.sourceforge.net/
 
7.Fat Jar 打包插gQ可以方便的完成各种打包dQ可以包含外部的包等
http://fjep.sourceforge.net/
 
8.RegEx Test 试正则表达?BR>http://brosinski.com/stephan/archives/000028.php
 
9.JasperAssistant 报表插gQ强Q要qQ?BR>http://www.jasperassistant.com/
 
10.Jigloo GUI Builder QAQӞ的GQテ~辑插g
http://cloudgarden.com/jigloo/
 
11.Profiler 性能跟踪、测量工P能跟t、测量Q程?BR>http://sourceforge.net/projects/eclipsecolorer/
 
12.AdvanQas 提供对if/else{条件语句的提示和快捷帮助(自动更改l构{)(j)
http://eclipsecolorer.sourceforge.net/advanqas/index.html
 
13.Log4E     Log4j插gQ提供各U和Log4j相关的Q务,如ؓ(f)Ҏ(gu)、类d一个logger{?BR>http://log4e.jayefem.de/index.php/Main_Page
 
14.VSSPlugin VSS插g
http://sourceforge.net/projects/vssplugin
 
15.Implementors   提供跌{C个方法的实现c,而不是接中的功能Q实?Q?BR>http://eclipse-tools.sourceforge.net/implementors/
 
16.Call Hierarchy 昄一个方法的调用层次Q被哪些Ҏ(gu)调,调了(jin)哪些Ҏ(gu)Q?BR>http://eclipse-tools.sourceforge.net/call-hierarchy/index.html
 
17.EclipseTidy (g)查和格式化HTML/XML文g
http://eclipsetidy.sourceforge.net/
 
18.Checkclipse (g)查代码的风格、写法是否符合规?BR>http://www.mvmsoft.de/content/plugins/checkclipse/checkclipse.htm
 
19.Hibernate Synchronizer Hibernate插gQ自动映等
http://www.binamics.com/hibernatesync/
 
20.VeloEclipse  Velocity插g
http://propsorter.sourceforge.net/
 
21.EditorList   方便的列出所有打开的Editor
http://editorlist.sourceforge.net/
 
22.MemoryManager 内存占用率的监视
http://cloudgarden.com/memorymanager/


Titan 2006-01-15 00:09 发表评论
]]>
[转]JDBCq接数据库经验技巧集?http://www.aygfsteel.com/Titan/articles/28060.htmlTitanTitanSat, 14 Jan 2006 16:02:00 GMThttp://www.aygfsteel.com/Titan/articles/28060.htmlhttp://www.aygfsteel.com/Titan/comments/28060.htmlhttp://www.aygfsteel.com/Titan/articles/28060.html#Feedback0http://www.aygfsteel.com/Titan/comments/commentRss/28060.htmlhttp://www.aygfsteel.com/Titan/services/trackbacks/28060.html
  一、连接各U数据库方式速查?/B>

  下面|列?jin)各U数据库使用JDBCq接的方式,可以作ؓ(f)一个手册用?

  1、Oracle8/8i/9i数据库(thin模式Q?

Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
String url="jdbc:oracle:thin:@localhost:1521:orcl"; //orcl为数据库的SID
String user="test";
String password="test";
Connection conn= DriverManager.getConnection(url,user,password);

  2、DB2数据?

Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance();
String url="jdbc:db2://localhost:5000/sample"; //sampleZ的数据库?
String user="admin";
String password="";
Connection conn= DriverManager.getConnection(url,user,password);

  3、Sql Server7.0/2000数据?

Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb";
//mydb为数据库
String user="sa";
String password="";
Connection conn= DriverManager.getConnection(url,user,password);

  4、Sybase数据?

Class.forName("com.sybase.jdbc.SybDriver").newInstance();
String url =" jdbc:sybase:Tds:localhost:5007/myDB";//myDBZ的数据库?
Properties sysProps = System.getProperties();
SysProps.put("user","userid");
SysProps.put("password","user_password");
Connection conn= DriverManager.getConnection(url, SysProps);

  5、Informix数据?

Class.forName("com.informix.jdbc.IfxDriver").newInstance();
String url = "jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver;
user=testuser;password=testpassword"; //myDB为数据库?
Connection conn= DriverManager.getConnection(url);

  6、MySQL数据?

Class.forName("org.gjt.mm.mysql.Driver").newInstance();
String url ="jdbc:mysql://localhost/myDB?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1"
//myDB为数据库?
Connection conn= DriverManager.getConnection(url);

  7、PostgreSQL数据?

Class.forName("org.postgresql.Driver").newInstance();
String url ="jdbc:postgresql://localhost/myDB" //myDB为数据库?
String user="myuser";
String password="mypassword";
Connection conn= DriverManager.getConnection(url,user,password);

  8、access数据库直q用ODBC?BR>
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver") ;
String url="jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ="+application.getRealPath("/Data/ReportDemo.mdb");
Connection conn = DriverManager.getConnection(url,"","");
Statement stmtNew=conn.createStatement() ;

  二、JDBCq接MySql方式

  下面是用JDBCq接MySql的一个小的教E?

  1、查N动程?BR>
  MySQL目前提供的java驱动E序为Connection/JQ可以从MySQL官方|站下蝲Qƈ扑ֈmysql-connector-java-3.0.15-ga-bin.jar文gQ此驱动E序为纯java驱动E序Q不需做其他配|?BR>
  2、动态指定classpath

  如果需要执行时动态指定classpathQ就在执行时采用Qcp方式。否则将上面?jar文g加入到classpath环境变量中?BR>
  3、加载驱动程?BR>
try{
 Class.forName(com.mysql.jdbc.Driver);
 System.out.println(Success loading Mysql Driver!);
}catch(Exception e)
{
 System.out.println(Error loading Mysql Driver!);
 e.printStackTrace();
}

  4、设|连接的url

jdbcQmysqlQ?/localhost/databasename[?pa=va][Qpa=va]

  三、以下列Z(jin)在用JDBC来连接Oracle数据库时可以使用的一些技?/B>

  1、在客户端Y件开发中使用Thin驱动E序

  在开发Java软g斚wQOracle的数据库提供?jin)四U类型的驱动E序Q二U用于应用Y件、applets、servlets{客L(fng)软gQ另外二U用于数据库中的Java存储q程{服务器端Y件。在客户机端软g的开发中Q我们可以选择OCI驱动E序或Thin驱动E序。OCI驱动E序利用Java本地化接口(JNIQ,通过Oracle客户端Y件与数据库进行通讯。Thin驱动E序是纯Java驱动E序Q它直接与数据库q行通讯。ؓ(f)?jin)获得最高的性能QOracle在客L(fng)软g的开发中使用OCI驱动E序Q这g是正的。但我徏议用Thin驱动E序Q因为通过多次试发现Q在通常情况下,Thin驱动E序的性能都超q了(jin)OCI驱动E序?BR>
  2、关闭自动提交功能,提高pȝ性能

  在第一ơ徏立与数据库的q接Ӟ在缺省情况下Q连接是在自动提交模式下的。ؓ(f)?jin)获得更好的性能Q可以通过调用带布?yu)(dng)值false参数的ConnectioncȝsetAutoCommit()Ҏ(gu)关闭自动提交功能Q如下所C:(x)

  conn.setAutoCommit(false);

  值得注意的是Q一旦关闭了(jin)自动提交功能Q我们就需要通过调用Connectioncȝcommit()和rollback()Ҏ(gu)来h工的方式对事务进行管理?BR>
  3、在动态SQL或有旉限制的命令中使用Statement对象

  在执行SQL命o(h)Ӟ我们有二U选择Q可以用PreparedStatement对象Q也可以使用Statement对象。无论多次C用同一个SQL命o(h)QPreparedStatement都只对它解析和编译一ơ。当使用Statement对象Ӟ每次执行一个SQL命o(h)Ӟ都会(x)对它q行解析和编译。这可能?x)你认为,使用PreparedStatement对象比用Statement对象的速度更快。然而,我进行的试表明Q在客户端Y件中Q情况ƈ非如此。因此,在有旉限制的SQL操作中,除非成批地处理SQL命o(h)Q我们应当考虑使用Statement对象?BR>
  此外Q用Statement对象也得编写动态SQL命o(h)更加单,因ؓ(f)我们可以字W串q接在一P建立一个有效的SQL命o(h)。因此,我认为,Statement对象可以使动态SQL命o(h)的创建和执行变得更加单?BR>
  4、利用helper函数对动态SQL命o(h)q行格式?BR>
  在创Z用Statement对象执行的动态SQL命o(h)Ӟ我们需要处理一些格式化斚w的问题。例如,如果我们惛_Z个将名字O'Reilly插入表中的SQL命o(h)Q则必须使用二个相连的?'”号替换O'Reilly中的?”号。完成这些工作的最好的Ҏ(gu)是创Z个完成替换操作的helperҎ(gu)Q然后在q接字符串心(j)服用公式表达一个SQL命o(h)Ӟ使用创徏的helperҎ(gu)。与此类似的是,我们可以让helperҎ(gu)接受一个Date型的|然后让它输出ZOracle的to_date()函数的字W串表达式?BR>
  5、利用PreparedStatement对象提高数据库的M效率

  在用PreparedStatement对象执行SQL命o(h)Ӟ命o(h)被数据库q行解析和编译,然后被放到命令缓冲区。然后,每当执行同一个PreparedStatement对象Ӟ它就?x)被再解析一ơ,但不?x)被再次~译。在~冲Z可以发现预编译的命o(h)Qƈ且可以重C用。在有大量用L(fng)企业U应用Y件中Q经怼(x)重复执行相同的SQL命o(h)Q用PreparedStatement对象带来的编译次数的减少能够提高数据库的M性能。如果不是在客户端创建、预备、执行PreparedStatementd需要的旉长于StatementdQ我?x)徏议在除动态SQL命o(h)之外的所有情况下使用PreparedStatement对象?BR>
  6、在成批处理重复的插入或更新操作中用PreparedStatement对象

  如果成批地处理插入和更新操作Q就能够显著地减它们所需要的旉。Oracle提供的Statement?CallableStatementq不真正地支持批处理Q只有PreparedStatement对象才真正地支持批处理。我们可以用addBatch()和executeBatch()Ҏ(gu)选择标准的JDBC批处理,或者通过利用PreparedStatement对象的setExecuteBatch()Ҏ(gu)和标准的executeUpdate()Ҏ(gu)选择速度更快的Oracle专有的方法。要使用Oracle专有的批处理机制Q可以以如下所C的方式调用setExecuteBatch()Q?BR>
PreparedStatement pstmt3D null;
try {
 ((OraclePreparedStatement)pstmt).setExecuteBatch(30);
 ...
 pstmt.executeUpdate();
}

  调用setExecuteBatch()时指定的值是一个上限,当达到该值时Q就?x)自动地引发SQL命o(h)执行Q标准的executeUpdate()Ҏ(gu)׃(x)被作为批处理送到数据库中。我们可以通过调用PreparedStatementcȝsendBatch()Ҏ(gu)随时传输批处理Q务?BR>
  7、用Oracle locatorҎ(gu)插入、更新大对象QLOBQ?BR>
  Oracle的PreparedStatementcM完全支持BLOB和CLOB{大对象的处理,其是Thin驱动E序不支持利用PreparedStatement对象的setObject()和setBinaryStream()Ҏ(gu)讄BLOB的|也不支持利用setCharacterStream()Ҏ(gu)讄CLOB的倹{只有locator本n中的Ҏ(gu)才能够从数据库中获取LOBcd的倹{可以用PreparedStatement对象插入或更新LOBQ但需要用locator才能获取LOB的倹{由于存在这二个问题Q因此,我徏议用locator的方法来插入、更新或获取LOB的倹{?BR>
  8、用SQL92语法调用存储q程

  在调用存储过E时Q我们可以用SQL92或Oracle PL/SQLQ由于用Oracle PL/SQLq没有什么实际的好处Q而且?x)给以后l护你的应用E序的开发h员带来麻?ch),因此Q我在调用存储过E时使用SQL92?BR>
  9、用Object SQL对象模式{Ud数据库中

  既然可以Oracle的数据库作ؓ(f)一U面向对象的数据库来使用Q就可以考虑应用程序中的面向对象模式{到数据库中。目前的Ҏ(gu)是创建Java bean作ؓ(f)伪装的数据库对象Q将它们的属性映到关系表中Q然后在q些bean中添加方法。尽这样作在Java中没有什么问题,但由于操作都是在数据库之外进行的Q因此其他访问数据库的应用Y件无法利用对象模式。如果利用Oracle的面向对象的技术,可以通过创徏一个新的数据库对象cd在数据库中模仿其数据和操作,然后使用JPublisher{工L(fng)成自qJava beancR如果用这U方式,不但Java应用E序可以使用应用软g的对象模式,其他需要共享你的应用中的数据和操作的应用Y件也可以使用应用软g中的对象模式?BR>
  10、利用SQL完成数据库内的操?BR>
  我要向大家介l的最重要的经验是充分利用SQL的面向集合的Ҏ(gu)来解x(chng)据库处理需求,而不是用Java{过E化的编E语a?BR>
  如果~程人员要在一个表中查找许多行Q结果中的每个行都会(x)查找其他表中的数据,最后,~程人员创徏?jin)独立的UPDATE命o(h)来成批地更新W一个表中的数据。与此类似的d可以通过在set子句中用多列子查询而在一个UPDATE命o(h)中完成。当能够在单一的SQL命o(h)中完成Q务,何必要让数据在网上流来流ȝQ我用户认真学习(fn)如何最大限度地发挥SQL的功能?


Titan 2006-01-15 00:02 发表评论
]]>
[转]Java操作Excel完美解决Ҏ(gu)http://www.aygfsteel.com/Titan/articles/23051.htmlTitanTitanThu, 08 Dec 2005 15:03:00 GMThttp://www.aygfsteel.com/Titan/articles/23051.htmlhttp://www.aygfsteel.com/Titan/comments/23051.htmlhttp://www.aygfsteel.com/Titan/articles/23051.html#Feedback0http://www.aygfsteel.com/Titan/comments/commentRss/23051.htmlhttp://www.aygfsteel.com/Titan/services/trackbacks/23051.html
  本篇文章׃D例示范如何利用Java 创徏和读取Excel文档Qƈ讄单元格的字体和格式?

  Z(jin)保证CZE序的运行,必须安装Java 2 sdk1.4.0 和Jakarta POIQJakarta POI?A class=bluekey target=_blank>Web站点? http://jakarta.apache.org/poi/

  创徏Excel 文档

  CZ1演C如何利用Jakarta POI API 创徏Excel 文档?

  CZ1E序如下Q?BR>
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFCell;
import java.io.FileOutputStream;
public class CreateXL {

 /** Excel 文g要存攄位置Q假定在D盘JTest目录?/

 public static String outputFile="D:/JTest/ gongye.xls";

 public static void main(String argv[]){

 try{

  // 创徏新的Excel 工作?BR>
  HSSFWorkbook workbook = new HSSFWorkbook();

  // 在Excel工作中Z工作表,其名为缺省?BR>      // 如要新徏一名ؓ(f)"效益指标"的工作表Q其语句为:(x)
      // HSSFSheet sheet = workbook.createSheet("效益指标");

  HSSFSheet sheet = workbook.createSheet();

  // 在烦(ch)?的位|创Q最端的行Q?BR>
  HSSFRow row = sheet.createRow((short)0);

  //在烦(ch)?的位|创建单元格Q左上端Q?BR>  HSSFCell cell = row.createCell((short) 0);
  // 定义单元gؓ(f)字符串类?BR>  cell.setCellType(HSSFCell.CELL_TYPE_STRING);
  // 在单元格中输入一些内?BR>  cell.setCellValue("增加?);
  // 新徏一输出文g?BR>  FileOutputStream fOut = new FileOutputStream(outputFile);
  // 把相应的Excel 工作存?BR>  workbook.write(fOut);
  fOut.flush();
  // 操作l束Q关闭文?BR>  fOut.close();
  System.out.println("文g生成...");

 }catch(Exception e) {
  System.out.println("已运?xlCreate() : " + e );
 }
}
}

  dExcel文档中的数据

  CZ2演C如何读取Excel文档中的数据。假定在D盘JTest目录下有一个文件名为gongye.xls的Excel文g?BR>
  CZ2E序如下Q?BR>
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFCell;
import java.io.FileInputStream;
public class ReadXL {
 /** Excel文g的存放位|。注意是正斜U?/
 public static String fileToBeRead="D:/JTest/ gongye.xls";
 public static void main(String argv[]){
 try{
  // 创徏对Excel工作文件的引用
  HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(fileToBeRead));
  // 创徏对工作表的引用?BR>  // 本例是按名引用(让我们假定那张表有着~省?Sheet1"Q?BR>  HSSFSheet sheet = workbook.getSheet("Sheet1");
  // 也可用getSheetAt(int index)按烦(ch)引引用,
  // 在Excel文档中,W一张工作表的缺省烦(ch)引是0Q?BR>  // 其语句ؓ(f)QHSSFSheet sheet = workbook.getSheetAt(0);
  // d左上端单?BR>  HSSFRow row = sheet.getRow(0);
  HSSFCell cell = row.getCell((short)0);
  // 输出单元内容Qcell.getStringCellValue()是取所在单元的?BR>  System.out.println("左上端单元是Q?" + cell.getStringCellValue());
 }catch(Exception e) {
  System.out.println("已运行xlRead() : " + e );
 }
}
}

  讄单元格格?/B>

  在这里,我们只介绍一些和格式讄有关的语句,我们假定workbook是对一个工作簿的引用。在Java中,W一步要做的是创徏和设|字体和单元格的格式Q然后再应用q些格式Q?BR>
  1、创建字体,讄其ؓ(f)U色、粗体:(x)

HSSFFont font = workbook.createFont();
font.setColor(HSSFFont.COLOR_RED);
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

  2、创建格?BR>
HSSFCellStyle cellStyle= workbook.createCellStyle();
cellStyle.setFont(font);

  3、应用格?

HSSFCell cell = row.createCell((short) 0);
cell.setCellStyle(cellStyle);
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cell.setCellValue("标题 ");


Titan 2005-12-08 23:03 发表评论
]]>
վ֩ģ壺 | Զ| | ֶ| | ͭϿ| | ɽ| | Դ| | | | Ϫ| | | | | ǭ| Ѿ| | | ͨ| | ڰ| | | żҿ| ն| | Թ| ʯ| Ȫ| մ| ƽ| | | Դ| ɽʡ| | |