Class FSDirectory
- All Implemented Interfaces:
Closeable,AutoCloseable
- Direct Known Subclasses:
MMapDirectory,NIOFSDirectory,SimpleFSDirectory
-
SimpleFSDirectoryis a straightforward implementation using java.io.RandomAccessFile. However, it has poor concurrent performance (multiple threads will bottleneck) as it synchronizes when multiple threads read from the same file. -
NIOFSDirectoryuses java.nio's FileChannel's positional io when reading to avoid synchronization when reading from the same file. Unfortunately, due to a Windows-only Sun JRE bug this is a poor choice for Windows, but on all other platforms this is the preferred choice. Applications usingThread.interrupt()orFuture.cancel(boolean)should useSimpleFSDirectoryinstead. SeeNIOFSDirectoryjava doc for details. -
MMapDirectoryuses memory-mapped IO when reading. This is a good choice if you have plenty of virtual memory relative to your index size, eg if you are running on a 64 bit JRE, or you are running on a 32 bit JRE but your index sizes are small enough to fit into the virtual memory space. Java has currently the limitation of not being able to unmap files from user code. The files are unmapped, when GC releases the byte buffers. Due to this bug in Sun's JRE, MMapDirectory'sIndexInput.close()is unable to close the underlying OS file handle. Only when GC finally collects the underlying objects, which could be quite some time later, will the file handle be closed. This will consume additional transient disk usage: on Windows, attempts to delete or overwrite the files will result in an exception; on other platforms, which typically have a "delete on last close" semantics, while such operations will succeed, the bytes are still consuming space on disk. For many applications this limitation is not a problem (e.g. if you have plenty of disk space, and you don't rely on overwriting files on Windows) but it's still an important limitation to be aware of. This class supplies a (possibly dangerous) workaround mentioned in the bug report, which may fail on non-Sun JVMs. Applications usingThread.interrupt()orFuture.cancel(boolean)should useSimpleFSDirectoryinstead. SeeMMapDirectoryjava doc for details.
open(java.io.File) method, to allow Lucene to choose
the best FSDirectory implementation given your
environment, and the known limitations of each
implementation. For users who have no reason to prefer a
specific implementation, it's best to simply use open(java.io.File). For all others, you should instantiate the
desired implementation directly.
The locking implementation is by default NativeFSLockFactory, but can be changed by
passing in a custom LockFactory instance.
- See Also:
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionprotected static classBase class for reading input from a RandomAccessFileprotected static classWrites output withRandomAccessFile.write(byte[], int, int)Nested classes/interfaces inherited from class org.apache.lucene.store.Directory
Directory.IndexInputSlicer -
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final intDeprecated.This constant is no longer used since Lucene 4.5.protected final FileFields inherited from class org.apache.lucene.store.BaseDirectory
isOpen, lockFactory -
Constructor Summary
ConstructorsModifierConstructorDescriptionprotectedFSDirectory(File path, LockFactory lockFactory) Create a new FSDirectory for the named location (ctor for subclasses). -
Method Summary
Modifier and TypeMethodDescriptionvoidclose()Closes the store to future operations.createOutput(String name, IOContext context) Creates an IndexOutput for the file with the given name.voiddeleteFile(String name) Removes an existing file in the directory.protected voidensureCanWrite(String name) booleanfileExists(String name) Returns true iff a file with the given name exists.longfileLength(String name) Returns the length in bytes of a file in the directory.protected voidReturn a string identifier that uniquely differentiates this Directory instance from other Directory instances.final intDeprecated.This is no longer used since Lucene 4.5.String[]listAll()Lists all files (not subdirectories) in the directory.static String[]Lists all files (not subdirectories) in the directory.protected voidstatic FSDirectoryCreates an FSDirectory instance, trying to pick the best implementation given the current environment.static FSDirectoryopen(File path, LockFactory lockFactory) Just likeopen(File), but allows you to also specify a customLockFactory.voidsetLockFactory(LockFactory lockFactory) Set the LockFactory that this Directory instance should use for its locking implementation.final voidsetReadChunkSize(int chunkSize) Deprecated.This is no longer used since Lucene 4.5.voidsync(Collection<String> names) Ensure that any writes to these files are moved to stable storage.toString()For debug output.Methods inherited from class org.apache.lucene.store.BaseDirectory
clearLock, ensureOpen, getLockFactory, makeLockMethods inherited from class org.apache.lucene.store.Directory
copy, createSlicer, openInput
-
Field Details
-
DEFAULT_READ_CHUNK_SIZE
Deprecated.This constant is no longer used since Lucene 4.5.Default read chunk size: 8192 bytes (this is the size up to which the JDK does not allocate additional arrays while reading/writing)- See Also:
-
directory
-
staleFiles
-
-
Constructor Details
-
FSDirectory
Create a new FSDirectory for the named location (ctor for subclasses).- Parameters:
path- the path of the directorylockFactory- the lock factory to use, or null for the default (NativeFSLockFactory);- Throws:
IOException- if there is a low-level I/O error
-
-
Method Details
-
open
Creates an FSDirectory instance, trying to pick the best implementation given the current environment. The directory returned uses theNativeFSLockFactory.Currently this returns
MMapDirectoryfor most Solaris and Windows 64-bit JREs,NIOFSDirectoryfor other non-Windows JREs, andSimpleFSDirectoryfor other JREs on Windows. It is highly recommended that you consult the implementation's documentation for your platform before using this method.NOTE: this method may suddenly change which implementation is returned from release to release, in the event that higher performance defaults become possible; if the precise implementation is important to your application, please instantiate it directly, instead. For optimal performance you should consider using
MMapDirectoryon 64 bit JVMs.See above
- Throws:
IOException
-
open
Just likeopen(File), but allows you to also specify a customLockFactory.- Throws:
IOException
-
setLockFactory
Description copied from class:DirectorySet the LockFactory that this Directory instance should use for its locking implementation. Each * instance of LockFactory should only be used for one directory (ie, do not share a single instance across multiple Directories).- Overrides:
setLockFactoryin classBaseDirectory- Parameters:
lockFactory- instance ofLockFactory.- Throws:
IOException
-
listAll
Lists all files (not subdirectories) in the directory. This method never returns null (throwsIOExceptioninstead).- Throws:
NoSuchDirectoryException- if the directory does not exist, or does exist but is not a directory.IOException- if list() returns null
-
listAll
Lists all files (not subdirectories) in the directory.- Specified by:
listAllin classDirectory- Throws:
NoSuchDirectoryException- if the directory is not prepared for any write operations (such asDirectory.createOutput(String, IOContext)).IOException- in case of other IO errors- See Also:
-
fileExists
Returns true iff a file with the given name exists.- Specified by:
fileExistsin classDirectory
-
fileLength
Returns the length in bytes of a file in the directory.- Specified by:
fileLengthin classDirectory- Parameters:
name- the name of the file for which to return the length.- Throws:
IOException- if there was an IO error while retrieving the file's length.
-
deleteFile
Removes an existing file in the directory.- Specified by:
deleteFilein classDirectory- Throws:
IOException
-
createOutput
Creates an IndexOutput for the file with the given name.- Specified by:
createOutputin classDirectory- Throws:
IOException
-
ensureCanWrite
- Throws:
IOException
-
onIndexOutputClosed
-
sync
Description copied from class:DirectoryEnsure that any writes to these files are moved to stable storage. Lucene uses this to properly commit changes to the index, to prevent a machine/OS crash from corrupting the index.
NOTE: Clients may call this method for same files over and over again, so some impls might optimize for that. For other impls the operation can be a noop, for various reasons.- Specified by:
syncin classDirectory- Throws:
IOException
-
getLockID
Description copied from class:DirectoryReturn a string identifier that uniquely differentiates this Directory instance from other Directory instances. This ID should be the same if two Directory instances (even in different JVMs and/or on different machines) are considered "the same index". This is how locking "scopes" to the right index. -
close
public void close()Closes the store to future operations. -
getDirectory
- Returns:
- the underlying filesystem directory
-
toString
For debug output. -
setReadChunkSize
Deprecated.This is no longer used since Lucene 4.5.This setting has no effect anymore. -
getReadChunkSize
Deprecated.This is no longer used since Lucene 4.5.This setting has no effect anymore. -
fsync
- Throws:
IOException
-