﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-叶明的javablog-随笔分类-java知识</title><link>http://www.blogjava.net/guming123416/category/6971.html</link><description>java学习天堂,个人关于其他blog：blog.javaworker.cn,欢迎大家访问</description><language>zh-cn</language><lastBuildDate>Tue, 28 Sep 2010 01:45:42 GMT</lastBuildDate><pubDate>Tue, 28 Sep 2010 01:45:42 GMT</pubDate><ttl>60</ttl><item><title>centos5.4下安装apache+svn</title><link>http://www.blogjava.net/guming123416/archive/2010/09/28/333104.html</link><dc:creator>天空苍茫</dc:creator><author>天空苍茫</author><pubDate>Tue, 28 Sep 2010 00:24:00 GMT</pubDate><guid>http://www.blogjava.net/guming123416/archive/2010/09/28/333104.html</guid><wfw:comment>http://www.blogjava.net/guming123416/comments/333104.html</wfw:comment><comments>http://www.blogjava.net/guming123416/archive/2010/09/28/333104.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/guming123416/comments/commentRss/333104.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/guming123416/services/trackbacks/333104.html</trackback:ping><description><![CDATA[<div style="layout-grid:  15.6pt none" class="Section0">
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt">1、</span><span style="font-family: '宋体'; font-size: 10.5pt">首先下载<font face="Times New Roman">apache2.2&nbsp;</font><font face="宋体">下载地址：</font></span><a href="http://mirrors.sohu.com/apache/httpd-2.2.16.tar.gz"><span style="font-family: '宋体'; color: rgb(0,0,255); font-size: 10pt; text-decoration: underline" class="15">http://mirrors.sohu.com/apache/httpd-2.2.16.tar.gz</a></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt">2、</span><span style="font-family: '宋体'; font-size: 10.5pt">然后下载<font face="Times New Roman">SVN</font></span></p>
<p style="margin-top: 0pt; text-indent: -21pt; margin-bottom: 0pt; margin-left: 42pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">a)&nbsp;</span><span style="font-family: '宋体'; font-size: 10.5pt">包：<font face="Times New Roman">subversion-deps-1.6.12.tar.gz</font></span></p>
<p style="margin-top: 0pt; text-indent: -21pt; margin-bottom: 0pt; margin-left: 63pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">i.&nbsp;</span><span style="font-family: '宋体'; font-size: 10.5pt">地址：<font face="Times New Roman">http://subversion.tigris.org/downloads/subversion-deps-1.6.12.tar.gz</font></span></p>
<p style="margin-top: 0pt; text-indent: -21pt; margin-bottom: 0pt; margin-left: 42pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 12pt">b)&nbsp;</span><span style="font-family: '宋体'; font-size: 12pt">susubversion-1.6.12.tar.gz&nbsp;&nbsp;<font face="宋体">地址：</font></span></p>
<p style="margin-top: 0pt; text-indent: -21pt; margin-bottom: 0pt; margin-left: 63pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 12pt">i.&nbsp;</span><span style="font-family: '宋体'; font-size: 12pt">http://subversion.tigris.org/downloads/subversion-1.6.12.tar.gz&nbsp;</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 12pt">3、</span><span style="font-family: '宋体'; font-size: 12pt">然后解析<font face="Times New Roman">Apache2</font><font face="宋体">，安装</font></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 12pt">4、</span><span style="font-family: '宋体'; font-size: 12pt">tar&nbsp;-zxvf&nbsp;</span><span style="font-family: '宋体'; color: rgb(0,0,255); font-size: 10pt; text-decoration: underline" class="15">httpd-2.2.16.tar.gz</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; color: rgb(0,0,255); font-size: 10pt; text-decoration: underline">5、</span><span style="font-family: '宋体'; color: rgb(0,0,255); font-size: 10pt; text-decoration: underline" class="15">安装<font face="Times New Roman">Apache</font></span></p>
<p style="margin-top: 0pt; text-indent: -21pt; margin-bottom: 0pt; margin-left: 42pt" class="p0"><span style="font-family: 'Calibri'; font-size: 9pt">a)&nbsp;</span><span style="font-family: '宋体'; font-size: 9pt">./</span><span style="font-family: 'Calibri'; font-size: 9pt">configure&nbsp;-prefix=/opt/web/apache2&nbsp;--enable-mods-shared=all&nbsp;--enable-so</span></p>
<p style="margin-top: 0pt; text-indent: -21pt; margin-bottom: 0pt; margin-left: 42pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 12pt">b)&nbsp;</span><span style="font-family: '宋体'; font-size: 12pt">Make</span></p>
<p style="margin-top: 0pt; text-indent: -21pt; margin-bottom: 0pt; margin-left: 42pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 12pt">c)&nbsp;</span><span style="font-family: '宋体'; font-size: 12pt">Make&nbsp;install</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 12pt">6、</span><span style="font-family: '宋体'; font-size: 12pt">检查<font face="Times New Roman">APACHE</font><font face="宋体">是否安装成功：</font></span></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 12pt">启动<font face="Times New Roman">apache:/opt/web/apache2/bin/apachectl&nbsp;start</font></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 12pt">7、</span><span style="font-family: '宋体'; font-size: 12pt">安装<font face="Times New Roman">Svn</font></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 12pt">8、</span><span style="font-family: '宋体'; font-size: 12pt">首先解压：&nbsp;<font face="Times New Roman">tar&nbsp;-zxvf&nbsp;</font></span><span style="font-family: '宋体'; font-size: 10.5pt">subversion-deps-1.6.12.tar.gz</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt">9、</span><span style="font-family: '宋体'; font-size: 10.5pt">然后解压：<font face="Times New Roman">t</font></span><span style="font-family: '宋体'; font-size: 12pt">ar&nbsp;-zxvf&nbsp;susubversion-1.6.12.tar.gz&nbsp;</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 12pt">10、</span><span style="font-family: '宋体'; font-size: 12pt">安装命令：</span></p>
<p style="margin-top: 0pt; text-indent: -21pt; margin-bottom: 0pt; margin-left: 42pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 12pt">a)&nbsp;</span><span style="font-family: '宋体'; font-size: 12pt">./configure&nbsp;--prefix=/opt/web/subversion&nbsp;--with-apxs=/opt/web/apache2/bin/apxs&nbsp;--with-apr=/opt/web/httpd-2.2.16/srclib/apr&nbsp;&nbsp;--with-apr-util=/opt/web/httpd-2.2.16/srclib/apr-util</span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 12pt">11<font face="宋体">、</font><font face="Times New Roman">make&nbsp;&nbsp;make&nbsp;install</font></span></p>
</div>
<img src ="http://www.blogjava.net/guming123416/aggbug/333104.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/guming123416/" target="_blank">天空苍茫</a> 2010-09-28 08:24 <a href="http://www.blogjava.net/guming123416/archive/2010/09/28/333104.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Lucene（2.4.1）技术研究(5)--IndexWrite类源代码解析（四）RAMDirectory介绍 </title><link>http://www.blogjava.net/guming123416/archive/2009/05/08/269601.html</link><dc:creator>天空苍茫</dc:creator><author>天空苍茫</author><pubDate>Fri, 08 May 2009 05:56:00 GMT</pubDate><guid>http://www.blogjava.net/guming123416/archive/2009/05/08/269601.html</guid><wfw:comment>http://www.blogjava.net/guming123416/comments/269601.html</wfw:comment><comments>http://www.blogjava.net/guming123416/archive/2009/05/08/269601.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/guming123416/comments/commentRss/269601.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/guming123416/services/trackbacks/269601.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp; RAMDirectory是Directory抽象类在使用内存最为文件存储的实现类，其主要是将所有的索引文件保存到内存中。这样可以提高效率。但是如果索引文件过大的话，则会导致内存不足，因此，小型的系统推荐使用，如果大型的，索引文件达到G级别上，推荐使用FSDirectory首先我们看看该类的源代码：首先该类继承与抽象类Directory，并且实现了序列话接口&n...&nbsp;&nbsp;<a href='http://www.blogjava.net/guming123416/archive/2009/05/08/269601.html'>阅读全文</a><img src ="http://www.blogjava.net/guming123416/aggbug/269601.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/guming123416/" target="_blank">天空苍茫</a> 2009-05-08 13:56 <a href="http://www.blogjava.net/guming123416/archive/2009/05/08/269601.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Lucene（2.4.1）技术研究(5)--IndexWrite类源代码解析（三）FSDirectory介绍</title><link>http://www.blogjava.net/guming123416/archive/2009/05/05/269036.html</link><dc:creator>天空苍茫</dc:creator><author>天空苍茫</author><pubDate>Tue, 05 May 2009 10:02:00 GMT</pubDate><guid>http://www.blogjava.net/guming123416/archive/2009/05/05/269036.html</guid><wfw:comment>http://www.blogjava.net/guming123416/comments/269036.html</wfw:comment><comments>http://www.blogjava.net/guming123416/archive/2009/05/05/269036.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/guming123416/comments/commentRss/269036.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/guming123416/services/trackbacks/269036.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 其中常用的就是FSDirectory：表示对文件系统目录的操作。RAMDirectory&nbsp;：内存中的目录操作。首先我们看看类FSDirectory的源代码import&nbsp;java.io.File;import&nbsp;java.io.FileInputStream;import&nbsp;java.io.FileOutputStream;import&n...&nbsp;&nbsp;<a href='http://www.blogjava.net/guming123416/archive/2009/05/05/269036.html'>阅读全文</a><img src ="http://www.blogjava.net/guming123416/aggbug/269036.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/guming123416/" target="_blank">天空苍茫</a> 2009-05-05 18:02 <a href="http://www.blogjava.net/guming123416/archive/2009/05/05/269036.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下安装Oracle11G </title><link>http://www.blogjava.net/guming123416/archive/2009/04/17/266195.html</link><dc:creator>天空苍茫</dc:creator><author>天空苍茫</author><pubDate>Fri, 17 Apr 2009 09:27:00 GMT</pubDate><guid>http://www.blogjava.net/guming123416/archive/2009/04/17/266195.html</guid><wfw:comment>http://www.blogjava.net/guming123416/comments/266195.html</wfw:comment><comments>http://www.blogjava.net/guming123416/archive/2009/04/17/266195.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/guming123416/comments/commentRss/266195.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/guming123416/services/trackbacks/266195.html</trackback:ping><description><![CDATA[<div class="textbox-content" id="zoomtext">
<p>1、首先检查一下linux下是有存在一下软件，如果不存在，必须将这些软件安装<br />
rpm -q compat-libstdc++-33 elfutils-libelf elfutils-libelf-devel glibc glibc-common glibc-devel gcc- gcc-c++ libaio-devel libaio libgcc libstdc++ libstdc++-devel make sysstat unixODBC unixODBC-devel<br />
2、以root方式登陆，修改/etc/sysctl.conf，在文件中增加一下参数<br />
kernel.shmall = 2097152<br />
kernel.shmmax = 2147483648<br />
kernel.shmmni = 4096<br />
kernel.sem = 250 32000 100 128<br />
fs.file-max = 65536<br />
net.ipv4.ip_local_port_range =1024 65000<br />
net.core.rmem_default = 4194304<br />
net.core.rmem_max = 4194304<br />
net.core.wmem_default =262144<br />
net.core.wmem_max =262144</p>
<p>然后创建数据库的所有者：<br />
groupadd oinstall<br />
groupadd dba<br />
useradd -g oinstall -G dba Oracle 创建用户Oracle<br />
passwd Oracle（修改Oracle的密码）<br />
修改Oracle用户的限制<br />
cd /etc/security<br />
vi limits.conf<br />
在该文件增加一下内容<br />
Oracle soft nproc 2047<br />
Oracle hard nproc 16384<br />
Oracle soft nofile 1024<br />
Oracle hard nofile 65536<br />
在文件/etc/pam.d/login文件增加一下内容<br />
session required /lib/security/pam_limits.so<br />
session required pam_limits.so<br />
在文件/etc/profile增加一下内容</p>
<p>if [$USER = "Oracle"] ; then<br />
if [ $SHELL = " /bin/ksh" ]; then<br />
ulimit -p 16384<br />
ulimit -n 65535<br />
else<br />
ulimit -u 16384 -n 65536<br />
fi<br />
fi<br />
创建安装目录：<br />
mkdir -p /opt/app/oracle<br />
chown -P Oracle:oinstall /opt/app<br />
chmod -R 755 /opt/app<br />
执行命令，解压安装文件 ：unzip linux_11gR1_database.zip<br />
然后进入解压后的目录，执行<br />
$ ./runInstaller</p>
</div>
<img src ="http://www.blogjava.net/guming123416/aggbug/266195.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/guming123416/" target="_blank">天空苍茫</a> 2009-04-17 17:27 <a href="http://www.blogjava.net/guming123416/archive/2009/04/17/266195.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Lucene（2.4.1）技术研究(5)--IndexWrite类源代码解析（二）--Directory 解析 </title><link>http://www.blogjava.net/guming123416/archive/2009/04/16/266008.html</link><dc:creator>天空苍茫</dc:creator><author>天空苍茫</author><pubDate>Thu, 16 Apr 2009 09:32:00 GMT</pubDate><guid>http://www.blogjava.net/guming123416/archive/2009/04/16/266008.html</guid><wfw:comment>http://www.blogjava.net/guming123416/comments/266008.html</wfw:comment><comments>http://www.blogjava.net/guming123416/archive/2009/04/16/266008.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/guming123416/comments/commentRss/266008.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/guming123416/services/trackbacks/266008.html</trackback:ping><description><![CDATA[<p>首先我们看构造函数中的第一个类Directory 类。根据这个类的英文，我们能得出这个类就是关于目录操作的。Directory 是一个抽象类。其有4个子类，分别是：DbDirectory, FSDirectory, JEDirectory, RAMDirectory </p>
<p>首先我们看看Directory 的类<br />
public abstract class Directory {<br />
volatile boolean isOpen = true;<br />
/*** 持有一个LockFactory的实例（实现锁定这个目录实例）*/<br />
protected LockFactory lockFactory;<br />
/**返回该目录下的所有文件数组.如果这个目录下没有文件存在，或者存在权限问题不能访问，该方法可能返回Null*/<br />
public abstract String[] list() throws IOException;<br />
/** * 返回指定名称的文件是不是存在 */<br />
public abstract boolean fileExists(String name)<br />
throws IOException;<br />
/**返回指定名称的文件最后修改的时间<br />
public abstract long fileModified(String name) throws IOException;<br />
/**设置指定文件名的文件最后的修改时间为当前时间*/<br />
public abstract void touchFile(String name) throws IOException;</p>
<p>/**删除指定文件。 */<br />
public abstract void deleteFile(String name)throws IOException;<br />
/**返回指定文件的长度。 */<br />
public abstract long fileLength(String name) throws IOException;<br />
/** 在当前目录下使用给定的名称创建一个空的文件。并且返回一个流来写该文件。*/<br />
public abstract IndexOutput createOutput(String name) throws IOException; <br />
/** * Lucene使用该方法确保所有的针对该文件的写操作都会存储到Index。并且阻止machine/OS发生故障 破坏该index。*/<br />
public void sync(String name) throws IOException {}<br />
/**获取已经存在的一个文件的IndexInput流操作该文件。 */<br />
public abstract IndexInput openInput(String name) throws IOException;<br />
/** 返回已经存在的一个文件、并且使用指定大小的缓冲的IndexInput，但是当前目录也可能忽略该缓冲池的大小，<br />
* 当前主要是考虑CompoundFileReader和FSDirectory对于次参数的需求。*/<br />
public IndexInput openInput(String name, int bufferSize) throws IOException {<br />
return openInput(name);<br />
}<br />
/** 创建一个指定名称的锁/<br />
public Lock makeLock(String name) {<br />
return lockFactory.makeLock(name);<br />
}<br />
/**<br />
* 清除指定的锁定（强行解锁和删除）这不仅要求在这个时候当前的锁一定不在使用。 */<br />
public void clearLock(String name) throws IOException {<br />
if (lockFactory != null) {<br />
lockFactory.clearLock(name);<br />
}<br />
}<br />
/** 结束这个store. */<br />
public abstract void close() throws IOException;</p>
<p>/**设置LockFactory，此目录实例应使其锁定执行。每个LockFactory实例只用于一个目录（即，不要共用一个实例在多个目录） */<br />
public void setLockFactory(LockFactory lockFactory) {<br />
this.lockFactory = lockFactory;<br />
lockFactory.setLockPrefix(this.getLockID());<br />
}</p>
<p>/** 获得LockFactory，此目录例实例使用其锁定执行。请注意，这可能是无效的目录执行，提供自己锁执行*/<br />
public LockFactory getLockFactory() {<br />
return this.lockFactory;<br />
}<br />
/**过去锁实例的唯一表示ID的字符串描述*/<br />
public String getLockID() {<br />
return this.toString();<br />
}<br />
/**// 拷贝源目录src下的文件，复制到目的目录dest下面，拷贝完成后关闭源目录src*/<br />
public static void copy(Directory src, Directory dest, boolean closeDirSrc) throws IOException {<br />
final String[] files = src.list();<br />
if (files == null)<br />
throw new IOException("cannot read directory " + src + ": list() returned null");<br />
byte[] buf = new byte[BufferedIndexOutput.BUFFER_SIZE];<br />
for (int i = 0; i &lt; files.length; i++) {<br />
IndexOutput os = null;<br />
IndexInput is = null;<br />
try {<br />
// create file in dest directory<br />
os = dest.createOutput(files[i]);<br />
// read current file<br />
is = src.openInput(files[i]);<br />
// and copy to dest directory<br />
long len = is.length();<br />
long readCount = 0;<br />
while (readCount &lt; len) {<br />
int toRead = readCount + BufferedIndexOutput.BUFFER_SIZE &gt; len ? (int)(len - readCount) : BufferedIndexOutput.BUFFER_SIZE;<br />
is.readBytes(buf, 0, toRead);<br />
os.writeBytes(buf, toRead);<br />
readCount += toRead;<br />
}<br />
} finally {<br />
// graceful cleanup<br />
try {<br />
if (os != null)<br />
os.close();<br />
} finally {<br />
if (is != null)<br />
is.close();<br />
}<br />
}<br />
}<br />
if(closeDirSrc)<br />
src.close();<br />
}</p>
<p>从Directory抽象类的定义，我们可以得到如下几点：<br />
1、管理锁工厂及其锁实例；<br />
2、管理Directory目录实例的基本属性，主要是通过文件名称进行管理；<br />
3、管理与操作该目录相关的一些流对象；<br />
4、管理索引文件的拷贝。<br />
</p>
<img src ="http://www.blogjava.net/guming123416/aggbug/266008.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/guming123416/" target="_blank">天空苍茫</a> 2009-04-16 17:32 <a href="http://www.blogjava.net/guming123416/archive/2009/04/16/266008.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Lucene（2.4.1）技术研究(5)--IndexWrite类源代码解析（一）</title><link>http://www.blogjava.net/guming123416/archive/2009/04/07/264298.html</link><dc:creator>天空苍茫</dc:creator><author>天空苍茫</author><pubDate>Tue, 07 Apr 2009 09:39:00 GMT</pubDate><guid>http://www.blogjava.net/guming123416/archive/2009/04/07/264298.html</guid><wfw:comment>http://www.blogjava.net/guming123416/comments/264298.html</wfw:comment><comments>http://www.blogjava.net/guming123416/archive/2009/04/07/264298.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/guming123416/comments/commentRss/264298.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/guming123416/services/trackbacks/264298.html</trackback:ping><description><![CDATA[<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">1、</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">indexWriter<font face="宋体">类主要功能是对索引的创建，加入Document后，合并各种索引段，以及控制与索引相关的其他方面，它是lucene索引的主要操纵者。</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">2、</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><font face="宋体">我们首先看看IndexWriter的构造函数</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">public&nbsp;IndexWriter(String&nbsp;path,&nbsp;Analyzer&nbsp;a,&nbsp;boolean&nbsp;create,&nbsp;MaxFieldLength&nbsp;mfl)</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">public&nbsp;IndexWriter(String&nbsp;path,&nbsp;Analyzer&nbsp;a,&nbsp;boolean&nbsp;create)(<font face="宋体">废弃，不提倡使用)</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">public&nbsp;IndexWriter(File&nbsp;path,&nbsp;Analyzer&nbsp;a,&nbsp;boolean&nbsp;create,&nbsp;MaxFieldLength&nbsp;mfl)</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">public&nbsp;IndexWriter(File&nbsp;path,&nbsp;Analyzer&nbsp;a,&nbsp;boolean&nbsp;create)(<font face="宋体">废弃，不提倡使用)</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">public&nbsp;IndexWriter(Directory&nbsp;d,&nbsp;Analyzer&nbsp;a,&nbsp;boolean&nbsp;create,&nbsp;MaxFieldLength&nbsp;mfl)</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">public&nbsp;IndexWriter(Directory&nbsp;d,&nbsp;Analyzer&nbsp;a,&nbsp;boolean&nbsp;create)(<font face="宋体">废弃，不提倡使用)</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">public&nbsp;IndexWriter(String&nbsp;path,&nbsp;Analyzer&nbsp;a,&nbsp;MaxFieldLength&nbsp;mfl)</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">public&nbsp;IndexWriter(String&nbsp;path,&nbsp;Analyzer&nbsp;a)(<font face="宋体">废弃，不提倡使用)</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">public&nbsp;IndexWriter(File&nbsp;path,&nbsp;Analyzer&nbsp;a,&nbsp;MaxFieldLength&nbsp;mfl)</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">public&nbsp;IndexWriter(File&nbsp;path,&nbsp;Analyzer&nbsp;a)(<font face="宋体">废弃，不提倡使用)</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">public&nbsp;IndexWriter(Directory&nbsp;d,&nbsp;Analyzer&nbsp;a,&nbsp;MaxFieldLength&nbsp;mfl)</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">public&nbsp;IndexWriter(Directory&nbsp;d,&nbsp;Analyzer&nbsp;a)(<font face="宋体">废弃，不提倡使用)</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">public&nbsp;IndexWriter(Directory&nbsp;d,&nbsp;boolean&nbsp;autoCommit,&nbsp;Analyzer&nbsp;a)(<font face="宋体">废弃，不提倡使用)</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">public&nbsp;IndexWriter(Directory&nbsp;d,&nbsp;boolean&nbsp;autoCommit,&nbsp;Analyzer&nbsp;a,&nbsp;boolean&nbsp;create)<font face="宋体">（废弃，不提倡使用)</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">public&nbsp;IndexWriter(Directory&nbsp;d,&nbsp;Analyzer&nbsp;a,&nbsp;IndexDeletionPolicy&nbsp;deletionPolicy,&nbsp;MaxFieldLength&nbsp;mfl)</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">public&nbsp;IndexWriter(Directory&nbsp;d,&nbsp;boolean&nbsp;autoCommit,&nbsp;Analyzer&nbsp;a,&nbsp;IndexDeletionPolicy&nbsp;deletionPolicy)<font face="宋体">（废弃，不提倡使用)</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">public&nbsp;IndexWriter(Directory&nbsp;d,&nbsp;Analyzer&nbsp;a,&nbsp;boolean&nbsp;create,&nbsp;IndexDeletionPolicy&nbsp;deletionPolicy,&nbsp;MaxFieldLength&nbsp;mfl)</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">public&nbsp;IndexWriter(Directory&nbsp;d,&nbsp;boolean&nbsp;autoCommit,&nbsp;Analyzer&nbsp;a,&nbsp;boolean&nbsp;create,&nbsp;IndexDeletionPolicy&nbsp;deletionPolicy)<font face="宋体">（废弃，不提倡使用)</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><font face="宋体">细心的读者肯定会发现，废弃的构造函数与提倡使用的构造函数，多了一个MaxFieldLength参数。带有该参数的构造函数都是允许正常使用的。</font></span><span style="font-size: 10.5pt; color: rgb(255,0,0); font-family: '宋体'; mso-spacerun: 'yes'"><font face="宋体">（注释：废弃的构造函数将在Lucene3.0中移除）</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><font face="宋体">仔细查看其构造函数的实现呢，最终都转化成一个私有的构造函数：如图：</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">/**</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">*&nbsp;<font face="宋体">该构造函数主要是创建一个IndexWrite对象</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">*&nbsp;d&nbsp;<font face="宋体">：指定的存放建立索引文件的索引目录</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">*&nbsp;a&nbsp;<font face="宋体">：Analyzer&nbsp;&nbsp;分词分析器</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">*&nbsp;create&nbsp;<font face="宋体">：是否要重新写入索引文件，如果为true，则重写索引文件；如果为false，则追加写入索引文件</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">*&nbsp;closeDir&nbsp;<font face="宋体">：一个boolean型变量，表示是否关闭索引目录Directory&nbsp;d，与IndexWriter的一个成员变量相关</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">*&nbsp;deletionPolicy&nbsp;<font face="宋体">：指定删除索引文件使用的策略</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">*&nbsp;autoCommit&nbsp;<font face="宋体">：建立索引文件后，自动提交。</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">*&nbsp;maxFieldLength&nbsp;<font face="宋体">：&nbsp;表示索引中Field的最大长度。</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">*/</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">private&nbsp;void&nbsp;init(Directory&nbsp;d,&nbsp;Analyzer&nbsp;a,&nbsp;final&nbsp;boolean&nbsp;create,&nbsp;boolean&nbsp;closeDir,&nbsp;IndexDeletionPolicy&nbsp;deletionPolicy,&nbsp;boolean&nbsp;autoCommit,&nbsp;int&nbsp;maxFieldLength)</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;CorruptIndexException,&nbsp;LockObtainFailedException,&nbsp;IOException&nbsp;{</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;this.closeDir&nbsp;=&nbsp;closeDir;</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;directory&nbsp;=&nbsp;d;</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;analyzer&nbsp;=&nbsp;a;</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;setMessageID(defaultInfoStream);</span><span style="font-size: 10.5pt; color: rgb(51,153,102); font-family: '宋体'; mso-spacerun: 'yes'">//<font face="宋体">这里主要是指定infoStream，是一个PrintStream输出流对象</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;this.maxFieldLength&nbsp;=&nbsp;maxFieldLength;</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-size: 10.5pt; color: rgb(51,153,102); font-family: '宋体'; mso-spacerun: 'yes'">//<font face="宋体">指定Field数据的最大长度</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(create)&nbsp;{</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;</span><span style="font-size: 10.5pt; color: rgb(51,153,102); font-family: '宋体'; mso-spacerun: 'yes'"><font face="宋体">如果是重新创建索引文件</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><font face="宋体">，</font></span><span style="font-size: 10.5pt; color: rgb(51,153,102); font-family: 'Times New Roman'; mso-spacerun: 'yes'"><font face="宋体">清除写锁文件write.lock</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;directory.clearLock(WRITE_LOCK_NAME);</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;Lock&nbsp;writeLock&nbsp;=&nbsp;directory.makeLock(WRITE_LOCK_NAME);</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!writeLock.obtain(writeLockTimeout))&nbsp;//&nbsp;</span><span style="font-size: 10.5pt; color: rgb(51,153,102); font-family: '宋体'; mso-spacerun: 'yes'"><font face="宋体">获取写锁文件</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;LockObtainFailedException("Index&nbsp;locked&nbsp;for&nbsp;write:&nbsp;"&nbsp;+&nbsp;writeLock);</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;this.writeLock&nbsp;=&nbsp;writeLock;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 10.5pt; color: rgb(51,153,102); font-family: '宋体'; mso-spacerun: 'yes'">//<font face="宋体">保存新的写锁文件</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(create)&nbsp;{</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;</span><span style="font-size: 10.5pt; color: rgb(51,153,102); font-family: '宋体'; mso-spacerun: 'yes'"><font face="宋体">如果create为true，表示重写索引文件。重写索引文件之前，要先读取已经存在的索引文件，并且要清除掉历史写入的segment信息</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;segmentInfos.read(directory);</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;segmentInfos.clear();</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(IOException&nbsp;e)&nbsp;{</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;segmentInfos.commit(directory);&nbsp;&nbsp;</span><span style="font-size: 10.5pt; color: rgb(51,153,102); font-family: '宋体'; mso-spacerun: 'yes'">//&nbsp;<font face="宋体">向指定的索引存放目录中写入segment信息</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;segmentInfos.read(directory);</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-size: 10.5pt; color: rgb(51,153,102); font-family: '宋体'; mso-spacerun: 'yes'">//<font face="宋体">读取segment信息</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;We&nbsp;assume&nbsp;that&nbsp;this&nbsp;segments_N&nbsp;was&nbsp;previously</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;properly&nbsp;sync'd:</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;i=0;i&lt;segmentInfos.size();i++)&nbsp;{</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;SegmentInfo&nbsp;info&nbsp;=&nbsp;segmentInfos.info(i);</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;files&nbsp;=&nbsp;info.files();</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;j=0;j&lt;files.size();j++)</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;synced.add(files.get(j));</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.autoCommit&nbsp;=&nbsp;autoCommit;</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-size: 10.5pt; color: rgb(51,153,102); font-family: '宋体'; mso-spacerun: 'yes'">//<font face="宋体">执行提交写入索引的标志&nbsp;</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setRollbackSegmentInfos(segmentInfos);</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">//<font face="宋体">克隆原来的</font></span><span style="font-size: 10.5pt; color: rgb(51,153,102); font-family: '宋体'; mso-spacerun: 'yes'">segment<font face="宋体">状态信息，并且将信息保存到HashSet。</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;docWriter&nbsp;=&nbsp;new&nbsp;DocumentsWriter(directory,&nbsp;this);</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-size: 10.5pt; color: rgb(51,153,102); font-family: '宋体'; mso-spacerun: 'yes'">//<font face="宋体">创建一个DocumentsWriter对象</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;docWriter.setInfoStream(infoStream);</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">//<font face="宋体">设置</font></span><span style="font-size: 10.5pt; color: rgb(51,153,102); font-family: '宋体'; mso-spacerun: 'yes'">DocumentsWriter<font face="宋体">对象的</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">infoStream<font face="宋体">信息</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;docWriter.setMaxFieldLength(maxFieldLength);</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">//<font face="宋体">设置</font></span><span style="font-size: 10.5pt; color: rgb(51,153,102); font-family: '宋体'; mso-spacerun: 'yes'">DocumentsWriter<font face="宋体">对象的</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">maxFieldLength<font face="宋体">信息</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<font face="宋体">默认的删除策略实现类为KeepOnlyLastCommitDeletionPolicy，它只是保证将最近提交删除的索引文件，提交删除动作&nbsp;</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;IndexFileDeleter&nbsp;deleter<font face="宋体">是IndexWriter类的一个私有的成员变量，它在org.apache.lucene.index包里面，主要对删除索引文件进行实现和管理&nbsp;</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;deleter&nbsp;=&nbsp;new&nbsp;IndexFileDeleter(directory,</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;deletionPolicy&nbsp;==&nbsp;null&nbsp;?&nbsp;new&nbsp;KeepOnlyLastCommitDeletionPolicy()&nbsp;:&nbsp;deletionPolicy,</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;segmentInfos,&nbsp;infoStream,&nbsp;docWriter);</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pushMaxBufferedDocs();</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">//<font face="宋体">刷新DocsBuffer。</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(infoStream&nbsp;!=&nbsp;null)&nbsp;{</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">//<font face="宋体">如果infoStream是null</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message("init:&nbsp;create="&nbsp;+&nbsp;create);</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;messageState();</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(IOException&nbsp;e)&nbsp;{</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.writeLock.release();</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.writeLock&nbsp;=&nbsp;null;</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;e;</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;}&nbsp;</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'">&nbsp;&nbsp;<font face="宋体">通过IndexWrite的构造函数，以及最终的实现方法的init分发，其主要是实现了根据指定的建立索引的方式(重写、追加写入)，通过create标志位来判断，从而指定一种在操作索引文件的过程中删除索引文件的策略。</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><font face="宋体">在理解lucene的时间，必须熟悉其初始化</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'">IndexWrite<font face="宋体">的原理，才能深入了解该框架在创建索引的核心实现机制。</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<!--endfragment-->
<img src ="http://www.blogjava.net/guming123416/aggbug/264298.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/guming123416/" target="_blank">天空苍茫</a> 2009-04-07 17:39 <a href="http://www.blogjava.net/guming123416/archive/2009/04/07/264298.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Lucene（2.4.1）技术研究(4)--Field源代码</title><link>http://www.blogjava.net/guming123416/archive/2009/03/31/263059.html</link><dc:creator>天空苍茫</dc:creator><author>天空苍茫</author><pubDate>Tue, 31 Mar 2009 02:48:00 GMT</pubDate><guid>http://www.blogjava.net/guming123416/archive/2009/03/31/263059.html</guid><wfw:comment>http://www.blogjava.net/guming123416/comments/263059.html</wfw:comment><comments>http://www.blogjava.net/guming123416/archive/2009/03/31/263059.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/guming123416/comments/commentRss/263059.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/guming123416/services/trackbacks/263059.html</trackback:ping><description><![CDATA[<p>Field类（类似数据库中的字段与属性）<br />
&nbsp;&nbsp;&nbsp;&nbsp;该类实现接口：Fieldable&nbsp;&nbsp;&nbsp; 继承静态类: AbstractField<br />
&nbsp;&nbsp;&nbsp;&nbsp;Fieldable接口。主要是描述一些基础信息的内容<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;设置权重以及获取权重 [void setBoost(float boost), float getBoost();]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;获取名称String name();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;获取String类型的值public String stringValue();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以Reader方式返回public Reader readerValue();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以二进制或者TokenStream&nbsp; 方式返回public byte[] binaryValue();public TokenStream &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tokenStreamValue();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否被存储boolean&nbsp; isStored();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否被索引boolean&nbsp; isIndexed();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否被分词boolean&nbsp; isTokenized();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否是压缩存储 boolean&nbsp; isCompressed();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否是二进制boolean&nbsp; isBinary();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;......其他的读者可以参考源代码<br />
AbstractField抽象类定义的一些常量：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protected String name = "body";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //表示该Filed的名称<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protected boolean storeTermVector = false;&nbsp;&nbsp;&nbsp;&nbsp;//表示是否存储词条向量<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected boolean storeOffsetWithTermVector = false;&nbsp;&nbsp;//存储词条向量的偏移量<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protected boolean storePositionWithTermVector = false;&nbsp;&nbsp;//存储词条向量的位置<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protected boolean omitNorms = false;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protected boolean isStored = false;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//是否存储<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protected boolean isIndexed = true;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//是否是索引<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protected boolean isTokenized = true;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//是否是分词<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protected boolean isBinary = false;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//是否是二进制数据<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protected boolean isCompressed = false;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//是否是压缩<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protected boolean lazy = false;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//是否是延迟<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protected boolean omitTf = false;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protected float boost = 1.0f;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置激励因子<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protected Object fieldsData = null;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Field的内部属性的具体内容<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protected int binaryLength;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//二进制数据长度<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protected int binaryOffset;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//二进制数据偏移量</p>
<p>Filed类源代码解析<br />
&nbsp;&nbsp;&nbsp;&nbsp;首先Filed内部定义了三个静态类Store、Index、TermVector。<br />
//定一个静态类Store ，主要为了设置Field的存储属性<br />
public static final class Store extends Parameter implements Serializable {<br />
&nbsp;&nbsp;&nbsp; private Store(String name) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super(name);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; //使用压缩的方式来存储Field的值<br />
&nbsp;&nbsp;&nbsp; public static final Store COMPRESS = new Store("COMPRESS");<br />
&nbsp;&nbsp;&nbsp; //在索引中存储Field的值<br />
&nbsp;&nbsp;&nbsp; public static final Store YES = new Store("YES");<br />
&nbsp;&nbsp;&nbsp; //在索引中不存贮Field的值<br />
&nbsp;&nbsp;&nbsp; public static final Store NO = new Store("NO");<br />
&nbsp; }<br />
//定一个静态类Index ，主要为了设置Field的索引属性<br />
public static final class Index extends Parameter implements Serializable {<br />
&nbsp;&nbsp;&nbsp; private Index(String name) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super(name);<br />
&nbsp;}<br />
&nbsp;//不对Field进行索引，所以这个Field就不能被检索到(一般来说，建立索引而使它不被检索，这是没有意义的)<br />
&nbsp;//如果对该Field还设置了Field.Store为Field.Store.YES或Field.Store.COMPRESS，则可以检索<br />
&nbsp;&nbsp;&nbsp; public static final Index NO = new Index("NO");</p>
<p>&nbsp;&nbsp; &nbsp;//对Field进行索引，同时还要对其进行分词(由Analyzer来管理如何分词)<br />
&nbsp;&nbsp;&nbsp; public static final Index ANALYZED = new Index("ANALYZED");<br />
//废弃的属性，使用ANALYZED 来替代<br />
&nbsp;&nbsp;&nbsp;&nbsp; public static final Index TOKENIZED = ANALYZED;<br />
//对Field进行索引，但是不对该Field使用分词<br />
&nbsp;&nbsp;&nbsp; public static final Index NOT_ANALYZED = new Index("NOT_ANALYZED");<br />
//废弃的属性，使用NOT_ANALYZED来替代<br />
&nbsp;&nbsp;&nbsp; public static final Index UN_TOKENIZED = NOT_ANALYZED;<br />
//即不对Field索引，也不对其使用Analyzer来分词<br />
&nbsp;&nbsp;&nbsp; public static final Index NOT_ANALYZED_NO_NORMS = new&nbsp; Index("NOT_ANALYZED_NO_NORMS");<br />
//废弃的属性，有NOT_ANALYZED_NO_NORMS来替代<br />
&nbsp;&nbsp;&nbsp; public static final Index NO_NORMS = NOT_ANALYZED_NO_NORMS;<br />
//对Field属性，使用分词，但是不是使用Analyzer来分词<br />
&nbsp;&nbsp;&nbsp; public static final Index ANALYZED_NO_NORMS = new Index("ANALYZED_NO_NORMS");<br />
&nbsp; }<br />
这是一个与词条有关的类。因为在检索的时候需要指定检索关键字，通过为一个Field添加一个TermVector，就可以在检索中把该Field检索到。<br />
public static final class TermVector&nbsp; extends Parameter implements Serializable {<br />
&nbsp;&nbsp;&nbsp; private TermVector(String name) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super(name);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; //不存储<br />
&nbsp;&nbsp;&nbsp; public static final TermVector NO = new TermVector("NO");<br />
&nbsp;&nbsp; &nbsp;//为每个Document都存储一个TermVector<br />
&nbsp;&nbsp;&nbsp; public static final TermVector YES = new TermVector("YES");<br />
&nbsp;&nbsp;&nbsp; //存储，并且存在位置信息<br />
&nbsp;&nbsp;&nbsp; public static final TermVector WITH_POSITIONS = new TermVector("WITH_POSITIONS");<br />
&nbsp;&nbsp;&nbsp; //存储，并且存贮偏移量信息<br />
&nbsp;&nbsp;&nbsp; public static final TermVector WITH_OFFSETS = new TermVector("WITH_OFFSETS");<br />
&nbsp;&nbsp;&nbsp; //存储位置、偏移量等所有信息<br />
&nbsp;&nbsp;&nbsp; public static final TermVector WITH_POSITIONS_OFFSETS = new TermVector("WITH_POSITIONS_OFFSETS");<br />
&nbsp; }</p>
<p>构造函数<br />
&nbsp;public Field(String name, String value, Store store, Index index)&nbsp;&nbsp; <br />
public Field(String name, String value, Store store, Index index, TermVector termVector)<br />
public Field(String name, Reader reader)<br />
public Field(String name, Reader reader, TermVector termVector)<br />
public Field(String name, TokenStream tokenStream) <br />
public Field(String name, TokenStream tokenStream, TermVector termVector)<br />
&nbsp;public Field(String name, byte[] value, Store store) <br />
public Field(String name, byte[] value, int offset, int length, Store store) </p>
<p>流程：<br />
首先检查name以及values不能为空以及Nnull。<br />
然后检查是否是存储以及是否分词如果两者都是No，则抛出异常。<br />
然后检查是否存储以及是否向量分词，如果两者都是No'，则抛出异常。<br />
然后将该Filed的名称命令传递过来的名称源代码（this.name = name.intern）<br />
表示获取JVM String常量池的地址<br />
此时根据Store的值，来设置是否存储以及压缩的值<br />
然后根据Index的值，来设置是否索引、是否分词、omitNorms&nbsp; 的值以及置是否是二进制<br />
然后开始根据TermVector 的值，来设置是否存储向量、是否存储偏移量、是否存储位置等信息。<br />
<br />
<br />
以上信息可能存在分析不正确，请大家给指证，本人英语有不怎么好，<br />
<br />
</p>
<script type="text/javascript"><!--
google_ad_client = "pub-5850191600757552";
/* 728x90, 创建于 09-3-30 */
google_ad_slot = "5627680550";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script><script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
 <img src ="http://www.blogjava.net/guming123416/aggbug/263059.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/guming123416/" target="_blank">天空苍茫</a> 2009-03-31 10:48 <a href="http://www.blogjava.net/guming123416/archive/2009/03/31/263059.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Lucene（2.4.1）技术研究(3)--Document源代码</title><link>http://www.blogjava.net/guming123416/archive/2009/03/30/262909.html</link><dc:creator>天空苍茫</dc:creator><author>天空苍茫</author><pubDate>Mon, 30 Mar 2009 08:17:00 GMT</pubDate><guid>http://www.blogjava.net/guming123416/archive/2009/03/30/262909.html</guid><wfw:comment>http://www.blogjava.net/guming123416/comments/262909.html</wfw:comment><comments>http://www.blogjava.net/guming123416/archive/2009/03/30/262909.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/guming123416/comments/commentRss/262909.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/guming123416/services/trackbacks/262909.html</trackback:ping><description><![CDATA[<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">1、</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">Document<font face="宋体">文件</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">Document<font face="宋体">是lucene自己定义的一种文件格式，lucene使用docement来代替对应的物理文件或者保存在数据库中的数据。因此Document只能作为数据源在Lucene中的数据存贮的一种文件形式。</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">Document<font face="宋体">只是负责收集数据源，因为不同的文件可以构建同一个Document。只要用户将不同的文件创建成Document类型的文件，Lucene就能快速找到查找并且使用他们。</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><font face="宋体">对于一个Document文件，可以同时增加多个Field。Lucene中对于每个数据源是使用Field类来表示的。多个Field组成一个Document，多个Document组成一个索引文件。Document与Field关系如果一所示</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span>&nbsp;</p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><img height="230" alt="" src="http://www.blogjava.net/images/blogjava_net/guming123416/document.gif" width="604" border="0" /><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><font face="宋体">此时，我们去看看Document这个类的源代码。Document采用默认不带参数的构造函数，但是我们他在创建的时间，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;产生两个变量：</font></span><span style="font-size: 10.5pt; background: rgb(255,255,255); color: rgb(0,0,192); font-family: '&#203;&#206;&#204;&#229;'; mso-spacerun: 'yes'">fields</span><span style="font-size: 10.5pt; background: rgb(255,255,255); color: rgb(0,0,192); font-family: '宋体'; mso-spacerun: 'yes'"><font face="宋体">和&nbsp;</font></span><span style="font-size: 10.5pt; background: rgb(192,192,192); color: rgb(0,0,192); font-family: '&#203;&#206;&#204;&#229;'; mso-spacerun: 'yes'">boost</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><font face="宋体">其中fields是创建了一个arrayList,其主要是保存Field类</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">Boost<font face="宋体">主要是设置该doc的优先级</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><font face="宋体">其方法：add（Fieldable&nbsp;field）增加一个field对象</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">removeField(String&nbsp;name)&nbsp;&nbsp;<font face="宋体">根据name移除一个ield对象（找到一个就返回）</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; margin-left: 21pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">removeFields(String&nbsp;name)&nbsp;&nbsp;<font face="宋体">根据name移除所有的field对象</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; margin-left: 21pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">Field&nbsp;getField(String&nbsp;name)&nbsp;&nbsp;<font face="宋体">根据名字找到该Field对象。</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; margin-left: 21pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">Fieldable&nbsp;getFieldable(String&nbsp;name)&nbsp;&nbsp;<font face="宋体">根据名字找到Fieldable子类（Fieldable是</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><font face="宋体">接口，具体有Filed来实现）</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; margin-left: 21pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">String&nbsp;get(String&nbsp;name)&nbsp;<font face="宋体">根据名字，找到给Filed对象中包含的内容</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; margin-left: 21pt; text-indent: 21pt; text-align: justify"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">public&nbsp;final&nbsp;byte[]&nbsp;getBinaryValue(String&nbsp;name)&nbsp;<font face="宋体">主要查找Doc中包含有二进制field</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><font face="宋体">数据（如果不存在，则返回null）</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;final&nbsp;List&nbsp;getFields()&nbsp;<font face="宋体">直接返回该Doc中包含的Field。<br />
