??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲成aⅴ人片久青草影院按摩,亚洲黄页网在线观看,亚洲国产精品美女久久久久http://www.tkk7.com/standlww/archive/2009/04/28/267807.html李威?/dc:creator>李威?/author>Mon, 27 Apr 2009 16:01:00 GMThttp://www.tkk7.com/standlww/archive/2009/04/28/267807.htmlhttp://www.tkk7.com/standlww/comments/267807.htmlhttp://www.tkk7.com/standlww/archive/2009/04/28/267807.html#Feedback0http://www.tkk7.com/standlww/comments/commentRss/267807.htmlhttp://www.tkk7.com/standlww/services/trackbacks/267807.html1.OpenerQ获取创建本H口的窗口的引用Q不在本H口的对象层ơ体pM

只能在用window.open打开的页面中H口中可以访问到opener属性,而对于用showModalDialog和showModalessDialog弹出的窗口则不能讉K刎ͼ其opener属性引用ؓI?/p>

2.parentQtopQ获取的是对本窗口中对象层次元素的引用,对于用iframe或者frame的较有实际意?br /> 对于用window.open和showModalDialog以及showModalessDialog打开的窗口而言Q返回的是本H口对象层次的元素引用,对于q种情况QparentQtopQself三者的引用相同Q都是当前的H体自nQ但对于H体中的frame和iframe加蝲的页面元素来_q回的则不相同。parent q回的时包含该iframe的页面窗口引用,top则返回最上层的窗口引用,self当然q回的仍然是自n的引用?br />  
3.selfQwindow都是获取当前面H口自n对象的引?br /> 每个面自n代码中访问页面自w窗体可以采用self和window来访问到?br />  
4.利用window参数传递和dialogArguments来获取弹出窗口的H口引用
Z能够在用showModalDialog和showModalessDialog弹出H口中引用到弹出H口的引用,我们可以在showModalDialog和showModalessDialog的第二个参数传入windowQ然后再弹出的页面中用dialogArguments来获取刚才传入的windowQ即弹出H口的窗口的引用?br />



]]>
我对wait()的一点理?/title><link>http://www.tkk7.com/standlww/archive/2008/10/20/235539.html</link><dc:creator>李威?/dc:creator><author>李威?/author><pubDate>Mon, 20 Oct 2008 13:20:00 GMT</pubDate><guid>http://www.tkk7.com/standlww/archive/2008/10/20/235539.html</guid><wfw:comment>http://www.tkk7.com/standlww/comments/235539.html</wfw:comment><comments>http://www.tkk7.com/standlww/archive/2008/10/20/235539.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/standlww/comments/commentRss/235539.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/standlww/services/trackbacks/235539.html</trackback:ping><description><![CDATA[<p>wait()与sleep()的区别相信很多h都懂了,在这里我׃说了?br />   </p> <p><span>wait()Q?span style="background-color: yellow">Ҏ对象调用waitҎD本线E放弃对象锁</span></span><span>Q进入等待此对象的等待锁定池Q只有针Ҏ对象发出</span>notify<span>ҎQ或</span>notifyAll<span>Q后本线E才q入对象锁定池准备获得对象锁q入q行状态?/span></p> <p><br /> public class ThreadTest {</p> <p> <br />  static int i=0;<br />  <br />  public static void main(String[] args) {<br />   new ThreadTest().setInt(5);<br />   <br />   System.out.println(i);</p> <p> }<br />  <br />  public  void setInt(int i){<br />   this.i=i;<br />   try {<br />    this.wait();<br />   } catch (InterruptedException e) {<br />    <br />    e.printStackTrace();<br />   }<br />   <br />  }</p> <p>}<br /> </p> <p dir="ltr"><br /> 因此在对上述概念较充分理解后Q你׃明白以上q个E序错在哪里Q?br /> <br /> 在eclipse~写和编译ƈ没有错,但当q行后eclipse提示QIllegalMonitorStateException: current thread not owner<br /> <br /> Exception in thread "main" java.lang.IllegalMonitorStateException: current thread not owner<br />  at java.lang.Object.wait(Native Method)<br />  at java.lang.Object.wait(Unknown Source)<br />  at standlww.project.ThreadTest.setInt(ThreadTest.java:21)<br />  at standlww.project.ThreadTest.main(ThreadTest.java:12)Exception in thread "main" java.lang.IllegalMonitorStateException: current thread not owner<br />  at java.lang.Object.wait(Native Method)<br />  at java.lang.Object.wait(Unknown Source)<br />  at standlww.project.ThreadTest.setInt(ThreadTest.java:21)<br />  at standlww.project.ThreadTest.main(ThreadTest.java:12)<br /> <br /> 原因在于<span style="background-color: yellow">Ҏ对象调用waitҎD本线E放弃对象锁</span><span style="background-color: yellow">Ҏ对象调用waitҎD本线E放弃对象锁<span style="background-color: #ffffff">Q?nbsp;public  void setInt(int i)Ҏ没有加锁Q是个不需要加锁就能运行得Ҏ?br /> </span></span><br /> </p> <img src ="http://www.tkk7.com/standlww/aggbug/235539.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/standlww/" target="_blank">李威?/a> 2008-10-20 21:20 <a href="http://www.tkk7.com/standlww/archive/2008/10/20/235539.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于生者与消费者之间的问题http://www.tkk7.com/standlww/archive/2008/10/20/235534.html李威?/dc:creator>李威?/author>Mon, 20 Oct 2008 12:55:00 GMThttp://www.tkk7.com/standlww/archive/2008/10/20/235534.htmlhttp://www.tkk7.com/standlww/comments/235534.htmlhttp://www.tkk7.com/standlww/archive/2008/10/20/235534.html#Feedback0http://www.tkk7.com/standlww/comments/commentRss/235534.htmlhttp://www.tkk7.com/standlww/services/trackbacks/235534.html
以下是偶写的一个关于生产者与消费者的E序Q看看对你理解有没有帮助?br />

//生?br />  class Producer implements Runnable{
 private WOWOTou wwt=null;
 private Basket bs=null;
 private static int id=1;
 private static boolean state=true;
 
 Producer(Basket bs){
  this.bs=bs;
 }
 
 public  WOWOTou produce(){
  try {
   Thread.sleep( (long) (Math.random()*8000));
  } catch (InterruptedException e) {
   
   e.printStackTrace();
  }
  wwt=new WOWOTou(id);

  //输出调试语句
  System.out.println();
  System.out.println(Thread.currentThread().getName()+"生了id?+id+"的包?);  

  id++;
  return wwt;
 }

 public void push(){
  bs.push(wwt);
  wwt=null;
 }
 
 public void run() {
 
  while(state){
   synchronized(this){
    produce();
    push();
   }
  
  }
  
 }
 
}




//消费?br /> class Custmer implements Runnable{
 
 private Basket bs=null;
 private WOWOTou wwt=null;
 private static boolean state=true;
 
 public Custmer(Basket bs) {
  this.bs = bs;
 }
 
  
 public  void cousme(){
  try{
   Thread.sleep((long) (Math.random()*8000));
  }catch(InterruptedException e){
   e.printStackTrace();
  }

  // 输出调试语句
  System.out.println();
  System.out.println(Thread.currentThread().getName()+"消费id?+wwt.getWOWOTouID()+"的包?);  

  wwt=null;
  
 }

 public void pop(){
  wwt=bs.pop();
 }
 
 public void run() {
  while(state){
   synchronized(this){
    pop();
    cousme();
   }  
  }
  
 }


}

 


//装WOWOTou的Basket
class Basket{
 
 private int index=0;
 private  final static int max=5;
 private WOWOTou wwt=null;
 private WOWOTou[] wwtbs=new WOWOTou[5];
 private Producer p=null;
 private static Basket bs=null;
 
 private Basket(){}
 
 public synchronized static Basket getBasket(){
  if(bs==null)
   bs=new Basket();
  
  return bs;
 }
 
 
 public synchronized void  push(WOWOTou wwt){
  
  while(index==max){
   System.out.println("包子满了Q赶紧吃包子");
   try {
    this.wait();
   } catch (InterruptedException e) {    
    e.printStackTrace();
   }
  }
   this.notify();

 //输出调试语句
   System.out.println();
   System.out.println("q是"+Thread.currentThread().getName()+"生的id?+wwt.getWOWOTouID()+"的包?);
   
  wwtbs[index++]=wwt;       
 }
 
 public synchronized WOWOTou pop(){
  while(index==0){
   System.out.println();
   System.out.println("没包子了Q赶紧生产包?);
   try{
    this.wait();
   }catch(InterruptedException e){
    e.printStackTrace();
   }
  }
   this.notify();
   if(index>0)
    index--;

  //输出调试语句
   System.out.println();
   System.out.println(Thread.currentThread().getName()+"拿到id?+wwtbs[index].getWOWOTouID()+"的包?); 

  return wwtbs[index];
 }
}

 


class WOWOTou{
 
 private int id=0;
 
