OSX/MacOS 相当于 Windows %PROGRAMDATA% 环境变量

OSX/MacOS equivalent of Windows %PROGRAMDATA% environment variable

我希望我的应用程序将一些数据(例如配置、缓存、许可证等)写出到一个共享的、所有用户都可以访问的位置。

在 Windows 我已经对 %PROGRAMDATA% 做了这个。

在 MacOS 上,我的研究建议使用 Library/Application Support 目录。

虽然用户特定 ~/Library/Application Support 有效,但非用户特定 /Library/Application Support 似乎不可写?

示例:

Files.writeString(Paths.get("/Library/Application Support/myfile.txt"), "hello world")

抛出异常:

java.nio.file.AccessDeniedException: /Library/Application Support/myfile.txt

这种数据有更好的目的地吗?

您收到该错误是因为您试图将文件写入 root 拥有的目录。您可以更改该目录的文件权限,以便执行您的程序的用户具有对该文件或其包含目录的写入权限。

我的部分要求是存储配置数据。

Java 首选项 API - https://www.vogella.com/tutorials/JavaPreferences/article.html - 对我来说是一种更明智的实现方式,因为 JRE 抽象了首选项在文件系统中的存储方式。

但不适用于缓存数据(特别是 - 几乎永久而非临时的缓存文件)。

实际上并没有与此等效的 macOS。可能存储此类内容的最佳位置是 /Users/Shared(请参阅 this thread on the Apple developer forum),但它也不完全理想。

需要注意的一件事是权限:/Users/Shared 设置了 "sticky" 位,这意味着用户无法删除(或重命名)他们不拥有的文件。您可能希望为您的应用程序文件创建一个子目录,以便您可以通过它控制对文件的访问。您还必须注意文件权限,因为默认情况下所有者(创建文件或文件夹的用户)具有完全访问权限,而其他所有人都是只读的。您可能想做一些事情,比如将组设置为 "staff" 并授予组和所有者写入权限。

另一个结果是:计算机上的每个人(以及几乎所有东西)都可以写入它,并且可以随心所欲地制造混乱。访问权限 仅限于您的应用程序(尽管沙盒应用程序通常没有访问权限)。在开发线程中查看 Quinn“The Eskimo!”的警告。