</font></span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p>&nbsp;&nbsp;&nbsp;&nbsp;<br />
</o:p></span></p>
<!--endfragment--><script type="text/javascript"><!--
google_ad_client = "pub-5850191600757552";
/* 728x90, 创建于 08-7-7 */
google_ad_slot = "7437612977";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script><script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<img src ="http://www.blogjava.net/guming123416/aggbug/262909.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/guming123416/" target="_blank">天空苍茫</a> 2009-03-30 16:17 <a href="http://www.blogjava.net/guming123416/archive/2009/03/30/262909.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Lucene（2.4.1）技术研究(2)--分析事例 </title><link>http://www.blogjava.net/guming123416/archive/2009/03/27/262483.html</link><dc:creator>天空苍茫</dc:creator><author>天空苍茫</author><pubDate>Fri, 27 Mar 2009 09:54:00 GMT</pubDate><guid>http://www.blogjava.net/guming123416/archive/2009/03/27/262483.html</guid><wfw:comment>http://www.blogjava.net/guming123416/comments/262483.html</wfw:comment><comments>http://www.blogjava.net/guming123416/archive/2009/03/27/262483.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/guming123416/comments/commentRss/262483.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/guming123416/services/trackbacks/262483.html</trackback:ping><description><![CDATA[<span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">1、</span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><span style="font-family: 宋体">我们去分析一下该段程序。<br />
<br />
</span></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'">a) </span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><span style="font-family: 宋体">首先我们创建一个类IndexWriter,该类是lucene创建索引的核心，其主要功能是将所有的数据源所有内容，经过分词处理，创建成索引格式的文件（同数据库想对比，一个索引文件就相当一张表）<br />
<br />
</span></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'">b) </span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><span style="font-family: 宋体">然后，我们定义了document类。Lucene是将所有的数据源都转换成Document类型的文件，lucene内部只能识别出Document类型的文件。（同数据库相比的话，Document就像一个表的每一条记录。）<br />
<br />
</span></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'">c) </span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><span style="font-family: 宋体">然后我们定义了一些File类，其中File是作为真实的数据存储使用，每一个需要索引的内容都对应一个Filed，（和数据库相比，Field就相当一一条记录的一个属性与其值）。<br />
<br />
</span></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'">d) </span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><span style="font-family: 宋体">然后将Field增加到Document中，其中每个Document可以增加到多个Field对象。然后将所有的Doc交给IndexWriter去创建索引，创建完成后，如图一<br />
</span></span><img alt="" src="http://www.blogjava.net/images/blogjava_net/guming123416/1.gif" border="0" /><br />
<br />
<span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><span style="font-family: 宋体">图一 lucene索引后的文件<br />
</span></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><br />
E) </span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><span style="font-family: 宋体">然后开始查询，首先使用IndexReader来读取所创建目录下的索引文件，然后创建一个IndexSearch对象，该对象主要功能就是从索引中查询。<br />
</span></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><br />
F) </span><span style="font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><span style="font-family: 宋体">然后定义查询策略，本例中采用queryParse来查询，然后循环，将所有查询的结果打印出来。<br />
</span></span><!--endfragment--></span><!--endfragment-->
 <img src ="http://www.blogjava.net/guming123416/aggbug/262483.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/guming123416/" target="_blank">天空苍茫</a> 2009-03-27 17:54 <a href="http://www.blogjava.net/guming123416/archive/2009/03/27/262483.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Lucene（2.4.1）技术研究(1)--lucene技术</title><link>http://www.blogjava.net/guming123416/archive/2009/03/27/262332.html</link><dc:creator>天空苍茫</dc:creator><author>天空苍茫</author><pubDate>Fri, 27 Mar 2009 05:18:00 GMT</pubDate><guid>http://www.blogjava.net/guming123416/archive/2009/03/27/262332.html</guid><wfw:comment>http://www.blogjava.net/guming123416/comments/262332.html</wfw:comment><comments>http://www.blogjava.net/guming123416/archive/2009/03/27/262332.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/guming123416/comments/commentRss/262332.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/guming123416/services/trackbacks/262332.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/guming123416/archive/2009/03/27/262332.html'>阅读全文</a><img src ="http://www.blogjava.net/guming123416/aggbug/262332.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/guming123416/" target="_blank">天空苍茫</a> 2009-03-27 13:18 <a href="http://www.blogjava.net/guming123416/archive/2009/03/27/262332.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring源代码学习（2.0.5）一（BeanFactory）</title><link>http://www.blogjava.net/guming123416/archive/2008/07/06/212916.html</link><dc:creator>天空苍茫</dc:creator><author>天空苍茫</author><pubDate>Sun, 06 Jul 2008 14:04:00 GMT</pubDate><guid>http://www.blogjava.net/guming123416/archive/2008/07/06/212916.html</guid><wfw:comment>http://www.blogjava.net/guming123416/comments/212916.html</wfw:comment><comments>http://www.blogjava.net/guming123416/archive/2008/07/06/212916.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/guming123416/comments/commentRss/212916.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/guming123416/services/trackbacks/212916.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/guming123416/archive/2008/07/06/212916.html'>阅读全文</a><img src ="http://www.blogjava.net/guming123416/aggbug/212916.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/guming123416/" target="_blank">天空苍茫</a> 2008-07-06 22:04 <a href="http://www.blogjava.net/guming123416/archive/2008/07/06/212916.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用DBCP建立的连接池。（直接使用在应用程序用）</title><link>http://www.blogjava.net/guming123416/archive/2007/08/28/140313.html</link><dc:creator>天空苍茫</dc:creator><author>天空苍茫</author><pubDate>Tue, 28 Aug 2007 01:47:00 GMT</pubDate><guid>http://www.blogjava.net/guming123416/archive/2007/08/28/140313.html</guid><wfw:comment>http://www.blogjava.net/guming123416/comments/140313.html</wfw:comment><comments>http://www.blogjava.net/guming123416/archive/2007/08/28/140313.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/guming123416/comments/commentRss/140313.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/guming123416/services/trackbacks/140313.html</trackback:ping><description><![CDATA[<p>由于在JAVA自动获得新闻，没有建立web的环境，将建立的服务器放置在一台服务器上，数据库放在另一台服务器上，结果造成使用JDBC速度缓慢，因此修改成连接池：<br><br>import java.sql.Connection;<br>import java.sql.DriverManager;<br>import java.sql.SQLException;</p>