 WOWOTou(int id){
  this.id=id;
  
 }
 
 public int getWOWOTouID(){
  return id;
 }
}



当你明白U程后,应该考虑多线E和U程的性能问题Q尽量减锁的粒度,但要注意死锁问题?

]]>
Java JDK1.5 U程池的使用http://www.tkk7.com/standlww/archive/2008/10/19/235301.html李威?/dc:creator>李威?/author>Sun, 19 Oct 2008 06:49:00 GMThttp://www.tkk7.com/standlww/archive/2008/10/19/235301.htmlhttp://www.tkk7.com/standlww/comments/235301.htmlhttp://www.tkk7.com/standlww/archive/2008/10/19/235301.html#Feedback0http://www.tkk7.com/standlww/comments/commentRss/235301.htmlhttp://www.tkk7.com/standlww/services/trackbacks/235301.html

一、简?br /> U程池类?java.util.concurrent.ThreadPoolExecutorQ常用构造方法ؓQ?br />
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,
long keepAliveTime, TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler)

corePoolSizeQ?U程池维护线E的最数?br /> maximumPoolSizeQ线E池l护U程的最大数?br /> keepAliveTimeQ?U程池维护线E所允许的空闲时?br /> unitQ?U程池维护线E所允许的空闲时间的单位
workQueueQ?U程池所使用的缓冲队?br /> handlerQ?U程池对拒绝d的处理策?br />
一个Q务通过 execute(Runnable)Ҏ被添加到U程池,d是一?Runnablecd的对象,d的执行方法就?Runnablecd对象的run()Ҏ?br />
当一个Q务通过execute(Runnable)ҎƲ添加到U程池时Q?br />
如果此时U程池中的数量小于corePoolSizeQ即使线E池中的U程都处于空闲状态,也要创徏新的U程来处理被d的Q务?/p>

如果此时U程池中的数量等?corePoolSizeQ但是缓冲队?workQueue未满Q那么Q务被攑օ~冲队列?/p>

如果此时U程池中的数量大于corePoolSizeQ缓冲队列workQueue满,q且U程池中的数量小于maximumPoolSizeQ徏新的U程来处理被d的Q务?/p>

如果此时U程池中的数量大于corePoolSizeQ缓冲队列workQueue满,q且U程池中的数量等于maximumPoolSizeQ那么通过 handler所指定的策略来处理此Q务?br />
也就是:处理d的优先为:
核心U程corePoolSize、Q务队列workQueue、最大线EmaximumPoolSizeQ如果三者都满了Q用handler处理被拒l的d?br />
当线E池中的U程数量大于 corePoolSizeӞ如果某线E空闲时间超qkeepAliveTimeQ线E将被终止。这PU程池可以动态的调整池中的线E数?br />
unit可选的参数为java.util.concurrent.TimeUnit中的几个静态属性:
NANOSECONDS、MICROSECONDS、MILLISECONDS、SECONDS?br />
workQueue我常用的是:java.util.concurrent.ArrayBlockingQueue

handler有四个选择Q?br /> ThreadPoolExecutor.AbortPolicy()
抛出java.util.concurrent.RejectedExecutionException异常
ThreadPoolExecutor.CallerRunsPolicy()
重试d当前的Q务,他会自动重复调用execute()Ҏ
ThreadPoolExecutor.DiscardOldestPolicy()
抛弃旧的d
ThreadPoolExecutor.DiscardPolicy()
抛弃当前的Q?/p>


二、一般用法D?br /> //------------------------------------------------------------
//TestThreadPool.java
//package cn.simplelife.exercise;

import java.io.Serializable;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class TestThreadPool {

private static int produceTaskSleepTime = 2;
private static int consumeTaskSleepTime = 2000;
private static int produceTaskMaxNumber = 10;

public static void main(String[] args) {

//构造一个线E池
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2, 4, 3,
TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(3),
new ThreadPoolExecutor.DiscardOldestPolicy());

for(int i=1;i<=produceTaskMaxNumber;i++){
try {
//产生一个Q务,q将其加入到U程?br /> String task = "task@ " + i;
System.out.println("put " + task);
threadPool.execute(new ThreadPoolTask(task));

//便于观察Q等待一D|?br /> Thread.sleep(produceTaskSleepTime);
} catch (Exception e) {
e.printStackTrace();
}
}
}

/**
* U程池执行的d
* @author hdpan
*/
public static class ThreadPoolTask implements Runnable,Serializable{
private static final long serialVersionUID = 0;
//保存d所需要的数据
private Object threadPoolTaskData;

ThreadPoolTask(Object tasks){
this.threadPoolTaskData = tasks;
}
public void run(){
//处理一个Q务,q里的处理方式太单了Q仅仅是一个打印语?br /> System.out.println("start .."+threadPoolTaskData);
try {
////便于观察Q等待一D|?br /> Thread.sleep(consumeTaskSleepTime);
} catch (Exception e) {
e.printStackTrace();
}
threadPoolTaskData = null;
}
public Object getTask(){
return this.threadPoolTaskData;
}
}
}
//------------------------------------------------------------
说明Q?br /> 1、在q段E序中,一个Q务就是一个Runnablecd的对象,也就是一个ThreadPoolTaskcd的对象?/p>

2、一般来说Q务除了处理方式外Q还需要处理的数据Q处理的数据通过构造方法传lQ务?/p>

3、在q段E序中,main()Ҏ相当于一个残忍的领导Q他z֏多Q务,丢给一个叫 threadPool的Q劳Q怨的组来做?/p>

q个组里面队员臛_有两个,如果他们两个忙不q来QQ务就被放CQ务列表里面?/p>

如果U压的Q务过多,多到d列表都装不下(过3?的时候,雇佣新的队员来帮忙。但是基于成本的考虑Q不能雇佣太多的队员Q至多只能雇?4个?/p>

如果四个队员都在忙时Q再有新的Q务,q个组处理不了了QQ务就会被通过一U策略来处理Q我们的处理方式是不停的z֏Q直到接受这个Q务ؓ?更残忍!呵呵)?/p>

