欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Lucene-2.2.0 源代碼閱讀學(xué)習(xí)(12)

系統(tǒng) 2334 0

接著昨天學(xué)習(xí)的 Lucene-2.2.0 源代碼閱讀學(xué)習(xí)(11) 繼續(xù)學(xué)習(xí)。

IndexWriter的一個(gè)構(gòu)造器,定義如下所示:

public IndexWriter(String path, Analyzer a, boolean create)
?????? throws CorruptIndexException, LockObtainFailedException, IOException {
??? init(FSDirectory.getDirectory(path), a, create, true, null, true);
}

已經(jīng)知道,init方法的復(fù)雜性和重要性。對init方法所涉及到的有用的相關(guān)類進(jìn)行系統(tǒng)地學(xué)習(xí)。

init方法的聲明是這樣的:

private void init(Directory d, Analyzer a, final boolean create, boolean closeDir, IndexDeletionPolicy deletionPolicy, boolean autoCommit)

首先看一下Directory這個(gè)類的繼承關(guān)系,如圖所示:

Directory是一個(gè)抽象類,它是與目錄有關(guān)的一個(gè)類,主要定義了一些與目錄相關(guān)的屬性和行為,源代碼如下所示:

package org.apache.lucene.store;

import java.io.IOException;

public abstract class Directory {

// 有目錄相關(guān)的一個(gè)鎖工廠,主要是為向目錄中寫入文件服務(wù),使用工廠模式,寫入文件內(nèi)容必須獲取鎖
protected LockFactory lockFactory;

//?? 獲取該目錄下的所有文件名稱字符串的一個(gè)數(shù)組
public abstract String[] list()
?????? throws IOException;

// 判斷指定文件名稱為name的文件是否存在
public abstract boolean fileExists(String name)
?????? throws IOException;

// 獲取指定文件名稱為name的文件最后修改的時(shí)間
public abstract long fileModified(String name)
?????? throws IOException;

//?? 設(shè)置指定文件名稱為name的文件的修改時(shí)間為當(dāng)前時(shí)間
public abstract void touchFile(String name)
?????? throws IOException;

// 刪除已經(jīng)存在于該目錄下的指定文件名稱為namde的文件
public abstract void deleteFile(String name)
?????? throws IOException;

// 重新命名文件,將原文件名from修改為to
public abstract void renameFile(String from, String to)
?????? throws IOException;

// 獲取 指定文件名稱為name的文件的長度
public abstract long fileLength(String name)
?????? throws IOException;


// 在該目錄下創(chuàng)建一個(gè)名稱為name的文件,同時(shí)返回一個(gè)索引輸出流,以便向其中寫入內(nèi)容
public abstract IndexOutput createOutput(String name) throws IOException;


// 讀取該目錄下名稱為name的文件,返回一個(gè)輸入流,以便對該文件進(jìn)行相關(guān)操作
public abstract IndexInput openInput(String name)
??? throws IOException;

/** 讀取該目錄下名稱為name的文件,指定了讀入緩沖區(qū)的大小為bufferSize,返回一個(gè)輸入流
* Currently the only Directory implementations that respect this
* parameter are
{@link FSDirectory} and {@link
* org.apache.lucene.index.CompoundFileReader}.
*/

public IndexInput openInput(String name, int bufferSize) throws IOException {
??? return openInput(name);
}

// 獲取一個(gè)鎖對象,其中name指定的鎖文件的名稱,即write.lock文件
public Lock makeLock(String name) {
????? return lockFactory.makeLock(name);
}
// 當(dāng)指定名稱為name的鎖文件不再被使用的時(shí)候,從鎖工廠LockFactory中清除該鎖;注意:是從內(nèi)存中清除,并非從文件系統(tǒng)中刪除。
public void clearLock(String name) throws IOException {
??? if (lockFactory != null) {
????? lockFactory.clearLock(name);
??? }
}

// 關(guān)閉該目錄,不再對該目錄操作了
public abstract void close()
?????? throws IOException;

// 當(dāng)該目錄被管理,要對其進(jìn)行操作之前,必須先創(chuàng)建一個(gè)鎖工廠LockFactory實(shí)例,只有擁有了鎖工廠才可以獲取鎖實(shí)例
public void setLockFactory(LockFactory lockFactory) {
????? this.lockFactory = lockFactory;
????? lockFactory.setLockPrefix(this.getLockID());
}

// 獲取鎖工廠實(shí)例
public LockFactory getLockFactory() {
????? return this.lockFactory;
}

// 過去鎖實(shí)例的唯一表示ID的字符串描述
public String getLockID() {
????? return this.toString();
}

// 拷貝源目錄src下的文件,復(fù)制到目的目錄dest下面,拷貝完成后關(guān)閉源目錄src
public static void copy(Directory src, Directory dest, boolean closeDirSrc) throws IOException {
????? final String[] files = src.list();??? // 獲取源目錄src下的所有文件

????? if (files == null)??? // 如果源目錄src下沒有文件,則拋出異常
??????? throw new IOException("cannot read directory " + src + ": list() returned null");

????? // 如果獲取到的源目錄src目錄下的文件列表files不空,就執(zhí)行復(fù)制操作

????? byte[] buf = new byte[BufferedIndexOutput.BUFFER_SIZE];
????? for (int i = 0; i < files.length; i++) {
??????? IndexOutput os = null;
??????? IndexInput is = null;
??????? try {
????????? // 在目的目錄dest下面創(chuàng)建一個(gè)新文件,名稱與從源目錄src下獲得的文件名稱相同
????????? os = dest.createOutput(files[i]);
????????? // 打開源目錄下對應(yīng)的該文件,返回一個(gè)索引輸入流
????????? is = src.openInput(files[i]);
?????????
// 復(fù)制到目錄目錄下
????????? long len = is.length();
????????? long readCount = 0;
????????? while (readCount < len) {
??????????? int toRead = readCount + BufferedIndexOutput.BUFFER_SIZE > len ? (int)(len - readCount) : BufferedIndexOutput.BUFFER_SIZE;
??????????? is.readBytes(buf, 0, toRead);??? // 以字節(jié)流的方式讀取源目錄的文件,將toRead個(gè)字節(jié)讀入到緩沖區(qū)buf中
??????????? os.writeBytes(buf, toRead);??? // 以字節(jié)流的方式寫入目的目錄的文件中,將緩沖區(qū)buf中toRead個(gè)字節(jié)寫入到目的目錄對應(yīng)的文件中
??????????? readCount += toRead;
????????? }
??????? } finally {
????????? // 最后要關(guān)閉輸入流
????????? try {
??????????? if (os != null)
????????????? os.close();
????????? } finally {
??????????? if (is != null)
????????????? is.close();???
// 關(guān)閉輸入流
????????? }
??????? }
????? }
????? if(closeDirSrc)
??????? src.close();??? // 關(guān)閉源目錄
}
}

