亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Lucene-2.2.0 源代碼閱讀學習(12)

系統 2235 0

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

IndexWriter的一個構造器,定義如下所示:

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

已經知道,init方法的復雜性和重要性。對init方法所涉及到的有用的相關類進行系統地學習。

init方法的聲明是這樣的:

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

首先看一下Directory這個類的繼承關系,如圖所示:

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

package org.apache.lucene.store;

import java.io.IOException;

public abstract class Directory {

// 有目錄相關的一個鎖工廠,主要是為向目錄中寫入文件服務,使用工廠模式,寫入文件內容必須獲取鎖
protected LockFactory lockFactory;

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

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

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

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

// 刪除已經存在于該目錄下的指定文件名稱為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;


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


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

/** 讀取該目錄下名稱為name的文件,指定了讀入緩沖區的大小為bufferSize,返回一個輸入流
* 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);
}

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

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

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

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

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

// 拷貝源目錄src下的文件,復制到目的目錄dest下面,拷貝完成后關閉源目錄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不空,就執行復制操作

????? byte[] buf = new byte[BufferedIndexOutput.BUFFER_SIZE];
????? for (int i = 0; i < files.length; i++) {
??????? IndexOutput os = null;
??????? IndexInput is = null;
??????? try {
????????? // 在目的目錄dest下面創建一個新文件,名稱與從源目錄src下獲得的文件名稱相同
????????? os = dest.createOutput(files[i]);
????????? // 打開源目錄下對應的該文件,返回一個索引輸入流
????????? is = src.openInput(files[i]);
?????????
// 復制到目錄目錄下
????????? 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);??? // 以字節流的方式讀取源目錄的文件,將toRead個字節讀入到緩沖區buf中
??????????? os.writeBytes(buf, toRead);??? // 以字節流的方式寫入目的目錄的文件中,將緩沖區buf中toRead個字節寫入到目的目錄對應的文件中
??????????? readCount += toRead;
????????? }
??????? } finally {
????????? // 最后要關閉輸入流
????????? try {
??????????? if (os != null)
????????????? os.close();
????????? } finally {
??????????? if (is != null)
????????????? is.close();???
// 關閉輸入流
????????? }
??????? }
????? }
????? if(closeDirSrc)
??????? src.close();??? // 關閉源目錄
}
}

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

1、管理鎖工廠及其鎖實例;

2、管理Directory目錄實例的基本屬性,主要是通過文件名稱進行管理;

3、管理與操作該目錄相關的一些流對象;

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

然后就要對Directory抽象類的具體實現類進行學習了。

Lucene-2.2.0 源代碼閱讀學習(12)


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 精品一区二区三区在线观看l | 手机看片国产精品 | 精品一区二区三区在线观看视频 | 亚洲国产精品线播放 | 精品久久久久久久久久中文字幕 | 美女被cao的视频免费看 | 49xxx中国妇女内谢视频 | 在线观看中文字幕国产 | 亚洲精品线在线观看 | 丁香婷婷六月 | 大陆一级毛片免费视频观看i | 国产伦精品一区二区三区免费迷 | 狠狠大日本亚洲香蕉亚洲 | 色视频亚洲 | 中文字幕天堂久久精品 | 91在线免费视频 | 青草青青在线观看免费视频 | 自拍第二页 | 国产成人高清精品免费观看 | 九九成人 | 97玖玖| 久久96国产精品 | 国产在线伊人 | 日本亚欧乱色视频在线网站 | 操国产美女 | 九九精品99久久久香蕉 | 素人视频在线观看 | 日韩欧美国产卡通动漫 | 中文字幕一区二区三区在线观看 | 国产免费一区二区三区免费视频 | 久久精品亚洲日本波多野结衣 | 中文字幕精品一区二区三区在线 | 久久久久在线观看 | 国产成人免费视频 | 久久国产视频在线观看 | 日韩欧美一区二区在线观看 | 日韩色视频一区二区三区亚洲 | 国产福利在线观看视频 | 一区二区三区 日韩 | 中文字幕色婷婷在线视频 | 亚洲香蕉毛片久久网站老妇人 |