因ؓ队员工作是需要成本的Q如果工作很Ԍ闲到 3SECONDS都没有新的Q务了Q那么有的队员就会被解雇了,但是Qؓ了小l的正常q{Q即使工作再Ԍ组的队员也不能于两个?/p>

4、通过调整 produceTaskSleepTime?consumeTaskSleepTime的大来实现Ҏ发Q务和处理d的速度的控Ӟ改变q两个值就可以观察不同速率下程序的工作情况?/p>

5、通过调整4中所指的数据Q再加上调整d丢弃{略Q换上其他三U策略,可以看Z同策略下的不同处理方式?/p>

6、对于其他的使用ҎQ参看jdk的帮助,很容易理解和使用?/p>
转自Qhttp://hi.baidu.com/gladfeel/blog/item/b52338731dd6c3198701b0b3.html

]]>
全面解决五大数据库死锁的问题http://www.tkk7.com/standlww/archive/2008/10/18/235157.html李威?/dc:creator>李威?/author>Sat, 18 Oct 2008 05:05:00 GMThttp://www.tkk7.com/standlww/archive/2008/10/18/235157.htmlhttp://www.tkk7.com/standlww/comments/235157.htmlhttp://www.tkk7.com/standlww/archive/2008/10/18/235157.html#Feedback0http://www.tkk7.com/standlww/comments/commentRss/235157.htmlhttp://www.tkk7.com/standlww/services/trackbacks/235157.html

]]>
Java U程池的原理与实?/title><link>http://www.tkk7.com/standlww/archive/2008/10/17/235100.html</link><dc:creator>李威?/dc:creator><author>李威?/author><pubDate>Fri, 17 Oct 2008 15:20:00 GMT</pubDate><guid>http://www.tkk7.com/standlww/archive/2008/10/17/235100.html</guid><wfw:comment>http://www.tkk7.com/standlww/comments/235100.html</wfw:comment><comments>http://www.tkk7.com/standlww/archive/2008/10/17/235100.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.tkk7.com/standlww/comments/commentRss/235100.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/standlww/services/trackbacks/235100.html</trackback:ping><description><![CDATA[最q在学习U程池、内存控制等关于提高E序q行性能斚w的编E技术,在网上看到有一哥们写得不错Q故和大家一起分享?br /> <br /> [分n]Java U程池的原理与实?br /> <br /> <br /> q几天主要是狂看源程序,在I补了一些以前知识空白的同时Q也学会了不新的知识(比如 NIOQ,或者称为新技术吧?br /> U程池就是其中之一Q一提到U程Q我们会惛_以前《操作系l》的生者与消费者,信号量,同步控制{等?br /> 一提到池,我们会想到数据库q接池,但是U程池又如何呢?<br /> <br /> <br /> <strong></strong>Q在阅读本文前,先理一理同步的知识Q特别是syncronized同步关键字的用法?br /> 关于我对同步的认识,要缘于大三年的一本书Q书名好像是 Java 实战Q这本书写得实在太妙了,真正的从理论到实践,从截囑ֈ析到.class字节码分析。哇Q我惛_Z很难买到q么_致的书了。作Z个Java爱好者,我觉得绝对值得一诅R?br /> 我对此书印象最׃一的就是:equal()ҎQ由入深,l典Q?br /> q有是同步了,其中提到了我的几个编E误区,以前如何使用同步提高性能{等Q通过学习Q我对同步的认识进一步加深?br /> <br /> <br /> <font size="3"><strong>单介l?/strong></font><br /> <br />     创徏U程有两U方式:l承Thread或实现Runnable。Thread实现了Runnable接口Q提供了一个空的run()ҎQ所以不论是l承Threadq是实现RunnableQ都要有自己的run()Ҏ?br />     一个线E创建后存在,调用start()Ҏ开始运行(执行run()ҎQ,调用waitq入{待或调用sleepq入休眠期,利q行完毕或休眠被中断或运行过E中出现异常而退出?br /> <br /> <strong>wait和sleep比较Q?/strong><br />       sleepҎ有:sleep(long millis)Qsleep(long millis, long nanos)Q调用sleepҎ后,当前U程q入休眠期,暂停执行Q但该线El拥有监视资源的所有权。到达休眠时间后U程l执行,直到完成。若在休眠期另一U程中断该线E,则该U程退出?br />       waitҎ有:wait()Qwait(long timeout)Qwait(long timeout, long nanos)Q调用waitҎ后,该线E放弃监视资源的所有权q入{待状态;<br />       wait()Q等待有其它的线E调用notify()或notifyAll()q入调度状态,与其它线E共同争夺监视。wait()相当于wait(0)Qwait(0, 0)?br />       wait(long timeout)Q当其它U程调用notify()或notifyAll()Q或旉到达timeout亳秒Q或有其它某U程中断该线E,则该U程q入调度状态?br />       wait(long timeout, long nanos)Q相当于wait(1000000*timeout + nanos)Q只不过旉单位为纳U?br /> <br /> <br /> <br /> <font color="#ff0000" size="3"><strong>U程池:</strong></font><br />     多线E技术主要解军_理器单元内多个线E执行的问题Q它可以显著减少处理器单元的闲置旉Q增加处理器单元的吞吐能力?br />     <br />     假设一个服务器完成一Q务所需旉为:T1 创徏U程旉QT2 在线E中执行d的时_T3 销毁线E时间?br />     <br />     如果QT1 + T3 q大?T2Q则可以采用U程池,以提高服务器性能?br />                 一个线E池包括以下四个基本l成部分Q?br />                 1、线E池理器(ThreadPoolQ:用于创徏q管理线E池Q包?创徏U程池,销毁线E池Q添加新dQ?br />                 2、工作线E(PoolWorkerQ:U程池中U程Q在没有d时处于等待状态,可以循环的执行Q务;<br />                 3、Q务接口(TaskQ:每个d必须实现的接口,以供工作U程调度d的执行,它主要规定了d的入口,d执行完后的收ַ作,d的执行状态等Q?br />                 4、Q务队列(taskQueueQ:用于存放没有处理的Q务。提供一U缓冲机制?br />                 <br />     U程池技术正是关注如何羃短或调整T1,T3旉的技术,从而提高服务器E序性能的。它把T1QT3分别安排在服务器E序的启动和l束的时间段或者一些空闲的旉D,q样在服务器E序处理客户hӞ不会有T1QT3的开销了?br /> <br />     U程池不仅调整T1,T3产生的时间段Q而且它还显著减少了创建线E的数目Q看一个例子:<br /> <br />     假设一个服务器一天要处理50000个请求,q且每个h需要一个单独的U程完成。在U程池中Q线E数一般是固定的,所以生线EL不会过U程池中U程的数目,而如果服务器不利用线E池来处理这些请求则U程L?0000。一般线E池大小是远于50000。所以利用线E池的服务器E序不会Z创徏50000而在处理h时浪Ҏ_从而提高效率?br /> <br /> <br /> <strong>/** U程池类Q工作线E作为其内部c?**/</strong><br /> <br /> package org.ymcn.util;<br /> <br /> import java.util.Collections;<br /> import java.util.Date;<br /> import java.util.LinkedList;<br /> import java.util.List;<br /> <br /> import org.apache.log4j.Logger;<br /> <br /> /**<br /> * U程?br /> * 创徏U程池,销毁线E池Q添加新d<br /> * <br /> * @author obullxl<br /> */<br /> public final class ThreadPool {<br />     private static Logger logger = Logger.getLogger(ThreadPool.class);<br />     private static Logger taskLogger = Logger.getLogger("TaskLogger");<br /> <br />     private static boolean debug = taskLogger.isDebugEnabled();<br />     // private static boolean debug = taskLogger.isInfoEnabled();<br />     /* 单例 */<br />     private static ThreadPool instance = ThreadPool.getInstance();<br /> <br />     public static final int SYSTEM_BUSY_TASK_COUNT = 150;<br />     /* 默认池中U程?*/<br />     public static int worker_num = 5;<br />     /* 已经处理的Q务数 */<br />     private static int taskCounter = 0;<br /> <br />     public static boolean systemIsBusy = false;<br /> <br />     private static List<Task> taskQueue = Collections<br />             .synchronizedList(new LinkedList<Task>());<br />     /* 池中的所有线E?*/<br />     public PoolWorker[] workers;<br /> <br />     private ThreadPool() {<br />         workers = new PoolWorker[5];<br />         for (int i = 0; i < workers.length; i++) {<br />             workers[i] = new PoolWorker(i);<br />         }<br />     }<br /> <br />     private ThreadPool(int pool_worker_num) {<br />         worker_num = pool_worker_num;<br />         workers = new PoolWorker[worker_num];<br />         for (int i = 0; i < workers.length; i++) {<br />             workers[i] = new PoolWorker(i);<br />         }<br />     }<br /> <br />     public static synchronized ThreadPool getInstance() {<br />         if (instance == null)<br />             return new ThreadPool();<br />         return instance;<br />     }<br />     /**<br />     * 增加新的d<br />     * 每增加一个新dQ都要唤醒Q务队?br />     * @param newTask<br />     */<br />     public void addTask(Task newTask) {<br />         synchronized (taskQueue) {<br />             newTask.setTaskId(++taskCounter);<br />             newTask.setSubmitTime(new Date());<br />             taskQueue.add(newTask);<br />             /* 唤醒队列, 开始执?*/<br />             taskQueue.notifyAll();<br />         }<br />         logger.info("Submit Task<" + newTask.getTaskId() + ">: "<br />                 + newTask.info());<br />     }<br />     /**<br />     * 扚w增加CQ?br />     * @param taskes<br />     */<br />     public void batchAddTask(Task[] taskes) {<br />         if (taskes == null || taskes.length == 0) {<br />             return;<br />         }<br />         synchronized (taskQueue) {<br />             for (int i = 0; i < taskes.length; i++) {<br />                 if (taskes[i] == null) {<br />                     continue;<br />                 }<br />                 taskes[i].setTaskId(++taskCounter);<br />                 taskes[i].setSubmitTime(new Date());<br />                 taskQueue.add(taskes[i]);<br />             }<br />             /* 唤醒队列, 开始执?*/<br />             taskQueue.notifyAll();<br />         }<br />         for (int i = 0; i < taskes.length; i++) {<br />             if (taskes[i] == null) {<br />                 continue;<br />             }<br />             logger.info("Submit Task<" + taskes[i].getTaskId() + ">: "<br />                     + taskes[i].info());<br />         }<br />     }<br />     /**<br />     * U程池信?br />     * @return<br />     */<br />     public String getInfo() {<br />         StringBuffer sb = new StringBuffer();<br />         sb.append("\nTask Queue Size:" + taskQueue.size());<br />         for (int i = 0; i < workers.length; i++) {<br />             sb.append("\nWorker " + i + " is "<br />                     + ((workers[i].isWaiting()) ? "Waiting." : "Running."));<br />         }<br />         return sb.toString();<br />     }<br />     /**<br />     * 销毁线E池<br />     */<br />     public synchronized void destroy() {<br />         for (int i = 0; i < worker_num; i++) {<br />             workers[i].stopWorker();<br />             workers[i] = null;<br />         }<br />         taskQueue.clear();<br />     }<br /> <br />     /**<br />     * 池中工作U程<br />     * <br />     * @author obullxl<br />     */<br />     private class PoolWorker extends Thread {<br />         private int index = -1;<br />         /* 该工作线E是否有?*/<br />         private boolean isRunning = true;<br />         /* 该工作线E是否可以执行新d */<br />         private boolean isWaiting = true;<br /> <br />         public PoolWorker(int index) {<br />             this.index = index;<br />             start();<br />         }<br /> <br />         public void stopWorker() {<br />             this.isRunning = false;<br />         }<br /> <br />         public boolean isWaiting() {<br />             return this.isWaiting;<br />         }<br />         /**<br />         * 循环执行d<br />         * q也许是U程池的关键所?br />         */<br />         public void run() {<br />             while (isRunning) {<br />                 Task r = null;<br />                 synchronized (taskQueue) {<br />                     while (taskQueue.isEmpty()) {<br />                         try {<br />                             /* d队列为空Q则{待有新d加入从而被唤醒 */<br />                             taskQueue.wait(20);<br />                         } catch (InterruptedException ie) {<br />                             logger.error(ie);<br />                         }<br />                     }<br />                     /* 取出d执行 */<br />                     r = (Task) taskQueue.remove(0);<br />                 }<br />                 if (r != null) {<br />                     isWaiting = false;<br />                     try {<br />                         if (debug) {<br />                             r.setBeginExceuteTime(new Date());<br />                             taskLogger.debug("Worker<" + index<br />                                     + "> start execute Task<" + r.getTaskId() + ">");<br />                             if (r.getBeginExceuteTime().getTime()<br />                                     - r.getSubmitTime().getTime() > 1000)<br />                                 taskLogger.debug("longer waiting time. "<br />                                         + r.info() + ",<" + index + ">,time:"<br />                                         + (r.getFinishTime().getTime() - r<br />                                                 .getBeginExceuteTime().getTime()));<br />                         }<br />                         /* 该Q务是否需要立x?*/<br />                         if (r.needExecuteImmediate()) {<br />                             new Thread(r).start();<br />                         } else {<br />                             r.run();<br />                         }<br />                         if (debug) {<br />                             r.setFinishTime(new Date());<br />                             taskLogger.debug("Worker<" + index<br />                                     + "> finish task<" + r.getTaskId() + ">");<br />                             if (r.getFinishTime().getTime()<br />                                     - r.getBeginExceuteTime().getTime() > 1000)<br />                                 taskLogger.debug("longer execution time. "<br />                                         + r.info() + ",<" + index + ">,time:"<br />                                         + (r.getFinishTime().getTime() - r<br />                                                 .getBeginExceuteTime().getTime()));<br />                         }<br />                     } catch (Exception e) {<br />                         e.printStackTrace();<br />                         logger.error(e);<br />                     }<br />                     isWaiting = true;<br />                     r = null;<br />                 }<br />             }<br />         }<br />     }<br /> }<br /> <br /> <strong>/** d接口c?**/</strong><br /> <br /> package org.ymcn.util;<br /> <br /> import java.util.Date;<br /> <br /> /**<br /> * 所有Q务接?br /> * 其他d必须l承访类<br /> * <br /> * @author obullxl<br /> */<br /> public abstract class Task implements Runnable {<br />     // private static Logger logger = Logger.getLogger(Task.class);<br />     /* 产生旉 */<br />     private Date generateTime = null;<br />     /* 提交执行旉 */<br />     private Date submitTime = null;<br />     /* 开始执行时?*/<br />     private Date beginExceuteTime = null;<br />     /* 执行完成旉 */<br />     private Date finishTime = null;<br /> <br />     private long taskId;<br /> <br />     public Task() {<br />         this.generateTime = new Date();<br />     }<br /> <br />     /**<br />     * d执行入口<br />     */<br />     public void run() {<br />         /**<br />         * 相关执行代码<br />         * <br />         * beginTransaction();<br />         * <br />         * 执行q程中可能生新的Q?subtask = taskCore();<br />         * <br />         * commitTransaction();<br />         * <br />         * 增加C生的d ThreadPool.getInstance().batchAddTask(taskCore());<br />         */<br />     }<br /> <br />     /**<br />     * 所有Q务的核心 所以特别的业务逻辑执行之处<br />     * <br />     * @throws Exception<br />     */<br />     public abstract Task[] taskCore() throws Exception;<br /> <br />     /**<br />     * 是否用到数据?br />     * <br />     * @return<br />     */<br />     protected abstract boolean useDb();<br /> <br />     /**<br />     * 是否需要立x?br />     * <br />     * @return<br />     */<br />     protected abstract boolean needExecuteImmediate();<br /> <br />     /**<br />     * d信息<br />     * <br />     * @return String<br />     */<br />     public abstract String info();<br /> <br />     public Date getGenerateTime() {<br />         return generateTime;<br />     }<br /> <br />     public Date getBeginExceuteTime() {<br />         return beginExceuteTime;<br />     }<br /> <br />     public void setBeginExceuteTime(Date beginExceuteTime) {<br />         this.beginExceuteTime = beginExceuteTime;<br />     }<br /> <br />     public Date getFinishTime() {<br />         return finishTime;<br />     }<br /> <br />     public void setFinishTime(Date finishTime) {<br />         this.finishTime = finishTime;<br />     }<br /> <br />     public Date getSubmitTime() {<br />         return submitTime;<br />     }<br /> <br />     public void setSubmitTime(Date submitTime) {<br />         this.submitTime = submitTime;<br />     }<br /> <br />     public long getTaskId() {<br />         return taskId;<br />     }<br /> <br />     public void setTaskId(long taskId) {<br />         this.taskId = taskId;<br />     }<br /> <br /> }<br /> <br /> <br /> <br /> <a >转自Qhttp://hi.baidu.com/obullxl/blog/item/ee50ad1ba8e8ff1f8718bf66.html</a> <img src ="http://www.tkk7.com/standlww/aggbug/235100.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/standlww/" target="_blank">李威?/a> 2008-10-17 23:20 <a href="http://www.tkk7.com/standlww/archive/2008/10/17/235100.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正则表达式简单教E?/title><link>http://www.tkk7.com/standlww/archive/2008/10/06/232748.html</link><dc:creator>李威?/dc:creator><author>李威?/author><pubDate>Mon, 06 Oct 2008 12:12:00 GMT</pubDate><guid>http://www.tkk7.com/standlww/archive/2008/10/06/232748.html</guid><wfw:comment>http://www.tkk7.com/standlww/comments/232748.html</wfw:comment><comments>http://www.tkk7.com/standlww/archive/2008/10/06/232748.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/standlww/comments/commentRss/232748.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/standlww/services/trackbacks/232748.html</trackback:ping><description><![CDATA[<h2 class="title">正则表达式系l教E?/h2> <p class="postdate"><a ></a> </p> <div id="iusi4ag" class="content"> <p><strong>1. 引子<br /> </strong>  目前Q正则表辑ּ已经在很多Y件中得到q泛的应用,包括*nixQLinux, Unix{)QHP{操作系l,PHPQC#QJava{开发环境,以及很多的应用Y件中Q都可以看到正则表达式的影子?br /> <br />   正则表达式的使用Q可以通过单的办法来实现强大的功能。ؓ了简单有效而又不失强大Q造成了正则表辑ּ代码的难度较大,学习h也不是很ҎQ所以需要付Z些努力才行,入门之后参照一定的参考,使用hq是比较单有效的?br /> <br />   例子Q?^.+@.+\\..+$ <br /> <br />   q样的代码曾l多ơ把我自q吓退q。可能很多h也是被这L代码l吓跑的吧。l阅L文将让你也可以自由应用这L代码?br /> <br />   注意Q这里的W?部分跟前面的内容看v来似乎有些重复,目的是把前面表格里的部分重新描述了一ơ,目的是让q些内容更容易理解?br /> <br /> <br /> <strong>2. 正则表达式的历史<br /> <br /> </strong>  正则表达式的“先”可以一直上溯至对hcȝl系l如何工作的早期研究。Warren McCulloch ?Walter Pitts q两位神l生理学家研I出一U数学方式来描述q些经|络?br /> <br />   1956 q? 一位叫 Stephen Kleene 的数学家?McCulloch ?Pitts 早期工作的基上,发表了一标题ؓ“经|事件的表示?#8221;的论文,引入了正则表辑ּ的概c正则表辑ּ是用来描述他称?#8220;正则集的代数”的表辑ּQ因此采?#8220;正则表达?#8221;q个术语?br /> <br />   随后Q发现可以将q一工作应用于?Ken Thompson 的计搜索算法的一些早期研IӞKen Thompson ?Unix 的主要发明h。正则表辑ּ的第一个实用应用程序就?Unix 中的 qed ~辑器?br /> <br />   如他们所_剩下的就是众所周知的历史了。从那时L至现在正则表辑ּ都是Z文本的编辑器和搜索工具中的一个重要部分?br /> <br /> <strong>3. 正则表达式定?br /> <br /> </strong>  正则表达?regular expression)描述了一U字W串匚w的模式,可以用来查一个串是否含有某种子串、将匚w的子串做替换或者从某个串中取出W合某个条g的子串等?br /> <br />   列目录时Q dir *.txt或ls *.txt中的*.txt׃是一个正则表辑ּ,因ؓq里*与正则式?的含义是不同的?<br /> <br />   正则表达式是由普通字W(例如字符 a ?zQ以及特D字W(UCؓ元字W)l成的文字模式。正则表辑ּ作ؓ一个模板,某个字W模式与所搜烦的字W串q行匚w?br /> <a name="31"></a><br />   3.1 普通字W?br /> <br />   由所有那些未昑ּ指定为元字符的打印和非打印字W组成。这包括所有的大写和小写字母字W,所有数字,所有标点符号以及一些符受?<br /> <a name="32"></a><br />   3.2 非打印字W?br /> <br /> <table cellspacing="1" cellpadding="3" align="center" bgcolor="#eaeaea" border="0"> <tbody> <tr bgcolor="#f0f0f0"> <th style="font-size: 12px" align="left">字符 </th> <th style="font-size: 12px" align="left">含义</th> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px" width="40">\cx </td> <td style="font-size: 12px">匚w由x指明的控制字W。例如, \cM 匚w一?Control-M 或回车符。x 的值必Mؓ A-Z ?a-z 之一。否则,?c 视ؓ一个原义的 'c' 字符?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">\f </td> <td style="font-size: 12px">匚w一个换늬。等价于 \x0c ?\cL?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">\n </td> <td style="font-size: 12px">匚w一个换行符。等价于 \x0a ?\cJ?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">\r </td> <td style="font-size: 12px">匚w一个回车符。等价于 \x0d ?\cM?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">\s </td> <td style="font-size: 12px">匚wMI白字符Q包括空根{制表符、换늬{等。等价于 [ \f\n\r\t\v]?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">\S </td> <td style="font-size: 12px">匚wM非空白字W。等价于 [^ \f\n\r\t\v]?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">\t </td> <td style="font-size: 12px">匚w一个制表符。等价于 \x09 ?\cI?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">\v </td> <td style="font-size: 12px">匚w一个垂直制表符。等价于 \x0b ?\cK?/td> </tr> </tbody> </table> <br /> <a name="33"></a> <br />   3.3 Ҏ字符<br /> <br />   所谓特D字W,是一些有Ҏ含义的字W,如上面说?*.txt"中的*Q简单的说就是表CZQ何字W串的意思。如果要查找文g名中有*的文Ӟ则需要对Q进行{义,卛_其前加一个\。ls \*.txt。正则表辑ּ有以下特D字W?br /> <br /> <table cellspacing="1" cellpadding="3" align="center" bgcolor="#eaeaea" border="0"> <tbody> <tr bgcolor="#f0f0f0"> <th style="font-size: 12px" align="left" width="60">特别字符</th> <th style="font-size: 12px" align="left">说明</th> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">$</td> <td style="font-size: 12px">匚w输入字符串的l尾位置。如果设|了 RegExp 对象?Multiline 属性,?$ 也匹?'\n' ?'\r'。要匚w $ 字符本nQ请使用 \$?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">( )</td> <td style="font-size: 12px">标记一个子表达式的开始和l束位置。子表达式可以获取供以后使用。要匚wq些字符Q请使用 \( ?\)?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">*</td> <td style="font-size: 12px">匚w前面的子表达式零ơ或多次。要匚w * 字符Q请使用 \*?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">+</td> <td style="font-size: 12px">匚w前面的子表达式一ơ或多次。要匚w + 字符Q请使用 \+?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">.</td> <td style="font-size: 12px">匚w除换行符 \n之外的Q何单字符。要匚w .Q请使用 \?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">[ </td> <td style="font-size: 12px">标记一个中括号表达式的开始。要匚w [Q请使用 \[?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">?</td> <td style="font-size: 12px">匚w前面的子表达式零ơ或一ơ,或指明一个非贪婪限定W。要匚w ? 字符Q请使用 \??/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">\</td> <td style="font-size: 12px">下一个字W标Cؓ或特D字W、或原义字符、或向后引用、或八进制{义符。例如, 'n' 匚w字符 'n'?\n' 匚w换行W。序?'\\' 匚w "\"Q?'\(' 则匹?"("?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">^</td> <td style="font-size: 12px">匚w输入字符串的开始位|,除非在方括号表达式中使用Q此时它表示不接受该字符集合。要匚w ^ 字符本nQ请使用 \^?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">{</td> <td style="font-size: 12px">标记限定W表辑ּ的开始。要匚w {Q请使用 \{?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">|</td> <td style="font-size: 12px">指明两项之间的一个选择。要匚w |Q请使用 \|?/td> </tr> </tbody> </table>  <br /> <br />   构造正则表辑ּ的方法和创徏数学表达式的Ҏ一栗也是用多U元字符与操作符小的表辑ּl合在一h创徏更大的表辑ּ。正则表辑ּ的组件可以是单个的字W、字W集合、字W范围、字W间的选择或者所有这些组件的Ll合?<br />  <br /> <a name="34"></a><br />   3.4 限定W?br /> <br />   限定W用来指定正则表辑ּ的一个给定组件必要出现多少ơ才能满_配。有*??或{n}或{n,}或{n,m}?U?br /> <br />   *??限定W都是贪婪的Q因为它们会可能多的匹配文字,只有在它们的后面加上一?可以实现非贪婪或最匹配?br /> <br />   正则表达式的限定W有Q?br /> <br /> <table cellspacing="1" cellpadding="3" align="center" bgcolor="#eaeaea" border="0"> <tbody> <tr bgcolor="#f0f0f0"> <th style="font-size: 12px" align="left" width="40">字符 </th> <th style="font-size: 12px" align="left">描述</th> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">* </td> <td style="font-size: 12px">匚w前面的子表达式零ơ或多次。例如,zo* 能匹?"z" 以及 "zoo"? {h于{0,}?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">+ </td> <td style="font-size: 12px">匚w前面的子表达式一ơ或多次。例如,'zo+' 能匹?"zo" 以及 "zoo"Q但不能匚w "z"? {h?{1,}?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">? </td> <td style="font-size: 12px">匚w前面的子表达式零ơ或一ơ。例如,"do(es)?" 可以匚w "do" ?"does" 中的"do" ? {h?{0,1}?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">{n} </td> <td style="font-size: 12px">n 是一个非负整数。匹配确定的 n ơ。例如,'o{2}' 不能匚w "Bob" 中的 'o'Q但是能匚w "food" 中的两个 o?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">{n,} </td> <td style="font-size: 12px">n 是一个非负整数。至匹配n ơ。例如,'o{2,}' 不能匚w "Bob" 中的 'o'Q但能匹?"foooood" 中的所?o?o{1,}' {h?'o+'?o{0,}' 则等价于 'o*'?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">{n,m} </td> <td style="font-size: 12px">m ?n 均ؓ非负整数Q其中n <= m。最匹?n ơ且最多匹?m ơ。例如,"o{1,3}" 匹?"fooooood" 中的前三?o?o{0,1}' {h?'o?'。请注意在逗号和两个数之间不能有空根{?/td> </tr> </tbody> </table> <br /> <a name="35"></a><br />   <strong>3.5 定位W?/strong><br /> <br />   用来描述字符串或单词的边界,^?分别指字W串的开始与l束Q\b描述单词的前或后边界Q\B表示非单词边界?span style="color: #ff0000">不能对定位符使用限定W?</span><br /> <a name="36"></a><br />   3.6 选择<br /> <br />   用圆括号所有选择ҎhQ相ȝ选择之间用|分隔。但用圆括号会有一个副作用Q是相关的匹配会被缓存,此时可用?:攑֜W一个选项前来消除q种副作用?br /> <br />   其中?:是非捕获元之一Q还有两个非捕获元是?=?!Q这两个q有更多的含义,前者ؓ正向预查Q在M开始匹配圆括号内的正则表达式模式的位置来匹配搜索字W串Q后者ؓ负向预查Q在M开始不匚w该正则表辑ּ模式的位|来匚w搜烦字符丌Ӏ?<br /> <a name="37"></a><br />   3.7 后向引用<br /> <br />   对一个正则表辑ּ模式或部分模式两Ҏ加圆括号导致相兛_配存储到一个时缓冲区中,所捕获的每个子匚w都按照在正则表达式模式中从左臛_所遇到的内容存储。存储子匚w的缓冲区~号?1 开始,q箋~号直至最?99 个子表达式。每个缓冲区都可以?'\n' 讉KQ其?n Z个标识特定缓冲区的一位或两位十进制数?br /> <br />   可以使用非捕获元字符 '?:', '?=', or '?!' 来忽略对相关匚w的保存?<br /> <br /> <br /> <strong>4. 各种操作W的q算优先U?br /> <br /> </strong>  相同优先U的从左到右q行q算Q不同优先的运先高后低。各U操作符的优先从高C如下Q?br /> <br /> <table cellspacing="1" cellpadding="3" align="center" bgcolor="#eaeaea" border="0"> <tbody> <tr bgcolor="#f0f0f0"> <th style="font-size: 12px" align="left" width="200" bgcolor="#f0f0f0">操作W?</th> <th style="font-size: 12px" align="left">描述</th> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">\ </td> <td style="font-size: 12px">转义W?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">(), (?:), (?=), [] </td> <td style="font-size: 12px">圆括号和Ҏ?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">*, +, ?, {n}, {n,}, {n,m} </td> <td style="font-size: 12px">限定W?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">^, $, \anymetacharacter </td> <td style="font-size: 12px">位置和顺?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">| </td> <td style="font-size: 12px">“?#8221;操作</td> </tr> </tbody> </table> </p> <p><strong>5. 全部W号解释<br /> <br /> </strong> <table cellspacing="1" cellpadding="3" align="center" bgcolor="#eaeaea" border="0"> <tbody> <tr bgcolor="#f0f0f0"> <th style="font-size: 12px" align="left" width="80" bgcolor="#f0f0f0">字符 </th> <th style="font-size: 12px" align="left">描述</th> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">\ </td> <td style="font-size: 12px">下一个字W标Cؓ一个特D字W、或一个原义字W、或一?向后引用、或一个八q制转义W。例如,'n' 匚w字符 "n"?\n' 匚w一个换行符。序?'\\' 匚w "\" ?"\(" 则匹?"("?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">^ </td> <td style="font-size: 12px">匚w输入字符串的开始位|。如果设|了 RegExp 对象?Multiline 属性,^ 也匹?'\n' ?'\r' 之后的位|?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">$ </td> <td style="font-size: 12px">匚w输入字符串的l束位置。如果设|了RegExp 对象?Multiline 属性,$ 也匹?'\n' ?'\r' 之前的位|?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">* </td> <td style="font-size: 12px">匚w前面的子表达式零ơ或多次。例如,zo* 能匹?"z" 以及 "zoo"? {h于{0,}?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">+ </td> <td style="font-size: 12px">匚w前面的子表达式一ơ或多次。例如,'zo+' 能匹?"zo" 以及 "zoo"Q但不能匚w "z"? {h?{1,}?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">? </td> <td style="font-size: 12px">匚w前面的子表达式零ơ或一ơ。例如,"do(es)?" 可以匚w "do" ?"does" 中的"do" ? {h?{0,1}?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">{n} </td> <td style="font-size: 12px">n 是一个非负整数。匹配确定的 n ơ。例如,'o{2}' 不能匚w "Bob" 中的 'o'Q但是能匚w "food" 中的两个 o?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">{n,} </td> <td style="font-size: 12px">n 是一个非负整数。至匹配n ơ。例如,'o{2,}' 不能匚w "Bob" 中的 'o'Q但能匹?"foooood" 中的所?o?o{1,}' {h?'o+'?o{0,}' 则等价于 'o*'?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">{n,m} </td> <td style="font-size: 12px">m ?n 均ؓ非负整数Q其中n <= m。最匹?n ơ且最多匹?m ơ。例如,"o{1,3}" 匹?"fooooood" 中的前三?o?o{0,1}' {h?'o?'。请注意在逗号和两个数之间不能有空根{?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">? </td> <td style="font-size: 12px">当该字符紧跟在Q何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面Ӟ匚w模式是非贪婪的。非贪婪模式可能少的匹配所搜烦的字W串Q而默认的贪婪模式则尽可能多的匚w所搜烦的字W串。例如,对于字符?"oooo"Q?o+?' 匹配单?"o"Q?'o+' 匹配所?'o'?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">. </td> <td style="font-size: 12px">匚w?"\n" 之外的Q何单个字W。要匚w包括 '\n' 在内的Q何字W,请用象 '[.\n]' 的模式?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">(pattern) </td> <td style="font-size: 12px">匚w pattern q获取这一匚w。所获取的匹配可以从产生?Matches 集合得到Q在VBScript 中?SubMatches 集合Q在JScript 中则使用 $0…$9 属性。要匚w圆括号字W,请?'\(' ?'\)'?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">(?:pattern) </td> <td style="font-size: 12px">匚w pattern 但不获取匚wl果Q也是说这是一个非获取匚wQ不q行存储供以后用。这在?"? 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 是一个比 'industry|industries' 更简略的表达式?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">(?=pattern) </td> <td style="font-size: 12px">正向预查Q在M匚w pattern 的字W串开始处匚w查找字符丌Ӏ这是一个非获取匚wQ也是_该匹配不需要获取供以后使用。例如,'Windows (?=95|98|NT|2000)' 能匹?"Windows 2000" 中的 "Windows" Q但不能匚w "Windows 3.1" 中的 "Windows"。预查不消耗字W,也就是说Q在一个匹配发生后Q在最后一ơ匹配之后立卛_始下一ơ匹配的搜烦Q而不是从包含预查的字W之后开始?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">(?!pattern) </td> <td style="font-size: 12px">负向预查Q在M不匹?pattern 的字W串开始处匚w查找字符丌Ӏ这是一个非获取匚wQ也是_该匹配不需要获取供以后使用。例?Windows (?!95|98|NT|2000)' 能匹?"Windows 3.1" 中的 "Windows"Q但不能匚w "Windows 2000" 中的 "Windows"。预查不消耗字W,也就是说Q在一个匹配发生后Q在最后一ơ匹配之后立卛_始下一ơ匹配的搜烦Q而不是从包含预查的字W之后开?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">x|y </td> <td style="font-size: 12px">匚w x ?y。例如,'z|food' 能匹?"z" ?"food"?(z|f)ood' 则匹?"zood" ?"food"?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">[xyz] </td> <td style="font-size: 12px">字符集合。匹配所包含的Q意一个字W。例如, '[abc]' 可以匚w "plain" 中的 'a'?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">[^xyz] </td> <td style="font-size: 12px">负值字W集合。匹配未包含的Q意字W。例如, '[^abc]' 可以匚w "plain" 中的'p'?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">[a-z] </td> <td style="font-size: 12px">字符范围。匹配指定范围内的Q意字W。例如,'[a-z]' 可以匚w 'a' ?'z' 范围内的L写字母字符?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">[^a-z] </td> <td style="font-size: 12px">负值字W范围。匹配Q何不在指定范围内的Q意字W。例如,'[^a-z]' 可以匚wM不在 'a' ?'z' 范围内的L字符?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">\b </td> <td style="font-size: 12px">匚w一个单词边界,也就是指单词和空格间的位|。例如, 'er\b' 可以匚w"never" 中的 'er'Q但不能匚w "verb" 中的 'er'?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">\B </td> <td style="font-size: 12px">匚w非单词边界?er\B' 能匹?"verb" 中的 'er'Q但不能匚w "never" 中的 'er'?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">\cx </td> <td style="font-size: 12px">匚w?x 指明的控制字W。例如, \cM 匚w一?Control-M 或回车符。x 的值必Mؓ A-Z ?a-z 之一。否则,?c 视ؓ一个原义的 'c' 字符?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">\d </td> <td style="font-size: 12px">匚w一个数字字W。等价于 [0-9]?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">\D </td> <td style="font-size: 12px">匚w一个非数字字符。等价于 [^0-9]?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">\f </td> <td style="font-size: 12px">匚w一个换늬。等价于 \x0c ?\cL?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">\n </td> <td style="font-size: 12px">匚w一个换行符。等价于 \x0a ?\cJ?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">\r </td> <td style="font-size: 12px">匚w一个回车符。等价于 \x0d ?\cM?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">\s </td> <td style="font-size: 12px">匚wMI白字符Q包括空根{制表符、换늬{等。等价于 [ \f\n\r\t\v]?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">\S </td> <td style="font-size: 12px">匚wM非空白字W。等价于 [^ \f\n\r\t\v]?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">\t </td> <td style="font-size: 12px">匚w一个制表符。等价于 \x09 ?\cI?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">\v </td> <td style="font-size: 12px">匚w一个垂直制表符。等价于 \x0b ?\cK?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">\w </td> <td style="font-size: 12px">匚w包括下划U的M单词字符。等价于'[A-Za-z0-9_]'?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">\W </td> <td style="font-size: 12px">匚wM非单词字W。等价于 '[^A-Za-z0-9_]'?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">\xn </td> <td style="font-size: 12px">匚w nQ其?n 为十六进制{义倹{十六进制{义值必Mؓ定的两个数字长。例如,'\x41' 匚w "A"?\x041' 则等价于 '\x04' & "1"。正则表辑ּ中可以?ASCII ~码?</td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">\num </td> <td style="font-size: 12px">匚w numQ其?num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匚w两个q箋的相同字W?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">\n </td> <td style="font-size: 12px">标识一个八q制转义值或一个向后引用。如?\n 之前臛_ n 个获取的子表辑ּQ则 n 为向后引用。否则,如果 n 为八q制数字 (0-7)Q则 n Z个八q制转义倹{?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">\nm </td> <td style="font-size: 12px">标识一个八q制转义值或一个向后引用。如?\nm 之前臛_?nm 个获得子表达式,?nm 为向后引用。如?\nm 之前臛_?n 个获取,?n Z个后跟文?m 的向后引用。如果前面的条g都不满Q若 n ?m 均ؓ八进制数?(0-7)Q则 \nm 匹配八q制转义?nm?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">\nml </td> <td style="font-size: 12px">如果 n 为八q制数字 (0-3)Q且 m ?l 均ؓ八进制数?(0-7)Q则匚w八进制{义?nml?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">\un </td> <td style="font-size: 12px">匚w nQ其?n 是一个用四个十六q制数字表示?Unicode 字符。例如, \u00A9 匚w版权W号 (?)?/td> </tr> </tbody> </table> </p> <p><strong>6. 部分例子<br /> <br /> </strong> <table cellspacing="1" cellpadding="3" align="center" bgcolor="#eaeaea" border="0"> <tbody> <tr bgcolor="#f0f0f0"> <th style="font-size: 12px" align="left" width="250" bgcolor="#f0f0f0">正则表达?/th> <th style="font-size: 12px" align="left">说明</th> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">/\b([a-z]+) \1\b/gi</td> <td style="font-size: 12px">一个单词连l出现的位置</td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/ </td> <td style="font-size: 12px">一个URL解析为协议、域、端口及相对路径</td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">/^(?:Chapter|Section) [1-9][0-9]{0,1}$/</td> <td style="font-size: 12px">定位章节的位|?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">/[-a-z]/</td> <td style="font-size: 12px">A至z?6个字母再加一?受?/td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">/ter\b/</td> <td style="font-size: 12px">可匹配chapterQ而不能terminal</td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">/\Bapt/</td> <td style="font-size: 12px">可匹配chapterQ而不能aptitude</td> </tr> <tr bgcolor="#fafafa"> <td style="font-size: 12px">/Windows(?=95 |98 |NT )/</td> <td style="font-size: 12px">可匹配Windows95或Windows98或WindowsNT,当找C个匹配后Q从Windows后面开始进行下一ơ的索匹配?/td> </tr> </tbody> </table>  <br /> <strong>7. 正则表达式匹配规?br /> </strong><a name="71"></a><br />   7.1 基本模式匚w<br /> <br />   一切从最基本的开始。模式,是正规表辑ּ最基本的元素,它们是一l描q字W串特征的字W。模式可以很单,由普通的字符串组成,也可以非常复杂,往往用特D的字符表示一个范围内的字W、重复出玎ͼ或表CZ下文。例如:<br /> <br />   ^once <br /> <br />   q个模式包含一个特D的字符^Q表C模式只匹配那些以once开头的字符丌Ӏ例如该模式与字W串"once upon a time"匚wQ与"There once was a man from NewYork"不匹配。正如如^W号表示开头一P$W号用来匚w那些以给定模式结字符丌Ӏ?br /> <br />   bucket$ <br /> <br />   q个模式?Who kept all of this cash in a bucket"匚wQ与"buckets"不匹配。字W^?同时使用Ӟ表示_匚wQ字W串与模式一P。例如:<br /> <br />   ^bucket$ <br /> <br />   只匹配字W串"bucket"。如果一个模式不包括^?Q那么它与Q何包含该模式的字W串匚w。例如:模式<br /> <br />   once <br /> <br />   与字W串<br /> <br />   There once was a man from NewYork<br />   Who kept all of his cash in a bucket.<br /> <br />   是匹配的?br /> <br />   在该模式中的字母(o-n-c-e)是字面的字符Q也是_他们表示该字母本w,数字也是一L。其他一些稍微复杂的字符Q如标点W号和白字符Q空根{制表符{)Q要用到转义序列。所有的转义序列都用反斜?\)打头。制表符的{义序列是Q\t。所以如果我们要一个字W串是否以制表符开_可以用这个模式:<br /> <br />   ^\t <br /> <br />   cM的,用\n表示“新行”Q\r表示回R。其他的ҎW号Q可以用在前面加上反斜杠Q如反斜杠本w用\\表示Q句?用\.表示Q以此类推?br /> <a name="72"></a><br />   7.2 字符?br /> <br />   在INTERNET的程序中Q正规表辑ּ通常用来验证用户的输入。当用户提交一个FORM以后Q要判断输入的电话号码、地址、EMAIL地址、信用卡L{是否有效,用普通的Z字面的字W是不够的?br /> <br />   所以要用一U更自由的描q我们要的模式的办法Q它是字符。要建立一个表C所有元韛_W的字符,把所有的元音字符攑֜一个方括号里:<br /> <br />   [AaEeIiOoUu] <br /> <br />   q个模式与Q何元韛_W匹配,但只能表CZ个字W。用q字号可以表CZ个字W的范围Q如Q?br /> <br />   [a-z] //匚w所有的写字母 <br />   [A-Z] //匚w所有的大写字母 <br />   [a-zA-Z] //匚w所有的字母 <br />   [0-9] //匚w所有的数字 <br />   [0-9\.\-] //匚w所有的数字Q句号和减号 <br />   [ \f\r\t\n] //匚w所有的白字W?<br /> <br />   同样的,q些也只表示一个字W,q是一个非帔R要的。如果要匚w一个由一个小写字母和一位数字组成的字符Ԍ比如"z2"?t6"?g7"Q但不是"ab2"?r2d3" ?b52"的话Q用q个模式Q?br /> <br />   ^[a-z][0-9]$ <br /> <br />   管[a-z]代表26个字母的范围Q但在这里它只能与第一个字W是写字母的字W串匚w?br /> <br />   前面曄提到^表示字符串的开_但它q有另外一个含义。当在一l方括号里用^是,它表C?#8220;?#8221;?#8220;排除”的意思,常常用来剔除某个字符。还用前面的例子Q我们要求第一个字W不能是数字Q?br /> <br />   ^[^0-9][0-9]$ <br /> <br />   q个模式?&5"?g7"?-2"是匹配的Q但?12"?66"是不匚w的。下面是几个排除特定字符的例子:<br /> <br />   [^a-z] //除了写字母以外的所有字W?<br />   [^\\\/\^] //除了(\)(/)(^)之外的所有字W?<br />   [^\"\'] //除了双引?")和单引号(')之外的所有字W?<br /> <br />   Ҏ字符"." (点,句号)在正规表辑ּ中用来表C除?#8220;新行”之外的所有字W。所以模?^.5$"与Q何两个字W的、以数字5l尾和以其他?#8220;新行”字符开头的字符串匹配。模?."可以匚wM字符Ԍ除了IZ和只包括一?#8220;新行”的字W串?br /> <br />   PHP的正规表辑ּ有一些内|的通用字符,列表如下Q?br /> <br />   字符含?<br /> <br />   [[:alpha:]] M字母 <br />   [[:digit:]] M数字 <br />   [[:alnum:]] M字母和数?<br />   [[:space:]] M白字W?<br />   [[:upper:]] M大写字母 <br />   [[:lower:]] M写字母 <br />   [[:punct:]] M标点W号 <br />   [[:xdigit:]] M16q制的数字,相当于[0-9a-fA-F] <br /> <a name="73"></a><br />   7.3 定重复出现<br /> <br />   到现在ؓ止,你已l知道如何去匚w一个字母或数字Q但更多的情况下Q可能要匚w一个单词或一l数字。一个单词有若干个字母组成,一l数字有若干个单数组成。跟在字W或字符后面的花括?{})用来定前面的内容的重复出现的次数?<br /> <br />   字符?含义 <br />   ^[a-zA-Z_]$ 所有的字母和下划线 <br />   ^[[:alpha:]]{3}$ 所有的3个字母的单词 <br />   ^a$ 字母a <br />   ^a{4}$ aaaa <br />   ^a{2,4}$ aa,aaa或aaaa <br />   ^a{1,3}$ a,aa或aaa <br />   ^a{2,}$ 包含多于两个a的字W串 <br />   ^a{2,} 如:aardvark和aaabQ但apple不行 <br />   a{2,} 如:baad和aaaQ但Nantucket不行 <br />   \t{2} 两个制表W?<br />   .{2} 所有的两个字符 <br /> <br />   q些例子描述了花括号的三U不同的用法。一个数字,{x}的意思是“前面的字W或字符只出现x?#8221;Q一个数字加逗号Q{x,}的意思是“前面的内容出现x或更多的ơ数”Q两个用逗号分隔的数字,{x,y}表示“前面的内容至出现xơ,但不过y?#8221;。我们可以把模式扩展到更多的单词或数字:<br /> <br />   ^[a-zA-Z0-9_]{1,}$ //所有包含一个以上的字母、数字或下划U的字符?<br />   ^[0-9]{1,}$ //所有的正数 <br />   ^\-{0,1}[0-9]{1,}$ //所有的整数 <br />   ^\-{0,1}[0-9]{0,}\.{0,1}[0-9]{0,}$ //所有的数 <br /> <br />   最后一个例子不太好理解Q是吗?q么看吧Q与所有以一个可选的负号(\-{0,1})开?^)、跟着0个或更多的数?[0-9]{0,})、和一个可选的数?\.{0,1})再跟?个或多个数字([0-9]{0,})Qƈ且没有其他Q何东?$)。下面你知道能够用的更ؓ单的Ҏ?br /> <br />   Ҏ字符"?"与{0,1}是相{的Q它们都代表着Q?#8220;0个或1个前面的内容”?#8220;前面的内Ҏ可选的”。所以刚才的例子可以化ؓQ?br /> <br />   ^\-?[0-9]{0,}\.?[0-9]{0,}$ <br /> <br />   Ҏ字符"*"与{0,}是相{的Q它们都代表着“0个或多个前面的内?#8221;。最后,字符"+"?{1,}是相{的Q表C?#8220;1个或多个前面的内?#8221;Q所以上面的4个例子可以写成:<br /> <br />   ^[a-zA-Z0-9_]+$ //所有包含一个以上的字母、数字或下划U的字符?<br />   ^[0-9]+$ //所有的正数 <br />   ^\-?[0-9]+$ //所有的整数 <br />   ^\-?[0-9]*\.?[0-9]*$ //所有的数 <br /> <br />   当然qƈ不能从技术上降低正规表达式的复杂性,但可以它们更容易阅诅R?/p> </div> <img src ="http://www.tkk7.com/standlww/aggbug/232748.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/standlww/" target="_blank">李威?/a> 2008-10-06 20:12 <a href="http://www.tkk7.com/standlww/archive/2008/10/06/232748.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正则表达??http://www.tkk7.com/standlww/archive/2008/10/06/232745.html李威?/dc:creator>李威?/author>Mon, 06 Oct 2008 12:10:00 GMThttp://www.tkk7.com/standlww/archive/2008/10/06/232745.htmlhttp://www.tkk7.com/standlww/comments/232745.htmlhttp://www.tkk7.com/standlww/archive/2008/10/06/232745.html#Feedback0http://www.tkk7.com/standlww/comments/commentRss/232745.htmlhttp://www.tkk7.com/standlww/services/trackbacks/232745.html阅读全文

]]>
索引文g构成http://www.tkk7.com/standlww/archive/2008/09/23/230789.html李威?/dc:creator>李威?/author>Tue, 23 Sep 2008 15:58:00 GMThttp://www.tkk7.com/standlww/archive/2008/09/23/230789.htmlhttp://www.tkk7.com/standlww/comments/230789.htmlhttp://www.tkk7.com/standlww/archive/2008/09/23/230789.html#Feedback0http://www.tkk7.com/standlww/comments/commentRss/230789.htmlhttp://www.tkk7.com/standlww/services/trackbacks/230789.html索引文g构成

