首先我們看構造函數中的第一個類Directory 類。根據這個類的英文,我們能得出這個類就是關于目錄操作的。Directory 是一個抽象類。其有4個子類,分別是:DbDirectory, FSDirectory, JEDirectory, RAMDirectory
首先我們看看Directory 的類
public abstract class Directory {
volatile boolean isOpen = true;
/*** 持有一個LockFactory的實例(實現鎖定這個目錄實例)*/
protected LockFactory lockFactory;
/**返回該目錄下的所有文件數組.如果這個目錄下沒有文件存在,或者存在權限問題不能訪問,該方法可能返回Null*/
public abstract String[] list() throws IOException;
/** * 返回指定名稱的文件是不是存在 */
public abstract boolean fileExists(String name)
throws IOException;
/**返回指定名稱的文件最后修改的時間
public abstract long fileModified(String name) throws IOException;
/**設置指定文件名的文件最后的修改時間為當前時間*/
public abstract void touchFile(String name) throws IOException;
/**刪除指定文件。 */
public abstract void deleteFile(String name)throws IOException;
/**返回指定文件的長度。 */
public abstract long fileLength(String name) throws IOException;
/** 在當前目錄下使用給定的名稱創建一個空的文件。并且返回一個流來寫該文件。*/
public abstract IndexOutput createOutput(String name) throws IOException;
/** * Lucene使用該方法確保所有的針對該文件的寫操作都會存儲到Index。并且阻止machine/OS發生故障 破壞該index。*/
public void sync(String name) throws IOException {}
/**獲取已經存在的一個文件的IndexInput流操作該文件。 */
public abstract IndexInput openInput(String name) throws IOException;
/** 返回已經存在的一個文件、并且使用指定大小的緩沖的IndexInput,但是當前目錄也可能忽略該緩沖池的大小,
* 當前主要是考慮CompoundFileReader和FSDirectory對于次參數的需求。*/
public IndexInput openInput(String name, int bufferSize) throws IOException {
return openInput(name);
}
/** 創建一個指定名稱的鎖/
public Lock makeLock(String name) {
return lockFactory.makeLock(name);
}
/**
* 清除指定的鎖定(強行解鎖和刪除)這不僅要求在這個時候當前的鎖一定不在使用。 */
public void clearLock(String name) throws IOException {
if (lockFactory != null) {
lockFactory.clearLock(name);
}
}
/** 結束這個store. */
public abstract void close() throws IOException;
/**設置LockFactory,此目錄實例應使其鎖定執行。每個LockFactory實例只用于一個目錄(即,不要共用一個實例在多個目錄) */
public void setLockFactory(LockFactory lockFactory) {
this.lockFactory = lockFactory;
lockFactory.setLockPrefix(this.getLockID());
}
/** 獲得LockFactory,此目錄例實例使用其鎖定執行。請注意,這可能是無效的目錄執行,提供自己鎖執行*/
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();
if (files == null)
throw new IOException("cannot read directory " + src + ": list() returned null");
byte[] buf = new byte[BufferedIndexOutput.BUFFER_SIZE];
for (int i = 0; i < files.length; i++) {
IndexOutput os = null;
IndexInput is = null;
try {
// create file in dest directory
os = dest.createOutput(files[i]);
// read current file
is = src.openInput(files[i]);
// and copy to dest directory
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);
os.writeBytes(buf, toRead);
readCount += toRead;
}
} finally {
// graceful cleanup
try {
if (os != null)
os.close();
} finally {
if (is != null)
is.close();
}
}
}
if(closeDirSrc)
src.close();
}
從Directory抽象類的定義,我們可以得到如下幾點:
1、管理鎖工廠及其鎖實例;
2、管理Directory目錄實例的基本屬性,主要是通過文件名稱進行管理;
3、管理與操作該目錄相關的一些流對象;
4、管理索引文件的拷貝。