Directory抽象类及其子类的总结

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());

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzjsjs.html