1Q烦引文?/strong>
     索引文g׃文g和烦引表构成?br />   ①主文gQ文件本w?br />   ②烦引表Q在文g本n外徏立的一张表Q它指明逻辑记录和物理记录之间的一一对应关系?br />
2Q烦引表l成
     索引表由若干索引组成。一般烦引项׃关键字和该关键字所在记录的物理地址l成?br />   注意Q?/font>
     索引表必Ld键字有序Q而主文g本n则可以按d键字有序或无序?br />
3Q烦引顺序文件和索引非顺序文?/strong>
Q?Q烦引顺序文?Indexed Sequential File)
     L件按d键字有序的文件称索引序文g?br />      在烦引顺序文件中Q可对一l记录徏立一个烦引项。这U烦引表UCؓE疏烦引?br />
Q?Q烦引非序文g(Indexed NonSequentail File)
     L件按d键字无序得文件称索引非顺序文件?br />      在烦引非序文g中,必须为每个记录徏立一个烦引项Q这样徏立的索引表称为稠密烦引?br />   注意Q?/font>
     ?通常烦引非序文gUCؓ索引文g?br />      ?索引非顺序文件主文g无序Q顺序存取将会频J地引v头UdQ适合于随机存取,不适合于顺序存取?br />      ?索引序文g的主文g是有序的Q适合于随机存取、顺序存取?br />      ?索引序文g的烦引是E疏烦引。烦引占用空间较,是最常用的一U文件组l?br />      ?最常用的烦引顺序文ӞISAM文g和VSAM文g?br />