<p>import org.apache.commons.dbcp.ConnectionFactory;<br>import org.apache.commons.dbcp.DriverManagerConnectionFactory;<br>import org.apache.commons.dbcp.PoolableConnectionFactory;<br>import org.apache.commons.dbcp.PoolingDriver;<br>import org.apache.commons.pool.ObjectPool;<br>import org.apache.commons.pool.impl.GenericObjectPool;<br>import org.apache.log4j.Logger;</p>
<p>/**<br>&nbsp;* @author Administrator<br>&nbsp;*<br>&nbsp;*/<br>public class DBConnectionFactory {<br>&nbsp;/**<br>&nbsp; * Logger for this class<br>&nbsp; */<br>&nbsp;private static final Logger logger = Logger<br>&nbsp;&nbsp;&nbsp;.getLogger(DBConnectionFactory.class);</p>
<p>&nbsp;private static ObjectPool connectionPool=null; <br>&nbsp;private static String sqlJdbc = ""; <br>&nbsp;&nbsp;&nbsp; private static String sqlUser = ""; <br>&nbsp;&nbsp;&nbsp; private static String sqlPwd = ""; <br>&nbsp;&nbsp;&nbsp; @SuppressWarnings("unchecked")<br>&nbsp;private static Class driverClass=null; </p>
<p><br>&nbsp;&nbsp;&nbsp; public static void proDBConnectionFactory(){<br>&nbsp;&nbsp;&nbsp; &nbsp;if(sqlJdbc.equals("")){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;sqlJdbc = "jdbc:jtds:sqlserver://27.0.0.1:1433/finance;tds=8.0;lastupdatecount=true";<br>&nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp;&nbsp; &nbsp;if(sqlUser.equals("")){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;sqlUser = "sa";<br>&nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp;&nbsp; &nbsp;if(sqlPwd.equals("")){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;sqlPwd = "11111";<br>&nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp;&nbsp; &nbsp;initDataSource();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; public synchronized static void initDataSource(){ <br>&nbsp;&nbsp;&nbsp; &nbsp; if(driverClass == null){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;driverClass = Class.forName("net.sourceforge.jtds.jdbc.Driver");<br>&nbsp;&nbsp;&nbsp;} catch (ClassNotFoundException e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;logger.error("在注册驱动名称的时间发生错误："+e.getMessage(),e);<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp; &nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp; if(connectionPool == null){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; setupDriver(sqlJdbc);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; //printDriverStats(); <br>&nbsp;&nbsp;&nbsp; &nbsp; }else{<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; System.out.print("连接池已经存在");<br>&nbsp;&nbsp;&nbsp; &nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp; try { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // printDriverStats(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; public static Connection getConn(){<br>&nbsp;&nbsp;&nbsp; &nbsp; proDBConnectionFactory();<br>&nbsp;&nbsp;&nbsp; &nbsp; Connection conn = null;<br>&nbsp;&nbsp;&nbsp; &nbsp; try { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn = DriverManager.getConnection("jdbc:apache:commons:dbcp:FinanceDBPool"); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch(SQLException e) { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return conn; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; public static void printDriverStats() throws Exception { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PoolingDriver driver = (PoolingDriver) DriverManager.getDriver("jdbc:apache:commons:dbcp:"); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ObjectPool connectionPool = driver.getConnectionPool("FinanceDBPool"); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("活动的连接: " + connectionPool.getNumActive()); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("空闲的连接: " + connectionPool.getNumIdle()); <br>&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; public static void setupDriver(String connectURI){<br>&nbsp;&nbsp;&nbsp; &nbsp; try {<br>&nbsp;&nbsp;&nbsp;connectionPool = new GenericObjectPool(null); <br>&nbsp;&nbsp;&nbsp; ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(connectURI,sqlUser,sqlPwd); <br>&nbsp;&nbsp;&nbsp; @SuppressWarnings("unused")<br>&nbsp;&nbsp;&nbsp;PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory,connectionPool,null,null,false,true); <br>&nbsp;&nbsp;&nbsp; Class.forName("org.apache.commons.dbcp.PoolingDriver"); <br>&nbsp;&nbsp;&nbsp; PoolingDriver driver = (PoolingDriver) DriverManager.getDriver("jdbc:apache:commons:dbcp:");<br>&nbsp;&nbsp;&nbsp; //driver.registerPool("FinanceDBPool",connectionPool);<br>&nbsp;&nbsp;&nbsp; driver.registerPool("FinanceDBPool",connectionPool);</p>
<p>&nbsp;&nbsp;} catch (ClassNotFoundException e) {<br>&nbsp;&nbsp;&nbsp;logger.error("注册连接池的时间发生错误:"+e.getMessage(),e);<br>&nbsp;&nbsp;} catch (SQLException e) {<br>&nbsp;&nbsp;&nbsp;logger.error("注册连接池的时间发生错误:"+e.getMessage(),e);<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;</p>
<img src ="http://www.blogjava.net/guming123416/aggbug/140313.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/guming123416/" target="_blank">天空苍茫</a> 2007-08-28 09:47 <a href="http://www.blogjava.net/guming123416/archive/2007/08/28/140313.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>StringTokenizer类的使用方法 </title><link>http://www.blogjava.net/guming123416/archive/2006/11/29/84316.html</link><dc:creator>天空苍茫</dc:creator><author>天空苍茫</author><pubDate>Wed, 29 Nov 2006 04:28:00 GMT</pubDate><guid>http://www.blogjava.net/guming123416/archive/2006/11/29/84316.html</guid><wfw:comment>http://www.blogjava.net/guming123416/comments/84316.html</wfw:comment><comments>http://www.blogjava.net/guming123416/archive/2006/11/29/84316.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/guming123416/comments/commentRss/84316.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/guming123416/services/trackbacks/84316.html</trackback:ping><description><![CDATA[
		<div class="postText">
				<strong>StringTokenizer：字符串分隔解析类型<br /></strong>
				<span style="COLOR: indigo">属于：java.util包。</span>
				<br />
				<br />
				<span style="COLOR: blue">１、构造函数。</span>
				<br />
				<ul>
						<br />1. <span style="COLOR: green">StringTokenizer(String str)</span> ：构造一个用来解析str的StringTokenizer对象。java默认的分隔符是“空格”、“制表符(‘\t’)”、“换行符(‘\n’)”、“回车符(‘\r’)”。<br />2. <span style="COLOR: green">StringTokenizer(String str, String delim) </span>：构造一个用来解析str的StringTokenizer对象，并提供一个指定的分隔符。<br />3. <span style="COLOR: green">StringTokenizer(String str, String delim, boolean returnDelims) </span>：构造一个用来解析str的StringTokenizer对象，并提供一个指定的分隔符，同时，指定是否返回分隔符。</ul>
				<br />
				<br />
				<span style="COLOR: blue">２、方法。</span>
				<br />
				<span style="COLOR: red">说明：<br />1. 所有方法均为public；<br />2. 书写格式：［修饰符］　&lt;返回类型&gt; &lt;方法名（［参数列表］）&gt;</span>
				<span style="COLOR: olive">
						<br />如：<br />static int parseInt(String s) 表示：此方法（parseInt）为类方法（static），返回类型为（int），方法所需参数为String类型。</span>
				<br />
				<br />
				<ul>1. <span style="COLOR: green">int countTokens() </span>：返回nextToken方法被调用的次数。如果采用构造函数1和2，返回的就是分隔符数量(例2)。<br />2. <span style="COLOR: green">boolean hasMoreTokens() </span>：返回是否还有分隔符。<br />3. <span style="COLOR: green">boolean hasMoreElements() </span>：结果同2。<br />4. <span style="COLOR: green">String nextToken()</span> ：返回从当前位置到下一个分隔符的字符串。<br />5. <span style="COLOR: green">Object nextElement() </span>：结果同4。<br />6. <span style="COLOR: green">String nextToken(String delim)</span> ：与4类似，以指定的分隔符返回结果。</ul>
				<br />
				<br />
				<span style="COLOR: olive">例子：</span>
				<br />
				<pre>		String s = new String("The Java platform is the ideal platform for network computing");<br />		StringTokenizer st = new StringTokenizer(s);<br />		System.out.println( "Token Total: " + st.countTokens() );<br />		while( st.hasMoreElements() ){<br />			System.out.println( st.nextToken() );<br />　　　　　　　　　　　}<br />结果为：<br />Token Total: 10<br />The<br />Java<br />platform<br />is<br />the<br />ideal<br />platform<br />for<br />network<br />computing<br /></pre>
				<br />
				<span style="COLOR: olive">例2:</span>
				<br />
				<pre>		String s = new String("The=Java=platform=is=the=ideal=platform=for=network=computing");<br />		StringTokenizer st = new StringTokenizer(s,"=",true);<br />		System.out.println( "Token Total: " + st.countTokens() );<br />		while( st.hasMoreElements() ){<br />			System.out.println( st.nextToken() );<br />		}<br />结果为：<br />Token Total: 19<br />The<br />=<br />Java<br />=<br />platform<br />=<br />is<br />=<br />the<br />=<br />ideal<br />=<br />platform<br />=<br />for<br />=<br />network<br />=<br />computing<br /></pre>
		</div>
<img src ="http://www.blogjava.net/guming123416/aggbug/84316.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/guming123416/" target="_blank">天空苍茫</a> 2006-11-29 12:28 <a href="http://www.blogjava.net/guming123416/archive/2006/11/29/84316.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库设计说明书- </title><link>http://www.blogjava.net/guming123416/archive/2006/03/16/35622.html</link><dc:creator>天空苍茫</dc:creator><author>天空苍茫</author><pubDate>Thu, 16 Mar 2006 04:58:00 GMT</pubDate><guid>http://www.blogjava.net/guming123416/archive/2006/03/16/35622.html</guid><wfw:comment>http://www.blogjava.net/guming123416/comments/35622.html</wfw:comment><comments>http://www.blogjava.net/guming123416/archive/2006/03/16/35622.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/guming123416/comments/commentRss/35622.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/guming123416/services/trackbacks/35622.html</trackback:ping><description><![CDATA[<P class=content>1　引言 <BR>1．1编写目的<BR>　　说明编写这份数据库设计说明书的目的，指出预期的读者。<BR>1．2背景<BR>　　说明：<BR>　　a．说明待开发的数据库的名称和使用此数据库的软件系统的名称；<BR>　　b．列出该软件系统开发项目的任务提出者、用户以及将安装该软件和这个数据库的计算站（中心）。 <BR>1．3定义 <BR>　　列出本文件中用到的专门术语的定义、外文首字母组词的原词组。<BR>1．4参考资料 <BR>　　列出有关的参考资料： <BR>　　a．本项目的经核准的计划任务书或合同、上级机关批文；<BR>　　b．属于本项目的其他已发表的文件；<BR>　　c．本文件中各处引用到的文件资料，包括所要用到的软件开发标准。 <BR>　　列出这些文件的标题、文件编号、发表日期和出版单位，说明能够取得这些文件的来源。<BR>2　外部设计<BR>2．1标识符和状态<BR>　　联系用途，详细说明用于唯一地标识该数据库的代码、名称或标识符，附加的描述性信息亦要给出。如果该数据库属于尚在实验中、尚在测试中或是暂时使用的，则要说明这一特点及其有效时间范围。<BR>2．2使用它的程序<BR>　　列出将要使用或访问此数据库的所有应用程序，对于这些应用程序的每一个，给出它的名称和版本号。 <BR>2．3约定<BR>　　陈述一个程序员或一个系统分析员为了能使用此数据库而需要了解的建立标号、标识的约定，例如 用于标识数据库的不同版本的约定和用于标识库内各个文卷、、记录、数据项的命名约定等。 <BR>2．4专门指导<BR>　　向准备从事此数据库的生成、从事此数据库的测试、维护人员提供专门的指导，例如将被送入数据 库的数据的格式和标准、送入数据库的操作规程和步骤，用于产生、修改、更新或使用这些数据文卷的操 作指导。 如果这些指导的内容篇幅很长，列出可参阅的文件资料的名称和章条。<BR>2．5支持软件 <BR>　　简单介绍同此数据库直接有关的支持软件，如数据库管理系统、存储定位程序和用于装入、生成、修 改、更新数据库的程序等。说明这些软件的名称、版本号和主要功能特性，如所用数据模型的类型、允许 的数据容量等。列出这些支持软件的技术文件的标题、编号及来源。 <BR>3　结构设计<BR>3．1概念结构设计<BR>　　说明本数据库将反映的现实世界中的实体、属性和它们之间的关系等的原始数据形式，包括各数据项、记录、系、文卷的标识符、定义、类型、度量单位和值域，建立本数据库的每一幅用户视图。 <BR>3．2逻辑结构设计 <BR>　　说明把上述原始数据进行分解、合并后重新组织起来的数据库全局逻辑结构，包括所确定的关键字和属性、重新确定的记录结构和文卷结构、所建立的各个文卷之间的相互关系，形成本数据库的数据库管理员视图。 <BR>3．3物理结构设计<BR>　　建立系统程序员视图，包括：<BR>　　a．数据在内存中的安排，包括对索引区、缓冲区的设计；<BR>　　b．所使用的外存设备及外存空间的组织，包括索引区、数据块的组织与划分；<BR>　　c．访问数据的方式方法。<BR>4　运用设计<BR>4．1数据字典设计 <BR>　　对数据库设计中涉及到的各种项目，如数据项、记录、系、文卷、模式、子模式等一般要建立起数据字典，以说明它们的标识符、同义名及有关信息。在本节中要说明对此数据字典设计的基本考虑。 </P>
<P>4．2安全保密设计 <BR>　　说明在数据库的设计中，将如何通过区分不同的访问者、不同的访问类型和不同的数据对象，进行分别对待而获得的数据库安全保密的设计考虑。</P><img src ="http://www.blogjava.net/guming123416/aggbug/35622.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/guming123416/" target="_blank">天空苍茫</a> 2006-03-16 12:58 <a href="http://www.blogjava.net/guming123416/archive/2006/03/16/35622.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>计算机软件需求说明编制指南</title><link>http://www.blogjava.net/guming123416/archive/2006/03/16/35620.html</link><dc:creator>天空苍茫</dc:creator><author>天空苍茫</author><pubDate>Thu, 16 Mar 2006 04:56:00 GMT</pubDate><guid>http://www.blogjava.net/guming123416/archive/2006/03/16/35620.html</guid><wfw:comment>http://www.blogjava.net/guming123416/comments/35620.html</wfw:comment><comments>http://www.blogjava.net/guming123416/archive/2006/03/16/35620.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/guming123416/comments/commentRss/35620.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/guming123416/services/trackbacks/35620.html</trackback:ping><description><![CDATA[<P>你的工程应该有个好的起点。一个小组要带领客户进入需求启发阶段而且你要写软件需求说明书。这份说明有些大，但客户会很重视，所以说明必须得到赞同。 
<P><BR>　　现在你正在设计其中的一个特性，已经发现了需求的一些问题。你可以用多种不同的方式解释需求15；需求9 的说明正好与需求21相反，你因该相信哪一个？需求24非常含糊，你根本不明白它的意思；你不得不花上一个小时与2位开发人员讨论需求30，只因为你们对其各有各的理解；并且，唯一能够澄清这些问题的客户没有给你们答复。你被迫破解众多需求的含义，并且你能预料到，如果你错了，你要做大量的重复工作。 </P>
<P><BR>　　许多软件需求说明书（SRS）写得非常糟糕。任何产品的质量需要其原始材料的质量保证，糟糕的软件需求说明书不可能产出优秀的软件。不幸的是，几乎没有开发人员受过与需求的抽象、分析、文档、质检有关的教育。而且，没有非常多的好需求可以借鉴学习，部分原因是很少有工程可以找到一个好的借鉴，其他原因是公司不愿意将其产品说明书放在公共区域。</P>
<P><BR>　　这篇文章描述了高质量需求叙述和说明的几个特性（特点）。我们将用这些观点检查一些有缺陷的需求，带着痛楚重新编写。而且我会谈一些如何编写好的需求的提示。你也许想通过这些质量标准评估你的工程需求。对于修订，也许迟了，但你会学到一些有用的东西，并帮助你的小组在下次编写出更好的需求。 </P>
<P><BR>　　不要期望能够编写出一份能体现需求应具备的所有特性的SRS。无论你怎么细化、分析、评论和优化需求，都不可能达到完美。但是，如果你牢记这些特性，你就会编写出更好的需求，生产出更好的产品。</P>
<P>高质量需求叙述的特性</P>
<P>　　我们如何从一些有问题的需求中分辨出好的软件需求？这一节将分别介绍需求叙述应体现的6个特性，下一节将从整体上介绍SRS文档应具备的特性。判断每个需求是否具备应有的特性的一种方式是由持有不同观点的工程资金管理人所作的正规检查。另一种有力的方法是在编写代码前依据需求编写测试例子。测试例子能够明确显现在需求中描述的产品行为（特性），能够显现缺陷、冗余和含糊之处。 </P>
<P><BR>　　正确：每个需求必须精确描述要交付的功能。正确性依据于需求的来源，如真实的客户或高级别的系统需求说明书。一个软件需求与其对应的系统需求说明书相抵触是不正确的（当然，系统需求说明书本身可能不正确）。</P>
<P><BR>　　只有用户的代表能够决定用户需求的正确性，这就是为什么在检查需求时，要包括他们或他们的代理的关键所在。不包括用户的需求检查就会导致开发人员的：“这是没意义的”，“这可能是他们的意思”等众所周知的猜测。 </P>
<P><BR>　　可行性：在已知的能力、有限的系统及其环境中每个需求必须是可实现的。为了避免需求的不可行性，在需求分析阶段应该有一个开发人员参与，在抽象阶段应该有市场人员参与。这个开发人员应能检查在技术上什么能做什么不能做，哪些需要需要额外的付出或者和其他的权衡。</P>
<P><BR>　　必要性：每个需求应载明什么是客户确实需要的，什么要顺应于外部的需求，接口或标准。每个需求源于你认可、具有权说明需求的原始资料，这是考虑必需的另外情形（译注，此句翻译不顺，请参照原文：Another way to think of “necessary” is that each requirement originated from a source you recognize as having the authority to specify requirements）。跟踪每个需求回溯到出处，如用例，系统需求，规章，或来自其他用户的意见。如果你不能标识出处，可能需求只是个镀金的例子，没有真正的必须。</P>
<P><BR>　　优先权：为了表明在一个详细的产品版本中应包含哪些要点，需要为每个需求，特征，或用例分配实现的优先权。客户或其代理都应有强烈的责任建立优先权。如果所有的需求都被视为同等重要，那么由于在开发中，预算削减，计划超时或组员的离开导致新的需求时， 项目经理将不能起到作用。优先权的作用是提供给客户的价值，实现的相关费用，实现相关联的有关技术风险。 </P>
<P><BR>　　我是用3种级别的优先权：高优先权表明需求必须体现在下一个产品版本中，中优先权表明需求是必须的，但是如果需要可以推迟到晚一些的产品版本中，低优先权表明有它很好，但我们必须认识到如果没有充足的时间或资源，它可以被放弃掉。</P>
<P><BR>　　明确：需求叙述的读者应只能从其得到唯一的解释说明，同样，一个需求的多个读者也应达成共识。自然语言极易导致含糊。要避免使用一些对于SRS作者很清楚但对于读者不清楚的主观词汇，如：用户友好性，容易，简单，快速，有效，几个，艺术级，改善的，最大，最小等等。每写一个需要都应简洁，简单，直观的采用用户熟知的语言，不要采用计算机术语。检查需求模糊的有效方式包括需求说明书的正规检查，根据需求写测试，建立用户的假想来说明产品某个特定部分预期的特性。 </P>
<P><BR>　　可证实：看你是否能够做出测试计划或其他验证方式，如检查和实证，来决定在产品中每个需求是否正确的实现。如果需求是不可验证的，决定需求是不是正确的实现就成了判断的事。需求之间不一致，不可行，不明确也能导致不可证实。任何需求如果说产品将要支持什么也是不可证实的。</P>
<P>高质量需求说明的特征</P>
<P>　　一个完整的SRS不仅是包括长长的功能性需求列表，还包括外部接口描述和一些诸如质量属性，期望性能的非功能性需求。下面描述了高质量的SRS的一些特性。</P>
<P><BR>　　完整：不应该遗漏要求和必需的信息。完整性也是一个需求应具备的。发现缺少的信息很难，因为根本不存在。在SRS中将需求以分层目录方式组织，将帮助评审人员理解功能性描述的结构，使他们很容易指出遗失的东西。</P>
<P><BR>　　在需求抽象时，相对于系统功能，你过多的注意用户的业务，将导致在需求的全局观和引进不是真正必需的需求上显得不足。在需求抽象上，应用用例方法会发挥很好的作用。能够从不同角度察看需求的图形分析模型也可以检查出不完整性。 </P>
<P><BR>　　如果你知道已缺少一些信息，使用TBD（to be determined）标准标志可以突出这些缺陷，当你在构建产品的相关部分时，就可以从一个给定的需求集中解决所有的缺陷。</P>
<P><BR>　　一致性：一致性需求就是不要于其他的软件需求或高级别的系统（商业）需求发生冲突。需求中的不一致必须在开发开始前得到解决。只有经过调研才能确定哪些是正确的。修改需求时一定要谨慎，如果只审定修改的部分，没有审定于修改相关的部分，就可能导致不一致性。</P>
<P><BR>　　可修改性：当每个需求的要求修改了或维护其历史更改时，你必须能够审定SRS。也就是说每个需求必须相对于其他需求有其单独的标示和分开的说明，便于清晰的查阅。通过良好的组织可以使需求易于修改，如：将相关的需求分组，建立目录表，索引，以及前后参考（照）。</P>
<P><BR>　　可追踪：你应能将一个软件与其原始材料相对应，如高级系统需求，用例，用户的提议等。也能够将软件需求与设计元素，源代码，用于构造实现和验证需求的测试相对应。可追踪的需求应该具有独立标示，细密和结构化的编写，不应过大，不应是叙述性的文字和公告式的列表。 需求质量的评审</P>
<P>　　这些有关需求质量的特性的描述在理论上都是非常好的，但一个好的需求到底是个什么样子的呢？为了体现得更切合实际，我们做个小练习。下面有几个从实际的工程选出的需求，依据上面的质量标准，评估每个需求，看看有什么问题，然后用更好的方式重写。我将对每个例子都提出自己的分析和改进的建议。也欢迎你提出不同的见解。我所占优的只是我知道每个需求的出处。因为你我都不是真正的客户，我们只能猜测每个需求的意图。</P>
<P>　　例1．“产品应在不少于每60秒的正常周期内提供状态信息”<BR>　　这个需求是不完整的：状态信息是什么，如何显示给用户。这个需求有几处含糊。我们在谈论产品的哪部分？状态信息间隔真的假定为不少于60秒？，甚者每10年显示一条新的状态信息也可以？也许它的意图是消息间隔不应超过60秒，那么1毫秒是不是太短？“每”这个词导致了不确定性。问题的后果，就是需求的不可证实。<BR>弥补缺陷，重写需求的一种方法：</P>
<P><BR>　　1、状态信息<BR>　　1．1后台任务管理器因该以误差上下不超过10秒的60秒间隔，在用户界面的指定位置显示状态信息<BR>　　1．2如果后台进程处理正常，那么应该显示任务已完成的百分数/比<BR>　　1．3任务完成时，应显示相关的信息 <BR>　　　1．4后台任务出错应该显示错误信息<BR>　　为了分别测试和追踪，我将其分成了多个需求。如果将几个需求串接在一节中，在构造和测试时就很容易漏掉一个。</P>
<P>　　例2．“产品应瞬间在显示和隐藏不可打印字符间切换” <BR>　　计算机在瞬间不能做任何事，所以这个需求不切实可行。它的不完整性表现在没有声明触发状态切换的条件。软件要在某些条件下更改自己？或者用户为了模仿更改要做一些动作？而且，在文档中改变显示的范围是多大：选中的文本，整个的文档，或其他的？这也是个模糊的问题。不可打印字符合隐藏字符一样吗？或者是一些属性标志或一些控制字符？问题的后果，就是需求的不可证实。 </P>
<P><BR>　　象这样编写需求也许更好一些：“用户能够在一个由特定触发条件激活处于编辑的文档中在显示和隐藏所有HTML标记间切换”。现在就很清楚，不可打印字符是HTML标记。由于没有定义触发条件，需求对设计没有约束力。只有设计人员选定了触发条件后，你才能编写测试验证触发的正确操作。</P>
<P>　　例3．“HTML分析器可以产生HTML标记错误报告，帮助HTML入门者快速解决错误”。单词“快速”使其模糊，没　　有加进错误报告的定义也是其部完整。我不知道，你怎么验证这个需求。找一个自称为HTML的入门者，看看能不能根据错误报告快速解决错误？</P>
<P><BR>　　试试这个：“HTML分析器可以产生一个错误报告，错误报告包含有在被分析文件中出错的HTML文本和行号以及错误的描述。如果没有错误，就不会产生错误报告”。现在我们知道了，什么会被加到出错报告中，但是出错报告是个什么样子，则留由设计人员决定。我们还指定了一个例外：如果没有发现错误，不产生错误报告。</P>
<P>　　例4．“如果可能，主管号码应通过联机校验，而不是通过主全体主管号码列表校验”。真感到绝望，什么是“如果可能”：如果技术上可行？如果主全体主管号码列表可以联机获得？要避免象“应该”的这类不确切的词。客户是需要这个功能性还是不需要。我曾看过一些需求说明书，采用诸如：应，将，应该/将要等一些词描述优先级的细微差别。但我更喜欢用“应”清楚的说明需求的意图，指明优先级。这是修改后的：系统应校验输入的主管号码而不通过联机的主全体主官号码列表。如果在列表中没有发现主管号码，将会显示一条错误信息，也不接受指令。</P>
<P><BR>　　在理解各个已完成的糟糕需求上，开发人员将会遇到的难题是：开发人员与客户将会在审核需求，未达成共识前发生激烈的争论。详细检查大的需求文档不是一件轻松的事情。我清楚有人做过，而且他们花在检查上的每一分钟都是值得的。相对于开发阶段和用户的抱怨电话，在这个阶段修补缺陷是便宜的，</P>
<P>编写质量需求的方针</P>
<P><BR>　　编写优秀的需求是没有公式化的方法的。这需要大量的经验，要从你在过去的文档中发现的问题学习。请在组织软件需求文档时，严格遵从这些方针。</P>
<P><BR>　　句子和段落要短。采用主动语气。使用正确的语法，拼写，标点。使用术语，要保持一致性，并在术语表或数据字典中定义它们</P>
<P><BR>　　要看需求是否被有效的定义，可以以开发人员的观点看看。在内心将“当你们做完了找我”这句加到文档尾部，看看能不能是你紧张起来。换句话说，你是否需要SRS的编写者的额外解释帮助开发人员很好的理解需求，以便于设计和实现？如果是的话，在继续工作前，需求还需要细化。</P>
<P><BR>　　需求编写者还要努力正确地把握细化程度。要避免包含多个需求的长的叙述段落。有帮助的提示是编写独立的可测试的需求。如果你认为一小部分测试可以验证一个需求的正确，那么它已经正确的细化了。如果你预想到多种不同类的测试，几个需求可能已挤到了一起，需要拆分开。 </P>
<P><BR>　　密切关注多个需求合成了单个需求。一个需求中的连接词“和”/“或”建议几个需求合并。不要在一个需求中使用“和”/“或”。</P>
<P><BR>　　通篇文档细节上要保持一致。我曾看见过多个需求说明书前后不一致。如：“对于红色合法的颜色代码应是R”及“对于绿色合法的颜色代码应是G”就有可以以分散的需求分离开，而“产品应能对来自语音编辑指示做出反应”应作为一个子系统，不应作为单个的功能性需求。</P>
<P><BR>　　避免在SRS中过多的申述需求。在多处包含相同的需求可以使文档更易于阅读，但也会给文档的维护增加困难。文档的多份文本要在同一时间内全部更新，避免不一致性。</P>
<P>　　如果你遵从了这些方针，你能够尽早地经常正式或非正式的审查需求，这些需求对于产品的构造，系统测试以及最后的客户满意，都会成为好的奠基石。并且要记住，没有高质量的需求，软件就象一盒巧克力，你永远不知道你会得到什么。 <BR></P><!-- #EndEditable --><img src ="http://www.blogjava.net/guming123416/aggbug/35620.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/guming123416/" target="_blank">天空苍茫</a> 2006-03-16 12:56 <a href="http://www.blogjava.net/guming123416/archive/2006/03/16/35620.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正则表达式系统教程-----------(转) </title><link>http://www.blogjava.net/guming123416/archive/2006/01/23/29002.html</link><dc:creator>天空苍茫</dc:creator><author>天空苍茫</author><pubDate>Mon, 23 Jan 2006 05:11:00 GMT</pubDate><guid>http://www.blogjava.net/guming123416/archive/2006/01/23/29002.html</guid><wfw:comment>http://www.blogjava.net/guming123416/comments/29002.html</wfw:comment><comments>http://www.blogjava.net/guming123416/archive/2006/01/23/29002.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/guming123416/comments/commentRss/29002.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/guming123416/services/trackbacks/29002.html</trackback:ping><description><![CDATA[近来学习正则表达式，看到这篇文章，很不错。<BR><BR><STRONG>前言<BR><BR></STRONG>　　正则表达式是烦琐的，但是强大的，学会之后的应用会让你除了提高效率外，会给你带来绝对的成就感。只要认真去阅读这些资料，加上应用的时候进行一定的参考，掌握正则表达式不是问题。<BR><BR><STRONG>索引</STRONG><BR><BR><STRONG>1. 引子<BR></STRONG>　　目前，正则表达式已经在很多软件中得到广泛的应用，包括*nix（Linux, Unix等），HP等操作系统，PHP，C#，Java等开发环境，以及很多的应用软件中，都可以看到正则表达式的影子。<BR><BR>　　正则表达式的使用，可以通过简单的办法来实现强大的功能。为了简单有效而又不失强大，造成了正则表达式代码的难度较大，学习起来也不是很容易，所以需要付出一些努力才行，入门之后参照一定的参考，使用起来还是比较简单有效的。<BR><BR>　　例子： ^.+@.+\\..+$ <BR><BR>　　这样的代码曾经多次把我自己给吓退过。可能很多人也是被这样的代码给吓跑的吧。继续阅读本文将让你也可以自由应用这样的代码。<BR><BR>　　注意：这里的第7部分跟前面的内容看起来似乎有些重复，目的是把前面表格里的部分重新描述了一次，目的是让这些内容更容易理解。<BR><STRONG>2. 正则表达式的历史<BR><BR></STRONG>　　正则表达式的“祖先”可以一直上溯至对人类神经系统如何工作的早期研究。Warren McCulloch 和 Walter Pitts 这两位神经生理学家研究出一种数学方式来描述这些神经网络。<BR><BR>　 　1956 年, 一位叫 Stephen Kleene 的数学家在 McCulloch 和 Pitts 早期工作的基础上，发表了一篇标题为“神经网事件的表示法”的论文，引入了正则表达式的概念。正则表达式就是用来描述他称为“正则集的代数”的表达式，因 此采用“正则表达式”这个术语。<BR><BR>　　随后，发现可以将这一工作应用于使用 Ken Thompson 的计算搜索算法的一些早期研究，Ken Thompson 是 Unix 的主要发明人。正则表达式的第一个实用应用程序就是 Unix 中的 qed 编辑器。<BR><BR>　　如他们所说，剩下的就是众所周知的历史了。从那时起直至现在正则表达式都是基于文本的编辑器和搜索工具中的一个重要部分。<BR><STRONG>3. 正则表达式定义<BR><BR></STRONG>　　正则表达式(regular expression)描述了一种字符串匹配的模式，可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。<BR><BR>　　列目录时，　dir *.txt或ls *.txt中的*.txt就不是一个正则表达式,因为这里*与正则式的*的含义是不同的。 <BR><BR>　　正则表达式是由普通字符（例如字符 a 到 z）以及特殊字符（称为元字符）组成的文字模式。正则表达式作为一个模板，将某个字符模式与所搜索的字符串进行匹配。<BR><A name=31></A><BR>　　3.1 普通字符<BR><BR>　　由所有那些未显式指定为元字符的打印和非打印字符组成。这包括所有的大写和小写字母字符，所有数字，所有标点符号以及一些符号。 <BR><A name=32></A><BR>　　3.2 非打印字符<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">匹配由x指明的控制字符。例如， \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则，将 c 视为一个原义的 'c' 字符。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">\f </TD>
<TD style="FONT-SIZE: 12px">匹配一个换页符。等价于 \x0c 和 \cL。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">\n </TD>
<TD style="FONT-SIZE: 12px">匹配一个换行符。等价于 \x0a 和 \cJ。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">\r </TD>
<TD style="FONT-SIZE: 12px">匹配一个回车符。等价于 \x0d 和 \cM。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">\s </TD>
<TD style="FONT-SIZE: 12px">匹配任何空白字符，包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">\S </TD>
<TD style="FONT-SIZE: 12px">匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">\t </TD>
<TD style="FONT-SIZE: 12px">匹配一个制表符。等价于 \x09 和 \cI。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">\v </TD>
<TD style="FONT-SIZE: 12px">匹配一个垂直制表符。等价于 \x0b 和 \cK。</TD></TR></TBODY></TABLE><BR><A name=33></A>　<BR>　　3.3 特殊字符<BR><BR>　　所谓特殊字符，就是一些有特殊含义的字符，如上面说的"*.txt"中的*，简单的说就是表示任何字符串的意思。如果要查找文件名中有＊的文件，则需要对＊进行转义，即在其前加一个\。ls \*.txt。正则表达式有以下特殊字符。<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">匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性，则 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身，请使用 \$。</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">*</TD>
<TD style="FONT-SIZE: 12px">匹配前面的子表达式零次或多次。要匹配 * 字符，请使用 \*。</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">.</TD>
<TD style="FONT-SIZE: 12px">匹配除换行符 \n之外的任何单字符。要匹配 .，请使用 \。</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">?</TD>
<TD style="FONT-SIZE: 12px">匹配前面的子表达式零次或一次，或指明一个非贪婪限定符。要匹配 ? 字符，请使用 \?。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">\</TD>
<TD style="FONT-SIZE: 12px">将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如， 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\\' 匹配 "\"，而 '\(' 则匹配 "("。</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">{</TD>
<TD style="FONT-SIZE: 12px">标记限定符表达式的开始。要匹配 {，请使用 \{。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">|</TD>
<TD style="FONT-SIZE: 12px">指明两项之间的一个选择。要匹配 |，请使用 \|。</TD></TR></TBODY></TABLE><BR><BR>　　构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与操作符将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。 <BR>　<BR><A name=34></A><BR>　　3.4 限定符<BR><BR>　　限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有*或+或?或{n}或{n,}或{n,m}共6种。<BR><BR>　　*、+和?限定符都是贪婪的，因为它们会尽可能多的匹配文字，只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。<BR><BR>　　正则表达式的限定符有：<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">匹配前面的子表达式零次或多次。例如，zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">+ </TD>
<TD style="FONT-SIZE: 12px">匹配前面的子表达式一次或多次。例如，'zo+' 能匹配 "zo" 以及 "zoo"，但不能匹配 "z"。+ 等价于 {1,}。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">? </TD>
<TD style="FONT-SIZE: 12px">匹配前面的子表达式零次或一次。例如，"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">{n} </TD>
<TD style="FONT-SIZE: 12px">n 是一个非负整数。匹配确定的 n 次。例如，'o{2}' 不能匹配 "Bob" 中的 'o'，但是能匹配 "food" 中的两个 o。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">{n,} </TD>
<TD style="FONT-SIZE: 12px">n 是一个非负整数。至少匹配n 次。例如，'o{2,}' 不能匹配 "Bob" 中的 'o'，但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">{n,m} </TD>
<TD style="FONT-SIZE: 12px">m 和 n 均为非负整数，其中n &lt;= m。最少匹配 n 次且最多匹配 m 次。例如，"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。</TD></TR></TBODY></TABLE><BR><A name=35></A><BR>　　<STRONG>3.5 定位符</STRONG><BR><BR>　　用来描述字符串或单词的边界，^和$分别指字符串的开始与结束，\b描述单词的前或后边界，\B表示非单词边界。<SPAN style="COLOR: rgb(255,0,0)">不能对定位符使用限定符。 </SPAN><BR><A name=36></A><BR>　　3.6 选择<BR><BR>　　用圆括号将所有选择项括起来，相邻的选择项之间用|分隔。但用圆括号会有一个副作用，是相关的匹配会被缓存，此时可用?:放在第一个选项前来消除这种副作用。<BR><BR>　　其中?:是非捕获元之一，还有两个非捕获元是?=和?!，这两个还有更多的含义，前者为正向预查，在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串，后者为负向预查，在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。 <BR><A name=37></A><BR>　　3.7 后向引用<BR><BR>　 　对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中，所捕获的每个子匹配都按照在正则表达式模式中从左至右所遇到的内 容存储。存储子匹配的缓冲区编号从 1 开始，连续编号直至最大 99 个子表达式。每个缓冲区都可以使用 '\n' 访问，其中 n 为一个标识特定缓冲区的一位或两位十进制数。<BR><BR>　　可以使用非捕获元字符 '?:', '?=', or '?!' 来忽略对相关匹配的保存。 <BR><STRONG>4. 各种操作符的运算优先级<BR><BR></STRONG>　　相同优先级的从左到右进行运算，不同优先级的运算先高后低。各种操作符的优先级从高到低如下：<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>操作符 </TH>
<TH style="FONT-SIZE: 12px" align=left>描述</TH></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">(), (?:), (?=), [] </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">限定符</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">“或”操作</TD></TR></TBODY></TABLE><STRONG>5. 全部符号解释<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">将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如，'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">^ </TD>
<TD style="FONT-SIZE: 12px">匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性，^ 也匹配 '\n' 或 '\r' 之后的位置。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">$ </TD>
<TD style="FONT-SIZE: 12px">匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性，$ 也匹配 '\n' 或 '\r' 之前的位置。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">* </TD>
<TD style="FONT-SIZE: 12px">匹配前面的子表达式零次或多次。例如，zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">+ </TD>
<TD style="FONT-SIZE: 12px">匹配前面的子表达式一次或多次。例如，'zo+' 能匹配 "zo" 以及 "zoo"，但不能匹配 "z"。+ 等价于 {1,}。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">? </TD>
<TD style="FONT-SIZE: 12px">匹配前面的子表达式零次或一次。例如，"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">{n} </TD>
<TD style="FONT-SIZE: 12px">n 是一个非负整数。匹配确定的 n 次。例如，'o{2}' 不能匹配 "Bob" 中的 'o'，但是能匹配 "food" 中的两个 o。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">{n,} </TD>
<TD style="FONT-SIZE: 12px">n 是一个非负整数。至少匹配n 次。例如，'o{2,}' 不能匹配 "Bob" 中的 'o'，但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">{n,m} </TD>
<TD style="FONT-SIZE: 12px">m 和 n 均为非负整数，其中n &lt;= m。最少匹配 n 次且最多匹配 m 次。例如，"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">? </TD>
<TD style="FONT-SIZE: 12px">当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时，匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串，而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如，对于字符串 "oooo"，'o+?' 将匹配单个 "o"，而 'o+' 将匹配所有 'o'。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">. </TD>
<TD style="FONT-SIZE: 12px">匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符，请使用象 '[.\n]' 的模式。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">(pattern) </TD>
<TD style="FONT-SIZE: 12px">匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到，在VBScript 中使用 SubMatches 集合，在JScript 中则使用 $0…$9 属性。要匹配圆括号字符，请使用 '\(' 或 '\)'。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">(?:pattern) </TD>
<TD style="FONT-SIZE: 12px">匹配 pattern 但不获取匹配结果，也就是说这是一个非获取匹配，不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如， 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">(?=pattern) </TD>
<TD style="FONT-SIZE: 12px">正向预查，在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如，'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ，但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">(?!pattern) </TD>
<TD style="FONT-SIZE: 12px">负向预查，在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows"，但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">x|y </TD>
<TD style="FONT-SIZE: 12px">匹配 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">字符集合。匹配所包含的任意一个字符。例如， '[abc]' 可以匹配 "plain" 中的 'a'。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">[^xyz] </TD>
<TD style="FONT-SIZE: 12px">负值字符集合。匹配未包含的任意字符。例如， '[^abc]' 可以匹配 "plain" 中的'p'。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">[a-z] </TD>
<TD style="FONT-SIZE: 12px">字符范围。匹配指定范围内的任意字符。例如，'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">[^a-z] </TD>
<TD style="FONT-SIZE: 12px">负值字符范围。匹配任何不在指定范围内的任意字符。例如，'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">\b </TD>
<TD style="FONT-SIZE: 12px">匹配一个单词边界，也就是指单词和空格间的位置。例如， 'er\b' 可以匹配"never" 中的 'er'，但不能匹配 "verb" 中的 'er'。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">\B </TD>
<TD style="FONT-SIZE: 12px">匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er'，但不能匹配 "never" 中的 'er'。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">\cx </TD>
<TD style="FONT-SIZE: 12px">匹配由 x 指明的控制字符。例如， \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则，将 c 视为一个原义的 'c' 字符。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">\d </TD>
<TD style="FONT-SIZE: 12px">匹配一个数字字符。等价于 [0-9]。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">\D </TD>
<TD style="FONT-SIZE: 12px">匹配一个非数字字符。等价于 [^0-9]。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">\f </TD>
<TD style="FONT-SIZE: 12px">匹配一个换页符。等价于 \x0c 和 \cL。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">\n </TD>
<TD style="FONT-SIZE: 12px">匹配一个换行符。等价于 \x0a 和 \cJ。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">\r </TD>
<TD style="FONT-SIZE: 12px">匹配一个回车符。等价于 \x0d 和 \cM。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">\s </TD>
<TD style="FONT-SIZE: 12px">匹配任何空白字符，包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">\S </TD>
<TD style="FONT-SIZE: 12px">匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">\t </TD>
<TD style="FONT-SIZE: 12px">匹配一个制表符。等价于 \x09 和 \cI。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">\v </TD>
<TD style="FONT-SIZE: 12px">匹配一个垂直制表符。等价于 \x0b 和 \cK。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">\w </TD>
<TD style="FONT-SIZE: 12px">匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">\W </TD>
<TD style="FONT-SIZE: 12px">匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">\xn </TD>
<TD style="FONT-SIZE: 12px">匹配 n，其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如，'\x41' 匹配 "A"。'\x041' 则等价于 '\x04' &amp; "1"。正则表达式中可以使用 ASCII 编码。.</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">\num </TD>
<TD style="FONT-SIZE: 12px">匹配 num，其中 num 是一个正整数。对所获取的匹配的引用。例如，'(.)\1' 匹配两个连续的相同字符。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">\n </TD>
<TD style="FONT-SIZE: 12px">标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式，则 n 为向后引用。否则，如果 n 为八进制数字 (0-7)，则 n 为一个八进制转义值。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">\nm </TD>
<TD style="FONT-SIZE: 12px">标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式，则 nm 为向后引用。如果 \nm 之前至少有 n 个获取，则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足，若 n 和 m 均为八进制数字 (0-7)，则 \nm 将匹配八进制转义值 nm。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">\nml </TD>
<TD style="FONT-SIZE: 12px">如果 n 为八进制数字 (0-3)，且 m 和 l 均为八进制数字 (0-7)，则匹配八进制转义值 nml。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">\un </TD>
<TD style="FONT-SIZE: 12px">匹配 n，其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如， \u00A9 匹配版权符号 (?)。</TD></TR></TBODY></TABLE><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">一个单词连续出现的位置</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共26个字母再加一个-号。</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">/ter\b/</TD>
<TD style="FONT-SIZE: 12px">可匹配chapter，而不能terminal</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">/\Bapt/</TD>
<TD style="FONT-SIZE: 12px">可匹配chapter，而不能aptitude</TD></TR>
<TR bgColor=#fafafa>
<TD style="FONT-SIZE: 12px">/Windows(?=95 |98 |NT )/</TD>
<TD style="FONT-SIZE: 12px">可匹配Windows95或Windows98或WindowsNT,当找到一个匹配后，从Windows后面开始进行下一次的检索匹配。</TD></TR></TBODY></TABLE><STRONG>7. 正则表达式匹配规则<BR></STRONG><A name=71></A><BR>　　7.1 基本模式匹配<BR><BR>　　一切从最基本的开始。模式，是正规表达式最基本的元素，它们是一组描述字符串特征的字符。模式可以很简单，由普通的字符串组成，也可以非常复杂，往往用特殊的字符表示一个范围内的字符、重复出现，或表示上下文。例如：<BR><BR>　　^once <BR><BR>　 　这个模式包含一个特殊的字符^，表示该模式只匹配那些以once开头的字符串。例如该模式与字符串"once upon a time"匹配，与"There once was a man from NewYork"不匹配。正如如^符号表示开头一样，$符号用来匹配那些以给定模式结尾的字符串。<BR><BR>　　bucket$ <BR><BR>　　这个模式与"Who kept all of this cash in a bucket"匹配，与"buckets"不匹配。字符^和$同时使用时，表示精确匹配（字符串与模式一样）。例如：<BR><BR>　　^bucket$ <BR><BR>　　只匹配字符串"bucket"。如果一个模式不包括^和$，那么它与任何包含该模式的字符串匹配。例如：模式<BR><BR>　　once <BR><BR>　　与字符串<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)是字面的字符，也就是说，他们表示该字母本身，数字也是一样的。其他一些稍微复杂的字符，如标点符号和白字符（空 格、制表符等），要用到转义序列。所有的转义序列都用反斜杠(\)打头。制表符的转义序列是：\t。所以如果我们要检测一个字符串是否以制表符开头，可以 用这个模式：<BR><BR>　　^\t <BR><BR>　　类似的，用\n表示“新行”，\r表示回车。其他的特殊符号，可以用在前面加上反斜杠，如反斜杠本身用\\表示，句号.用\.表示，以此类推。<BR><A name=72></A><BR>　　7.2 字符簇<BR><BR>　　在INTERNET的程序中，正规表达式通常用来验证用户的输入。当用户提交一个FORM以后，要判断输入的电话号码、地址、EMAIL地址、信用卡号码等是否有效，用普通的基于字面的字符是不够的。<BR><BR>　　所以要用一种更自由的描述我们要的模式的办法，它就是字符簇。要建立一个表示所有元音字符的字符簇，就把所有的元音字符放在一个方括号里：<BR><BR>　　[AaEeIiOoUu] <BR><BR>　　这个模式与任何元音字符匹配，但只能表示一个字符。用连字号可以表示一个字符的范围，如：<BR><BR>　　[a-z] //匹配所有的小写字母 <BR>　　[A-Z] //匹配所有的大写字母 <BR>　　[a-zA-Z] //匹配所有的字母 <BR>　　[0-9] //匹配所有的数字 <BR>　　[0-9\.\-] //匹配所有的数字，句号和减号 <BR>　　[ \f\r\t\n] //匹配所有的白字符 <BR><BR>　　同样的，这些也只表示一个字符，这是一个非常重要的。如果要匹配一个由一个小写字母和一位数字组成的字符串，比如"z2"、"t6"或"g7"，但不是"ab2"、"r2d3" 或"b52"的话，用这个模式：<BR><BR>　　^[a-z][0-9]$ <BR><BR>　　尽管[a-z]代表26个字母的范围，但在这里它只能与第一个字符是小写字母的字符串匹配。<BR><BR>　　前面曾经提到^表示字符串的开头，但它还有另外一个含义。当在一组方括号里使用^是，它表示“非”或“排除”的意思，常常用来剔除某个字符。还用前面的例子，我们要求第一个字符不能是数字：<BR><BR>　　^[^0-9][0-9]$ <BR><BR>　　这个模式与"&amp;5"、"g7"及"-2"是匹配的，但与"12"、"66"是不匹配的。下面是几个排除特定字符的例子：<BR><BR>　　[^a-z] //除了小写字母以外的所有字符 <BR>　　[^\\\/\^] //除了(\)(/)(^)之外的所有字符 <BR>　　[^\"\'] //除了双引号(")和单引号(')之外的所有字符 <BR><BR>　　特殊字符"." (点，句号)在正规表达式中用来表示除了“新行”之外的所有字符。所以模式"^.5$"与任何两个字符的、以数字5结尾和以其他非“新行”字符开头的字符串匹配。模式"."可以匹配任何字符串，除了空串和只包括一个“新行”的字符串。<BR><BR>　　PHP的正规表达式有一些内置的通用字符簇，列表如下：<BR><BR>　　字符簇含义 <BR><BR>　　[[:alpha:]] 任何字母 <BR>　　[[:digit:]] 任何数字 <BR>　　[[:alnum:]] 任何字母和数字 <BR>　　[[:space:]] 任何白字符 <BR>　　[[:upper:]] 任何大写字母 <BR>　　[[:lower:]] 任何小写字母 <BR>　　[[:punct:]] 任何标点符号 <BR>　　[[:xdigit:]] 任何16进制的数字，相当于[0-9a-fA-F] <BR><A name=73></A><BR>　　7.3 确定重复出现<BR><BR>　　到现在为止，你已经知道如何去匹配一个字母或数字，但更多的情况下，可能要匹配一个单词或一组数字。一个单词有若干个字母组成，一组数字有若干个单数组成。跟在字符或字符簇后面的花括号({})用来确定前面的内容的重复出现的次数。 <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的字符串 <BR>　　^a{2,} 如：aardvark和aaab，但apple不行 <BR>　　a{2,} 如：baad和aaa，但Nantucket不行 <BR>　　\t{2} 两个制表符 <BR>　　.{2} 所有的两个字符 <BR><BR>　 　这些例子描述了花括号的三种不同的用法。一个数字，{x}的意思是“前面的字符或字符簇只出现x次”；一个数字加逗号，{x,}的意思是“前面的内容出 现x或更多的次数”；两个用逗号分隔的数字，{x,y}表示“前面的内容至少出现x次，但不超过y次”。我们可以把模式扩展到更多的单词或数字：<BR><BR>　　^[a-zA-Z0-9_]{1,}$ //所有包含一个以上的字母、数字或下划线的字符串 <BR>　　^[0-9]{1,}$ //所有的正数 <BR>　　^\-{0,1}[0-9]{1,}$ //所有的整数 <BR>　　^\-{0,1}[0-9]{0,}\.{0,1}[0-9]{0,}$ //所有的小数 <BR><BR>　 　最后一个例子不太好理解，是吗？这么看吧：与所有以一个可选的负号(\-{0,1})开头(^)、跟着0个或更多的数字([0-9]{0,})、和一个 可选的小数点(\.{0,1})再跟上0个或多个数字([0-9]{0,})，并且没有其他任何东西($)。下面你将知道能够使用的更为简单的方法。<BR><BR>　　特殊字符"?"与{0,1}是相等的，它们都代表着：“0个或1个前面的内容”或“前面的内容是可选的”。所以刚才的例子可以简化为：<BR><BR>　　^\-?[0-9]{0,}\.?[0-9]{0,}$ <BR><BR>　　特殊字符"*"与{0,}是相等的，它们都代表着“0个或多个前面的内容”。最后，字符"+"与 {1,}是相等的，表示“1个或多个前面的内容”，所以上面的4个例子可以写成：<BR><BR>　　^[a-zA-Z0-9_]+$ //所有包含一个以上的字母、数字或下划线的字符串 <BR>　　^[0-9]+$ //所有的正数 <BR>　　^\-?[0-9]+$ //所有的整数 <BR>　　^\-?[0-9]*\.?[0-9]*$ //所有的小数 <BR><BR>　　当然这并不能从技术上降低正规表达式的复杂性，但可以使它们更容易阅读。<BR><img src ="http://www.blogjava.net/guming123416/aggbug/29002.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/guming123416/" target="_blank">天空苍茫</a> 2006-01-23 13:11 <a href="http://www.blogjava.net/guming123416/archive/2006/01/23/29002.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>