Directory抽象类比较常用的具体实现子类应该是FSDirectory类和RAMDirectory类。FSDirectory类是与文件系统的目录相关的,而RAMDirectory类是与内存相关的,即是指内存中的一个临时非永久的区域。
FSDirectory类源代码定义如下:
package org.apache.lucene.store;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Hashtable;
import org.apache.lucene.index.IndexFileNameFilter;
import org.apache.lucene.index.IndexWriter;
public class FSDirectory extends Directory {
// DIRECTORIES需要进行同步,用于存放指定键值对<File,FSDirectory>
private static final Hashtable DIRECTORIES = new Hashtable();
private static boolean disableLocks = false;
/**
* 设置锁文件是否可以使用
* They should only be disabled if the index
* is on a read-only medium like a CD-ROM.
*/
public static void setDisableLocks(boolean doDisableLocks) {
FSDirectory.disableLocks = doDisableLocks;
}
// 获取锁文件是否可以使用,返回true表示不可以使用
public static boolean getDisableLocks() {
return FSDirectory.disableLocks;
}
// 锁目录,该属性已经废弃
public static final String LOCK_DIR = System.getProperty("org.apache.lucene.lockDir",
System.getProperty("java.io.tmpdir"));
// 定义一个静态内部类,该类是基于文件系统的
private static Class IMPL;
static {
try {
String name =
System.getProperty("org.apache.lucene.FSDirectory.class",
FSDirectory.class.getName());
IMPL = Class.forName(name);
} catch (ClassNotFoundException e) {
throw new RuntimeException("cannot load FSDirectory class: " + e.toString(), e);
} catch (SecurityException se) {
try {
IMPL = Class.forName(FSDirectory.class.getName());
} catch (ClassNotFoundException e) {
throw new RuntimeException("cannot load default FSDirectory class: " + e.toString(), e);
}
}
}
private static MessageDigest DIGESTER;
static {
try {
DIGESTER = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e.toString(), e);
}
}
/** A buffer optionally used in renameTo method */
private byte[] buffer = null;
// 静态方法,根据指定的路径path,返回该路径的一个FSDirectiry实例
public static FSDirectory getDirectory(String path)
throws IOException {
return getDirectory(new File(path), null);
}
// 静态方法,根据指定的路径path以及锁工厂LockFactory参数,返回该路径的一个FSDirectiry实例
public static FSDirectory getDirectory(String path, LockFactory lockFactory)
throws IOException {
return getDirectory(new File(path), lockFactory);
}
// 静态方法,根据指定的File对象,返回该路径的一个FSDirectiry实例
public static FSDirectory getDirectory(File file)
throws IOException {
return getDirectory(file, null);
}
// 静态方法,根据指定File对象以及锁工厂LockFactory参数,返回该路径的一个FSDirectiry实例
// 该方法是获取FSDirectiry实例的核心方法,其他重载的该方法都是经过转换,调用该方法实现的
public static FSDirectory getDirectory(File file, LockFactory lockFactory)
throws IOException
{
file = new File(file.getCanonicalPath());