索引文g的存?br />
1Q烦引文件的存储
     索引文g在存储器上分Z个区Q烦引区和数据区。烦引区存放索引表,数据区存放主文g?br />
2Q?索引文g的徏?/strong>
     建立索引文g的过E:
  Q?Q?按输入记录的先后ơ序建立数据区和索引表。其中烦引表中关键字是无序的
  Q?Q?待全部记录输入完毕后对烦引表q行排序Q排序后的烦引表和主文g一起就形成了烦引文件?br />   【例】对于表10.2的数据文Ӟd键字是职工号Q排序前的烦引表如表10.3所C,排序后的索引表见?0.4Q表10.2和表10.4一起Ş成了一个烦引文件?br />  
学习|址:
http://student.zjzk.cn/course_ware/data_structure/web/wenjian/wenjian10.3.1.htm


       



]]>
Lucene 索引文gl构深入分析 http://www.tkk7.com/standlww/archive/2008/09/23/230787.html李威?/dc:creator>李威?/author>Tue, 23 Sep 2008 15:54:00 GMThttp://www.tkk7.com/standlww/archive/2008/09/23/230787.htmlhttp://www.tkk7.com/standlww/comments/230787.htmlhttp://www.tkk7.com/standlww/archive/2008/09/23/230787.html#Feedback0http://www.tkk7.com/standlww/comments/commentRss/230787.htmlhttp://www.tkk7.com/standlww/services/trackbacks/230787.htmllucene索引文gl构分析在分析lucene的烦引文件结构之前,我们先要理解反向索引QinvertedindexQ这个概念,反向索引是一U以索引ؓ中心来组l文档的方式Q每个烦引项指向一个文档序列,

