
Unified file-system abstraction with stream-first APIs for discovering, reading, and writing files, recursive extension-filtered discovery, storage access framework support, stack-based traversal, and lightweight platform detection.
A lightweight cross-platform filesystem abstraction library for JVM desktop and Android Storage Access Framework (SAF).
filesystem provides a consistent, object-oriented API for working with files and directories while hiding platform-specific implementations. The same application code can be used across Windows, Linux, macOS, Android, and Termux, with only the filesystem implementation changing.
FileOperation APIname, nameWithoutExtension, extension, length, lastModified, absolutePath)The goal of filesystem is to provide a lightweight and predictable abstraction over multiple filesystem implementations.
Core principles:
FileOperation.| Platform | Support |
|---|---|
| Windows | ✅ |
| Linux | ✅ |
| macOS | ✅ |
| Android (SAF) | ✅ |
| Termux | ✅ |
implementation("io.github.sifisofakude.filesystem:filesystem-jvm:0.4.0")implementation("io.github.sifisofakude.filesystem:filesystem-android:0.4.0")Each platform artifact is self-contained and includes the common filesystem API.
import io.github.sifisofakude.filesystem.*
FileSystems.current = JvmFileSystem()
val file = FileOperation("notes.txt")
if (!file.exists()) {
file.createNewFile()
}
file.writeText("Hello, World!")
println(file.readText())
println(file.name)
println(file.nameWithoutExtension)
println(file.extension)
println(file.length)
println(file.lastModified)
println(file.absolutePath)import io.github.sifisofakude.filesystem.*
FileSystems.current = JvmFileSystem()
val file = FileOperation("src/Main.kt")
println(file.name)
println(file.nameWithoutExtension)
println(file.extension)
println(file.absolutePath)
if (file.exists()) {
println(file.readText())
}
file.copy("backup")
file.copy("backup/MainCopy.kt")
file.move("archive")
file.delete()copy() accepts either a directory or a file path.
val file = FileOperation("notes.txt")
// Copies to backup/notes.txt
file.copy("backup")
// Copies to backup/copy.txt
file.copy("backup/copy.txt")val directory = FileOperation("src")
directory.listFiles().forEach {
println(it.name)
}Create directories recursively:
FileOperation("build/output").mkdirs()resolveFiles() recursively discovers files while preserving their relative paths.
val fs = JvmFileSystem()
val files = fs.resolveFiles(
listOf("src"),
setOf("kt", "java")
)
files.forEach {
println(it.relativePath)
}import io.github.sifisofakude.filesystem.*
val fs = AndroidSafFileSystem(context)
FileSystems.current = fs
fs.changeSelectedDirectory(userSelectedUri)
val root = FileOperation(userSelectedUri.toString())
root.listFiles().forEach {
println(it.name)
}val detector = PlatformDetector()
if (detector.isAndroid()) {
println("Running on Android")
}
if (detector.isDesktop()) {
println("Running on Desktop")
}The library consists of two primary APIs.
The high-level object-oriented API used by applications.
val file = FileOperation("example.txt")
file.exists()
file.readText()
file.writeText("Hello")
file.copy("backup")
file.move("archive")
file.delete()The low-level filesystem abstraction implemented by platform-specific providers.
Available implementations:
JvmFileSystemAndroidSafFileSystemMost applications will only need FileOperation, while library authors can work directly with FileSystemUtil.
filesystem is suitable for:
MIT License
Sifiso Fakude
A lightweight cross-platform filesystem abstraction library for JVM desktop and Android Storage Access Framework (SAF).
filesystem provides a consistent, object-oriented API for working with files and directories while hiding platform-specific implementations. The same application code can be used across Windows, Linux, macOS, Android, and Termux, with only the filesystem implementation changing.
FileOperation APIname, nameWithoutExtension, extension, length, lastModified, absolutePath)The goal of filesystem is to provide a lightweight and predictable abstraction over multiple filesystem implementations.
Core principles:
FileOperation.| Platform | Support |
|---|---|
| Windows | ✅ |
| Linux | ✅ |
| macOS | ✅ |
| Android (SAF) | ✅ |
| Termux | ✅ |
implementation("io.github.sifisofakude.filesystem:filesystem-jvm:0.4.0")implementation("io.github.sifisofakude.filesystem:filesystem-android:0.4.0")Each platform artifact is self-contained and includes the common filesystem API.
import io.github.sifisofakude.filesystem.*
FileSystems.current = JvmFileSystem()
val file = FileOperation("notes.txt")
if (!file.exists()) {
file.createNewFile()
}
file.writeText("Hello, World!")
println(file.readText())
println(file.name)
println(file.nameWithoutExtension)
println(file.extension)
println(file.length)
println(file.lastModified)
println(file.absolutePath)import io.github.sifisofakude.filesystem.*
FileSystems.current = JvmFileSystem()
val file = FileOperation("src/Main.kt")
println(file.name)
println(file.nameWithoutExtension)
println(file.extension)
println(file.absolutePath)
if (file.exists()) {
println(file.readText())
}
file.copy("backup")
file.copy("backup/MainCopy.kt")
file.move("archive")
file.delete()copy() accepts either a directory or a file path.
val file = FileOperation("notes.txt")
// Copies to backup/notes.txt
file.copy("backup")
// Copies to backup/copy.txt
file.copy("backup/copy.txt")val directory = FileOperation("src")
directory.listFiles().forEach {
println(it.name)
}Create directories recursively:
FileOperation("build/output").mkdirs()resolveFiles() recursively discovers files while preserving their relative paths.
val fs = JvmFileSystem()
val files = fs.resolveFiles(
listOf("src"),
setOf("kt", "java")
)
files.forEach {
println(it.relativePath)
}import io.github.sifisofakude.filesystem.*
val fs = AndroidSafFileSystem(context)
FileSystems.current = fs
fs.changeSelectedDirectory(userSelectedUri)
val root = FileOperation(userSelectedUri.toString())
root.listFiles().forEach {
println(it.name)
}val detector = PlatformDetector()
if (detector.isAndroid()) {
println("Running on Android")
}
if (detector.isDesktop()) {
println("Running on Desktop")
}The library consists of two primary APIs.
The high-level object-oriented API used by applications.
val file = FileOperation("example.txt")
file.exists()
file.readText()
file.writeText("Hello")
file.copy("backup")
file.move("archive")
file.delete()The low-level filesystem abstraction implemented by platform-specific providers.
Available implementations:
JvmFileSystemAndroidSafFileSystemMost applications will only need FileOperation, while library authors can work directly with FileSystemUtil.
filesystem is suitable for:
MIT License
Sifiso Fakude