private String workingDirectory;
//here, we assign the name of the OS, according to Java, to a variable...
private String OS = (System.getProperty("os.name")).toUpperCase();
//to determine what the workingDirectory is.
//if it is some version of Windows
if (OS.contains("WIN"))
{
//it is simply the location of the "AppData" folder
workingDirectory = System.getenv("AppData");
}
//Otherwise, we assume Linux or Mac
else
{
//in either case, we would start in the user's home directory
workingDirectory = System.getProperty("user.home");
//if we are on a Mac, we are not done, we look for "Application Support"
workingDirectory += "/Library/Application Support";
}
//we are now free to set the workingDirectory to the subdirectory that is our
//folder.
**Linux:**As previously mentioned there exists something like freedesktop.org which is defining a standard the linux distributions are trying to fulfill. There is also a subpage defining environment variables and their default values (If they are not set they are empty by default. The application has to match the variable to the default). Link to that page: freedesktop.org env vars
7条答案
按热度按时间sxpgvts31#
你可以这样说(如果我错了,或者这是一个糟糕的方法,就反驳我)
注意,在这段代码中,我充分利用了Java在处理目录时将
'/'
与'\\'
视为相同的特性,Windows使用'\\'
作为pathSeparator,但它也很喜欢使用'/'
(至少Windows 7是这样的)。我们可以同样容易地说workingDirectory = System.getenv("APPDATA");
,它也会同样有效。n3ipq98p2#
我个人认为
appdirs
对于类似的用例非常有用,它提供了定位不同类型的有用目录的函数:getUserDataDir
getUserConfigDir
getUserCacheDir
getUserLogDir
getSiteConfigDir
它返回的位置或多或少是标准的:
dsekswqp3#
这个问题很老了,但是我缺少一个列出环境变量的答案,而不是一些有趣的绝对路径。我对OSX一无所知。这个帖子只包含Windows和Linux的信息。
我没有足够的分数来扩展一个已经存在的答案,所以我必须写一个新的。
**Linux:**As previously mentioned there exists something like freedesktop.org which is defining a standard the linux distributions are trying to fulfill. There is also a subpage defining environment variables and their default values (If they are not set they are empty by default. The application has to match the variable to the default). Link to that page: freedesktop.org env vars
xytpbqjk4#
对于中等数量的数据,考虑
java.util.prefs.Preferences
,提到here,或者javax.jnlp.PersistenceService
,讨论here。pokxtpni5#
没有跨平台的方法,因为不同的操作系统使用的概念太不同了,无法“抽象”。我不熟悉 *nix和Mac的约定,但在Windows上没有“主文件夹”,应用程序必须指定是否要将内容存储在 * 漫游配置文件 *(默认为
C:\Users\<username>\AppData\Roaming\<application vendor>\<application name>\
)或 * 本地配置文件 *(默认为C:\Users\<username>\AppData\Local\<application vendor>\<application name>\
)中。请注意,您不能硬编码这些路径,因为在网络安装中,它们可能位于其他位置。您也不应该依赖环境变量,因为用户可以修改它们。您的应用程序应该调用Windows API的SHGetKnownFolderPath函数。
两者之间的区别在于,本地配置文件是特定于用户和计算机的,而漫游配置文件是特定于用户的,所以在像我的大学这样的设置中,放在漫游配置文件中的东西应用程序会上传到服务器,并同步到我登录的任何一台计算机。
应用程序应该负责选择它们想要存储的设置是本地的还是漫游的。不幸的是,Java不允许应用程序决定这一点。相反,有一个全局用户可配置的设置来决定你将获得哪个文件夹。
t3psigkw6#
这是对其他StackOverflow答案以及appdata项目的一些想法的总结,没有引入对JNA的依赖。存在对Apache Commons Lang3的依赖,可以通过使用
System.getProperty( "os.name" )
的返回值来消除,如其他地方所示。代码
请注意,我没有在除Linux以外的任何平台上测试过:
测试
用于显示用法的单元测试:
sgtfey8w7#
你可以用这个
或者这个:
我更喜欢第一种选择
问候