【问题标题】:Java on MacOSX: how to access files in the bundleMacOSX 上的 Java:如何访问包中的文件
【发布时间】:2012-05-19 00:25:07
【问题描述】:

我有一个 Java 应用程序,我将它打包到一个 Mac 应用程序包(该文件夹结构包含所有应用程序,但对用户来说看起来像是一个可执行文件)。

我的问题: 我正在本地文件夹(“。”)中读取和写入一些配置文件。但是,在 Mac 上,这似乎是应用程序包所在的文件夹(因此通常是“应用程序”文件夹,我显然不希望这样。

我的问题: 如何在该捆绑包中存储文件?如何以编程方式检索包名称以计算完全限定文件夹?

我知道我可以尝试使用 ClassLoader 方式,但我想避免这种情况(出于安全原因)。

或者有没有更好的方法来在本地存储应用缓存和配置数据?

【问题讨论】:

  • 请阅读链接。如果你没有得到一个好的答案,那么你应该自己回答。即使没有完全回答您的问题,您也应该奖励出色的工作。
  • 如果它解决了问题(或者是一个很好的解决方法),我接受一个答案。好的工作是通过投票来奖励的。如果没有一个答案可以帮助我解决问题,那么没有一个答案被接受。如果我自己没有回答,那是因为我还没有解决问题。

标签: java macos file configuration


【解决方案1】:

Mac OS X Finder 将 any 名称以.app 结尾的目录视为应用程序;右键单击以显示包内容。它仍然是用于 I/O 目的的正常目录。这个project 就是一个例子。有关相对于应用程序包的路径,请参阅此 answer

附录:有没有更好的方法在本地存储应用缓存和配置数据?

引用的example 使用java.util.prefs.Preferences,但javax.jnlp.PersistenceServicealternative

【讨论】:

  • 对不起,这是一个很好的答案,只是不适合我的问题。问题是如何获取文件夹的名称(即.app文件夹的名称是什么?)使用首选项不适合缓存数据(只能处理小数据量)
  • 在 Mac OS X 上,java.util.Preferences 是通过~/Library/Preferences 中的 XML 文件实现的;我最大的是大约一兆字节。我不介意~/.appname 文件夹; ~/.netbeans 就是一个例子。 @You 的建议是推荐的替代方案。
【解决方案2】:

好的,基本答案/解决方案是:不要这样做。

我最初想要这样做的原因是在本地 HD 上缓存大量数据。 Java 首选项是配置数据(即小数据量)的不错选择,但无法处理兆字节大小范围内的数据。

我的解决方案:

在 MacOSX (System.getProperty("os.name").contains("Mac OS X")) 上,我只需在用户的主文件夹 (System.getProperty("user.home")) 中创建一个文件夹。我在该文件夹前面加上 . 以确保它对用户隐藏。这也确保了我对该文件夹具有写入权限(这可能是 .app 文件夹中的问题,具体取决于用户复制它的位置)

在 Windows (System.getProperty("os.name").contains("Windows")) 上,我在 System.getenv("APPDATA") 目录中创建该文件夹(请注意,此 env 变量仅存在于 Windows 系统上。

现在我可以完全访问文件系统(即使没有管理员权限),并且可以存储任意数量的数据。

【讨论】:

  • 实际上,缓存数据应该在 (~)/Library/Caches/<Appname> 或(如果更永久,如大型数据库等)(~)/Library/Application Support/<appname> 中。我知道我不希望在我的主目录中有大缓存的点文件,而且我可能并不孤单。
  • 好点,我想我会改用这个(假设我不需要root权限来写那里)。谢谢!
猜你喜欢
  • 2012-10-31
  • 1970-01-01
  • 2011-09-22
  • 1970-01-01
  • 2016-10-29
  • 1970-01-01
  • 2013-02-04
  • 1970-01-01
  • 2014-06-23
相关资源
最近更新 更多