我有一个Java应用程序,我将其打包到Mac应用程序包(该文件夹结构包含所有应用程序但看起来像是一个可执行文件给用户)。
我的问题: 我正在本地文件夹(“。”)中读取和编写一些配置文件。但是,在Mac上,这似乎是应用程序包所在的文件夹(通常是“Applications”文件夹,我显然不希望这样。
我的问题: 如何在该捆绑包中存储文件?如何以编程方式检索包名称以计算完全限定的文件夹?
我知道我可以尝试使用ClassLoader方式,但我想避免这种情况(出于安全原因)。
或者,如何在本地存储应用程序缓存和配置数据的更好方法是什么?
答案 0 :(得分:1)
Mac OS X Finder将名称以.app
结尾的任何目录视为应用程序;右键单击显示包内容。对于I / O目的,它仍然是一个正常的目录。这个project就是一个例子。有关与应用程序包相关的路径,请参阅此answer。
附录:有没有更好的方法在本地存储应用程序缓存和配置数据?
引用的example使用了java.util.prefs.Preferences
,但javax.jnlp.PersistenceService
是alternative。
答案 1 :(得分:1)
好的,基本答案/解决方案是:不要这样做。
我最初想要这样做的原因是在本地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系统上。
现在我可以完全访问文件系统(即使没有管理员权限),并且可以存储尽可能多的数据。