lucene 索引文gl构分析

在分?lucene 的烦引文件结构之前,我们先要理解反向索引Qinverted indexQ这个概念,反向索引是一U以索引ؓ中心来组l文档的方式Q每个烦引项指向一个文档序列,q个序列中的文档都包含该索引V相反,在正向烦引中Q文档占据了中心的位|,每个文档指向了一个它所包含的烦引项的序列。你可以利用反向索引L的找到那些文档包含了特定的烦引项。lucene正是使用了反向烦引作为其基本的烦引结构?/p>

索引文g的逻辑视图

在lucene 中有索引块的概念Q每个烦引块包含了一定数目的文档。我们能够对单独的烦引块q行索。图 2 昄?lucene 索引l构的逻辑视图。烦引块的个数由索引的文档的L以及每个索引块所能包含的最大文档数来决定?/p>


?Q烦引文件的逻辑视图 
 

lucene 中的关键索引文g

下面的部分将会分析lucene中的主要的烦引文Ӟ可能分析有些索引文g的时候没有包含文件的所有的字段Q但不会影响到对索引文g的理解?/p>

1Q烦引块文g

q个文g包含了烦引中的烦引块信息Q这个文件包含了每个索引块的名字以及大小{信息。表 2 昄了这个文件的l构信息?/p>


?Q烦引块文gl构 

2Q域信息文g

我们知道Q烦引中的文档由一个或者多个域l成Q这个文件包含了每个索引块中的域的信息。表 3 昄了这个文件的l构?/p>


?Q域信息文gl构 

3Q烦引项信息文g

q是索引文g里面最核心的一个文Ӟ它存储了所有的索引的g及相关信息,q且以烦引项来排序。表 4 昄了这个文件的l构?/p>


?Q烦引项信息文gl构 

4Q频率文?/p>

q个文g包含了包含烦引项的文档的列表Q以及烦引项在每个文档中出现的频率信息。如果lucene在烦引项信息文g中发现有索引和搜烦词相匚w。那?lucene ׃在频率文件中找有哪些文g包含了该索引V表5昄了这个文件的一个大致的l构Qƈ没有包含q个文g的所有字Dc?/p>


?Q频率文件的l构 

5Q位|文?/p>

q个文g包含了烦引项在每个文档中出现的位|信息,你可以利用这些信息来参与对烦引结果的排序。表 6 昄了这个文件的l构


?Q位|文件的l构 

到目前ؓ止我们介l了 lucene 中的主要的烦引文件结构,希望能对你理?lucene 的物理的存储l构有所帮助?/p>



]]>
վ֩ģ壺 ŮڵƵվ| ŷһ| ҹƵ߹ۿ| Ļþи | 99һ| AVպAVŸ߹ۿ| ߾ƷaaaƬ| ޿Ļ| ˬִ̼һ߳| ޾ƷþþþþðĦ| aëƬȫ| ˳˳߹ۿ| ھƷ99Ѹ| ޾ƷŮþþ | ۺһ| ޾ƷѶ| һ| ƷþƵ| Ʒ| ༤רС˵ͼƬ| ƷžžþƵ| պƷһ| պѸ岥| պŷcom91tv| þþƷ˽ӰԺѿ| Ʒa߹ۿ| ѹۿվ| ޸Ƶ| ߾Ʒ| Ƶѹۿ| ˳77777վ| һƵ | Ƶ˹Ʒվ| 91鶹ƷԲ߹ۿ| þһ| av볱߹ۿ| 91ѸƷ| ޹˱ɫ߹ۿ| ձѹۿ| sihuƷ| ҹ޹ϼ|