The library provides the location of these directories by leveraging the mechanisms defined by
This library is written in Java, and runs on the JVM (≥ 6).
A version of this library implemented in Rust is provided by directories-rs.
Add the library as a dependency to your project:
<dependency>
<groupId>dev.dirs</groupId>
<artifactId>directories</artifactId>
<version>26</version>
</dependency>
compile 'dev.dirs:directories:26'
"dev.dirs" % "directories" % "26"
The library itself is built against Java 6 to allow for the widest possible usage scenarios. It can be used on any Java version >= 6.
Library run by user Alice:
import dev.dirs.ProjectDirectories;
import dev.dirs.BaseDirectories;
import dev.dirs.UserDirectories;
ProjectDirectories myProjDirs = ProjectDirectories.from("com", "Foo Corp", "Bar App");
myProjDirs.configDir;
// Lin: /home/alice/.config/barapp
// Mac: /Users/Alice/Library/Application Support/com.Foo-Corp.Bar-App
// Win: C:\Users\Alice\AppData\Roaming\Foo Corp\Bar App\config
BaseDirectories baseDirs = BaseDirectories.get();
baseDirs.executableDir;
// Lin: /home/alice/.local/bin
// Mac: null
// Win: null
UserDirectories userDirs = UserDirectories.get();
userDirs.audioDir;
// Lin: /home/alice/Music
// Mac: /Users/Alice/Music
// Win: C:\Users\Alice\Music
BaseDirectories.get()
, UserDirectories.get()
or
ProjectDirectories.from()
. Subsequent changes to the state of the system are not reflected in
instances created prior to such a change.executableDir
is specified to provide the path to a user-writable directory for binaries.null
on macOS and Windows.fontDir
is specified to provide the path to a user-writable directory for fonts.null
Windows.runtimeDir
is specified to provide the path to a directory for non-essential runtime data.
It is required that this directory is created when the user logs in, is only accessible by the
user itself, is deleted when the user logs out, and supports all filesystem features of the
operating system.null
on macOS and Windows.BaseDirectories
The intended use-case for BaseDirectories
is to query the paths of user-invisible standard directories
that have been defined according to the conventions of the operating system the library is running on.
If you want to compute the location of cache, config or data folders for your own application or project, use ProjectDirectories
instead.
Field name | Value on Linux / BSD / Solaris | Value on Windows | Value on macOS |
---|---|---|---|
homeDir |
$HOME |
{FOLDERID_UserProfile} |
$HOME |
cacheDir |
$XDG_CACHE_HOME or $HOME /.cache |
{FOLDERID_LocalApplicationData} |
$HOME /Library/Caches |
configDir |
$XDG_CONFIG_HOME or $HOME /.config |
{FOLDERID_ApplicationData} |
$HOME /Library/Application Support |
dataDir |
$XDG_DATA_HOME or $HOME /.local/share |
{FOLDERID_ApplicationData} |
$HOME /Library/Application Support |
dataLocalDir |
$XDG_DATA_HOME or $HOME /.local/share |
{FOLDERID_LocalApplicationData} |
$HOME /Library/Application Support |
executableDir |
$XDG_BIN_HOME or $XDG_DATA_HOME /../bin or $HOME /.local/bin |
null |
null |
preferenceDir |
$XDG_CONFIG_HOME or $HOME /.config |
{FOLDERID_ApplicationData} |
$HOME /Library/Preferences |
runtimeDir |
$XDG_RUNTIME_DIR or null |
null |
null |
UserDirectories
The intended use-case for UserDirectories
is to query the paths of user-facing standard directories
that have been defined according to the conventions of the operating system the library is running on.
Field name | Value on Linux / BSD | Value on Windows | Value on macOS |
---|---|---|---|
homeDir |
$HOME |
{FOLDERID_UserProfile} |
$HOME |
audioDir |
XDG_MUSIC_DIR |
{FOLDERID_Music} |
$HOME /Music |
desktopDir |
XDG_DESKTOP_DIR |
{FOLDERID_Desktop} |
$HOME /Desktop |
documentDir |
XDG_DOCUMENTS_DIR |
{FOLDERID_Documents} |
$HOME /Documents |
downloadDir |
XDG_DOWNLOAD_DIR |
{FOLDERID_Downloads} |
$HOME /Downloads |
fontDir |
$XDG_DATA_HOME /fonts or $HOME /.local/share/fonts |
null |
$HOME /Library/Fonts |
pictureDir |
XDG_PICTURES_DIR |
{FOLDERID_Pictures} |
$HOME /Pictures |
publicDir |
XDG_PUBLICSHARE_DIR |
{FOLDERID_Public} |
$HOME /Public |
templateDir |
XDG_TEMPLATES_DIR |
{FOLDERID_Templates} |
null |
videoDir |
XDG_VIDEOS_DIR |
{FOLDERID_Videos} |
$HOME /Movies |
ProjectDirectories
The intended use-case for ProjectDirectories
is to compute the location of cache, config or data folders for your own application or project,
which are derived from the standard directories.
Field name | Value on Linux / BSD | Value on Windows | Value on macOS |
---|---|---|---|
cacheDir |
$XDG_CACHE_HOME /<project_path> or $HOME /.cache/<project_path> |
{FOLDERID_LocalApplicationData} /<project_path> /cache |
$HOME /Library/Caches/<project_path> |
configDir |
$XDG_CONFIG_HOME /<project_path> or $HOME /.config/<project_path> |
{FOLDERID_ApplicationData} /<project_path> /config |
$HOME /Library/Application Support/<project_path> |
dataDir |
$XDG_DATA_HOME /<project_path> or $HOME /.local/share/<project_path> |
{FOLDERID_ApplicationData} /<project_path> /data |
$HOME /Library/Application Support/<project_path> |
dataLocalDir |
$XDG_DATA_HOME /<project_path> or $HOME /.local/share/<project_path> |
{FOLDERID_LocalApplicationData} /<project_path> /data |
$HOME /Library/Application Support/<project_path> |
preferenceDir |
$XDG_CONFIG_HOME /<project_path> or $HOME /.config/<project_path> |
{FOLDERID_ApplicationData} /<project_path> /config |
$HOME /Library/Preferences/<project_path> |
runtimeDir |
$XDG_RUNTIME_DIR /<project_path> |
null |
null |
The specific value of <project_path>
is computed by the
ProjectDirectories.from(String qualifier,
String organization,
String application)
method and varies across operating systems. As an example, calling
ProjectDirectories.from("org" /*qualifier*/,
"Baz Corp" /*organization*/,
"Foo Bar-App" /*application*/)
results in the following values:
Value on Linux | Value on Windows | Value on macOS |
---|---|---|
"foobar-app" |
"Baz Corp/Foo Bar-App" |
"org.Baz-Corp.Foo-Bar-App" |
The ProjectDirectories.fromPath
method allows the creation of ProjectDirectories
instances directly from a project path.
This argument is used verbatim and is not adapted to operating system standards.
The use of ProjectDirectories.fromPath
is strongly discouraged, as its results will not follow operating system standards on at least two of three platforms.
The version number of this library consists of a whole number, which is incremented with each release.
dev.dirs:directories
releasenull
if a directory path can't be retrieved on Windows,
instead of throwing an exception. Workaround for #43. Thanks @fthomas!-NoProfile
to powershell.exe Fixes #36. Thanks @alexarchambault!configDir
on macOS has been adjusted:
BaseDirectories#configDir
and ProjectDirectories#configDir
have been changed to use the Application Support
directory,
as suggested by Apple documentation.BaseDirectories#configDir
or ProjectDirectories#configDir
to store files,
it may be necessary to write code that migrates the files to the new location.
(Alternative: change usages of configDir
to preferenceDir
to keep the old (pre-v20) behavior.)configDir
on non-macOS platforms has not been changed.BaseDirectories#preferenceDir
and ProjectDirectories#preferenceDir
have been added:
Preferences
directory on macOS, like configDir
did before version 20.
– preferenceDir
behaves identical to configDir
on non-macOS platforms.soc.github.io
soc.github.io
releasePlease refer to the legacy branch for the documentation and artifact coordinates of the soc.github.io
artifact.
downloadDir
and publicDir
are now supported.BaseDirectories
and UserDirectories
to instance fields.
Instances can be created with BaseDirectories.get()
and UserDirectories.get()
.audioDir
, desktopDir
, documentDir
, pictureDir
and videoDir
.downloadDir
and publicDir
return null
on Windows, as the SpecialFolder
enumeration lacks entries for these values.ProjectDirectories
paths for cacheDir
, configDir
and dataDir
.ProjectDirectories
paths for cacheDir
, configDir
, dataDir
and dataLocalDir
if XDG environment variables are set.UserDirectories
paths for fontDir
if XDG environment variables are set.BaseDirectories
into BaseDirectories
(cache, config, ...) and UserDirectories
(audio,
video, ...).BaseDirectories
and UserDirectories
are now public.UserDirectories
are now null
if no values can be retrieved from xdg-user-dirs
,
instead of falling back on hard-coded values.System.getProperty("user.home")
instead of
System.getenv("HOME")
, improving reliability and portability.BaseDirectories
and ProjectDirectories
:Method | Old value | New Value |
---|---|---|
BaseDirectories.cacheDir |
{SpecialFolder.LocalApplicationData} /cache |
{SpecialFolder.LocalApplicationData} |
ProjectDirectories#dataDir |
{SpecialFolder.ApplicationData} /<project_path> |
{SpecialFolder.ApplicationData} /<project_path> /data |
ProjectDirectories#dataLocalDir |
{SpecialFolder.LocalApplicationData} /<project_path> |
{SpecialFolder.LocalApplicationData} /<project_path> /data |
Old name | New name |
---|---|
dataDir |
dataLocalDir |
dataRoamingDir |
dataDir |
executablesDir |
executableDir |
documentsDir |
documentDir |
downloadsDir |
downloadDir |
fontsDir |
fontDir |
musicDir |
audioDir |
picturesDir |
pictureDir |
templatesDir |
templateDir |
videosDir |
videoDir |
ProjectDirectories
factory methods have been overhauled and replaced with a single from(String qualifier, String organization, String project)
method.
Changes to the selection of local/roaming data directories:
dataDir
selects the roaming data directory on Windows (no change on Linux or macOS).dataLocalDir
selects the local data directory on Windows (no change on Linux or macOS).ProjectDirectories
received a runtimeDir
field.
ProjectDirectories
field names dropped the project
prefix.
Changes to the directory for executables:
executableDir
has been dropped on macOS.executableDir
considers $XDG_BIN_HOME
now, before falling back to $XDG_DATA_HOME/../bin
and $HOME/.local/bin
.