我正在用Java编写一个跨平台程序,并希望将配置文件粘贴在用户的文档文件夹中(Windows下的“我的文档”,适当的Linux下的“文档”,以及Mac OS下调用的文件夹) ,但我不确定如何向Java询问。
我想远离硬编码的事情(如果我们在Windows上,那么 X ,如果我们在Linux上,那么 Y 或 Z 如果我们使用OS X),因为这会给我的支持负担而不是Oracle开发团队。
我检查了系统属性列表,但它似乎没有包含用户的文档文件夹。
答案 0 :(得分:7)
可悲的是,没有简单的跨平台方式。您必须利用每个OS平台上的本机功能
对于Linux我没有方便的链接,但鉴于Linux中不一定有Documents文件夹的概念,我不知道一个好的解决方案。系统属性user.home
至少应该在Linux中有效。
答案 1 :(得分:2)
部分解决方案:
boolean isMac = System.getProperty(“os.name”)。equals(“Mac OS X”);
或使用http://commons.apache.org/vfs/获取操作系统: http://commons.apache.org/vfs/apidocs/org/apache/commons/vfs2/util/Os.html
//无论Mac OSX的语言是什么,文件夹名称都是相同的。
Mac:System.getProperty(“user.home”)+ File.separator +“Documents”);
/用户/大卫/文件
Win:System.getenv(“APPDATA”));
C:\ Documents and Settings \ david \ Application Data
答案 2 :(得分:1)
以某种方式向用户询问他们想要保存数据的位置,或使用当前目录(简单相对路径)并提供适当的设置说明。 “询问”的一种方法是具有可以通过命令行设置的属性。
不要只是用你的应用程序的东西污染用户的主目录 - 你怎么知道他们如何组织他们的文档树?
我完全厌倦了面向* nix的程序,将他们的小配置文件和数据文件夹放入我的文档文件夹的根目录。
答案 3 :(得分:1)
这通常不可能通用。您将不得不使用平台相关的apstractions。我这样对AppData这样做,例如,在Windows上我检测到AppData / Roaming或AppData / Local,这取决于我需要存储的数据,在其他平台上我在userhome中创建了一个文件夹“.myappname”,并使用它。
对于documents文件夹,您必须阅读注册表。在Windows Vista之前使用user.home propery +“/ Documents”是不合适的,因为在其他语言中它可能是“/ Dokumente”(德语)或其他东西。只是注册表有这个文件夹的真实路径。
在Linux平台上,它取决于桌面环境。你只需要尝试一下。 Gnome和KDE使用不同的地方来存储Documents文件夹,恕我直言。如果您只是在那里使用FVWM,除了user.home属性之外,没有预定义的文档位置,这是一个很好的后备。
答案 4 :(得分:1)
假设这是一个需要安装的应用程序,为什么不要求用户在安装过程中指定位置。使用此信息生成运行脚本,该脚本将设置适当的环境变量。作为一种规范,用户不应该运行java
命令!
当用户使用此运行脚本启动应用程序时,应用程序可以读取环境变量。
或者,使用配置文件创建一个jar文件。使用Classloader的getResourceAsStream读取配置文件。只要配置jar位于类路径下,您就可以访问这些文件。这还具有隐藏配置以防意外修改的附加优点。这也适用于文件夹(如果配置需要由用户修改)。
答案 5 :(得分:-2)
根据用户操作系统硬编码获取路径的方法有什么问题? 可能存在大的差异,OS的工作方式也不同。 只需在启动时找到基于其操作系统的文档文件夹的路径,并继续在任何需要的地方引用该路径。