In-memory file system implementation for Java that provides complete java.nio.file API compatibility
—
Jimfs provides optional features for enhanced file system functionality and configurable directory monitoring through watch services.
import com.google.common.jimfs.Feature;
import com.google.common.jimfs.WatchServiceConfiguration;
import com.google.common.jimfs.FileTimeSource;
import java.util.concurrent.TimeUnit;
import java.nio.file.attribute.FileTime;The Feature enum defines optional capabilities that can be enabled or disabled for a file system.
public enum Feature {
LINKS, SYMBOLIC_LINKS, SECURE_DIRECTORY_STREAM, FILE_CHANNEL
}LINKSEnables support for hard links to regular files.
Affected APIs:
Files.createLink(Path, Path)Behavior:
Files.createLink() throws UnsupportedOperationExceptionUsage Example:
Configuration config = Configuration.unix()
.toBuilder()
.setSupportedFeatures(Feature.LINKS)
.build();
FileSystem fs = Jimfs.newFileSystem(config);
Path original = fs.getPath("/data.txt");
Path hardLink = fs.getPath("/link-to-data.txt");
Files.write(original, "content".getBytes());
Files.createLink(hardLink, original); // Creates hard linkSYMBOLIC_LINKSEnables support for symbolic links.
Affected APIs:
Files.createSymbolicLink(Path, Path, FileAttribute...)Files.readSymbolicLink(Path)Behavior:
UnsupportedOperationExceptionUsage Example:
Configuration config = Configuration.unix()
.toBuilder()
.setSupportedFeatures(Feature.SYMBOLIC_LINKS)
.build();
FileSystem fs = Jimfs.newFileSystem(config);
Path target = fs.getPath("/target.txt");
Path symlink = fs.getPath("/link.txt");
Files.write(target, "content".getBytes());
Files.createSymbolicLink(symlink, target);
Path resolved = Files.readSymbolicLink(symlink);SECURE_DIRECTORY_STREAMEnables SecureDirectoryStream support for directory operations.
Affected APIs:
Files.newDirectoryStream(Path)Files.newDirectoryStream(Path, DirectoryStream.Filter)Files.newDirectoryStream(Path, String)Behavior:
DirectoryStream instances also implement SecureDirectoryStreamUsage Example:
Configuration config = Configuration.unix()
.toBuilder()
.setSupportedFeatures(Feature.SECURE_DIRECTORY_STREAM)
.build();
FileSystem fs = Jimfs.newFileSystem(config);
Path dir = fs.getPath("/secure-dir");
Files.createDirectory(dir);
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {
if (stream instanceof SecureDirectoryStream) {
SecureDirectoryStream<Path> secureStream = (SecureDirectoryStream<Path>) stream;
// Use secure operations relative to the open directory
}
}FILE_CHANNELEnables FileChannel and AsynchronousFileChannel support.
Affected APIs:
Files.newByteChannel(Path, OpenOption...)Files.newByteChannel(Path, Set, FileAttribute...)FileChannel.open(Path, OpenOption...)FileChannel.open(Path, Set, FileAttribute...)AsynchronousFileChannel.open(Path, OpenOption...)AsynchronousFileChannel.open(Path, Set, ExecutorService, FileAttribute...)Behavior:
FileChannel instances, and FileChannel.open() worksSeekableByteChannel instances, FileChannel.open() throws UnsupportedOperationExceptionUsage Example:
Configuration config = Configuration.unix()
.toBuilder()
.setSupportedFeatures(Feature.FILE_CHANNEL)
.build();
FileSystem fs = Jimfs.newFileSystem(config);
Path file = fs.getPath("/data.txt");
try (FileChannel channel = FileChannel.open(file, StandardOpenOption.CREATE, StandardOpenOption.WRITE)) {
ByteBuffer buffer = ByteBuffer.wrap("Hello World".getBytes());
channel.write(buffer);
}The WatchServiceConfiguration class configures directory monitoring behavior.
Create a polling-based watch service configuration.
public static WatchServiceConfiguration polling(long interval, TimeUnit timeUnit);Parameters:
interval - Polling interval (must be positive)timeUnit - Time unit for the intervalUsage Example:
// Poll every 2 seconds
WatchServiceConfiguration watchConfig = WatchServiceConfiguration.polling(2, TimeUnit.SECONDS);
Configuration config = Configuration.unix()
.toBuilder()
.setWatchServiceConfiguration(watchConfig)
.build();
FileSystem fs = Jimfs.newFileSystem(config);
try (WatchService watchService = fs.newWatchService()) {
Path dir = fs.getPath("/watched-dir");
Files.createDirectory(dir);
WatchKey key = dir.register(watchService,
StandardWatchEventKinds.ENTRY_CREATE,
StandardWatchEventKinds.ENTRY_DELETE,
StandardWatchEventKinds.ENTRY_MODIFY);
// Watch service will poll every 2 seconds for changes
}The default watch service configuration uses 5-second polling:
// Equivalent to WatchServiceConfiguration.polling(5, TimeUnit.SECONDS)
Configuration config = Configuration.unix(); // Uses default watch configThe FileTimeSource interface allows customization of file timestamp generation.
public interface FileTimeSource {
FileTime now();
}Implement custom time sources for testing or specialized behavior.
Usage Example:
// Custom time source for testing
FileTimeSource fixedTimeSource = new FileTimeSource() {
private final FileTime fixedTime = FileTime.fromMillis(1609459200000L); // 2021-01-01
@Override
public FileTime now() {
return fixedTime;
}
};
Configuration config = Configuration.unix()
.toBuilder()
.setFileTimeSource(fixedTimeSource)
.build();
FileSystem fs = Jimfs.newFileSystem(config);
Path file = fs.getPath("/test.txt");
Files.write(file, "content".getBytes());
// File timestamps will use the fixed time
BasicFileAttributes attrs = Files.readAttributes(file, BasicFileAttributes.class);
System.out.println("Created: " + attrs.creationTime());Full-featured Unix-like:
Configuration config = Configuration.unix()
.toBuilder()
.setSupportedFeatures(
Feature.LINKS,
Feature.SYMBOLIC_LINKS,
Feature.SECURE_DIRECTORY_STREAM,
Feature.FILE_CHANNEL
)
.build();Basic file system:
Configuration config = Configuration.unix()
.toBuilder()
.setSupportedFeatures() // No optional features
.build();Testing-focused:
Configuration config = Configuration.unix()
.toBuilder()
.setSupportedFeatures(Feature.FILE_CHANNEL) // File channels for testing I/O
.setWatchServiceConfiguration(WatchServiceConfiguration.polling(100, TimeUnit.MILLISECONDS)) // Fast polling
.build();FILE_CHANNEL feature enables more complex I/O operationsSECURE_DIRECTORY_STREAM adds additional security checksWatchServiceConfiguration objects are immutable and thread-safeFileTimeSource implementations should be thread-safeInstall with Tessl CLI
npx tessl i tessl/maven-com-google-jimfs--jimfs