從Directory抽象類的定義,我們可以得到如下幾點(diǎn):

1、管理鎖工廠及其鎖實(shí)例;

2、管理Directory目錄實(shí)例的基本屬性,主要是通過文件名稱進(jìn)行管理;

3、管理與操作該目錄相關(guān)的一些流對象;

4、管理索引文件的拷貝。

然后就要對Directory抽象類的具體實(shí)現(xiàn)類進(jìn)行學(xué)習(xí)了。

Lucene-2.2.0 源代碼閱讀學(xué)習(xí)(12)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 精品网站999 | 特黄做愛又硬又大A片视频 小视频在线看 | 欧美性猛交xxxx乱大交蜜桃 | 国产精品国偷自产在线 | 日韩性色| 久久亚洲欧美日韩精品专区 | 免费观看性欧美一级 | 国产高清美女一级毛片 | 久久精品视频99 | 亚洲 日本 欧美 日韩精品 | 国产黄色一级毛片 | 亚洲福利视频一区二区 | 亚洲黄色网址 | 久久香蕉国产线熟妇人妻 | 日本成人在线网站 | 日韩黄色网 | 国产视频一二区 | 夜夜嘿视频免费看 | 精品久久一二三区 | 亚洲欧美综合久久 | 免费视频97碰碰碰在线观看 | 久久精品一区二区 | 亚洲午夜大片 | 夜精品A片观看无码一区二区 | 男女污污无遮挡免费观看 | 天天草天天干天天 | 日韩免费一区 | 亚洲国产精品第一区二区三区 | 亚洲综合区 | 色男人的天堂久久综合 | 免费久久精品国产片香蕉 | 一级黄色淫片 | 性欧美18一19sex性高清播放 | 一区二区三区 日韩 | 污视频在线网站 | 精品欧美| 天天操操操操操操 | 日韩一区不卡 | 午夜院线 | 婷婷色在线 | 蜜桃日韩|