跨平台的方式来请求用户文档文件夹?

11

我正在用Java编写跨平台程序,并希望将配置文件放在用户文档文件夹中(在Windows下为"My Documents",在适当的Linux下为"Documents",在Mac OS下则为叫做什么名字的文件夹),但我不确定如何向Java请求这个文件夹。

我想避免硬编码(如果我们在Windows上,就执行X;如果我们在Linux上,就执行Y;如果我们在OS X上,就执行Z),因为这会使支持的负担落在我的肩膀上,而不是Oracle开发团队上。

我已经检查了系统属性列表,但似乎没有包括用户的文档文件夹。

6个回答

8
很遗憾,没有简单的跨平台方法。您需要利用每个操作系统平台上的本地功能。
以下是如何在 OS X 中执行此操作的一些信息。
以下是如何在 Windows 中执行此操作的一些信息。
对于Linux,我没有一个方便的链接,但考虑到Linux中可能没有“文档”文件夹的概念,我不知道是否有一个很好的解决方案。在Linux中,系统属性"user.home"应该至少是有效的。

你认为我能否在每个操作系统中只用几行简短的代码就完成任务?阅读了一些答案,至少对于你提供的Windows链接来说,让我觉得即使是看似简单的任务也需要使用大量的代码。 - Raceimaztion
其中一个链接我认为有一个指向谷歌代码库的链接,可以为您完成这项工作(适用于Windows)。因此,至少您个人不必编写太多代码来调用它。我不确定您认为什么是大量的代码,但至少这是一种只需执行一次即可在您今后所有项目中使用的东西,因此具有很大的价值。 - Justin Waugh
“似乎应该相当容易…” 这看起来并不像是一件容易的事情…考虑到每个操作系统的每个版本都可以将用户的“文档”目录放在任何位置。更不用说,并非每个操作系统都有一个文档目录。咳咳…用户甚至不需要在每个操作系统上拥有家目录,对吧? - jahroy

2

1

询问用户在哪里保存数据,或使用当前目录(简单相对路径),并提供适当的设置说明。一种“询问”的方法是通过命令行设置属性。

不要在用户主目录中随意创建应用程序相关文件夹 - 您怎么知道他们喜欢如何组织文档树呢?

我非常厌烦*nix导向的程序会把它们的配置文件和数据文件夹丢到我的文档文件夹的根目录。


我正在建模我的应用程序之一是Arduino开发工具,它只是将其文件放在$HOME/sketchbook中。http://ardiuno.cc/ - Raceimaztion

1

一般而言,这并不是一种通用的方法。您将需要使用平台相关抽象层。例如,对于AppData,我会这样做:在Windows上,我检测到AppData/Roaming或AppData/Local(根据需要存储的数据),在其他平台上,我会在用户主目录中创建一个名为“.myappname”的文件夹,并使用它。

对于文档文件夹,您需要读取注册表。在Windows Vista之前,仅使用user.home属性+“/文档”是不够的,因为在其他语言中可能是“/Dokumente”(德语)或其他内容。只有注册表才有此文件夹的真实路径。

在Linux平台上,这取决于桌面环境。您需要进行尝试。我的观点是Gnome和KDE使用不同的位置存储文档文件夹。如果您只是在那里使用FVWM,则没有预定义的文档位置,但用户主目录属性是一个很好的后备。


我该如何查询注册表? - Raceimaztion

1

假设这是需要安装的应用程序,为什么不在安装过程中要求用户指定位置。使用此信息生成一个运行脚本,该脚本将设置相应的环境变量。通常情况下,不希望用户运行 java 命令!

当用户使用此运行脚本启动应用程序时,应用程序可以读取环境变量。

或者,创建一个包含配置文件的 jar 文件。使用 Classloader 的 getResourceAsStream 读取配置文件。只要配置 jar 在类路径下,就可以访问文件。这还有一个额外的好处,就是隐藏配置文件以防止意外修改。如果需要用户修改配置,则此方法也适用于文件夹。


你是在建议创建第二个带有配置数据的.jar文件,还是将配置数据添加到“主” .jar文件中? - Raceimaztion
我只是想把它放在CLASSPATH的资源中。 - questzen

-2
硬编码获取用户操作系统路径的方法有什么问题? 不同操作系统存在巨大的变化,而且使用不同的名称。 只需在启动时找到基于其操作系统的文档文件夹路径,并继续引用该路径即可。

1
问题在于不同操作系统版本的路径可能不同,本地化也会影响它。唯一正确的方法是使用给定平台上操作系统提供的本机功能。 - Justin Waugh
硬编码路径是一个非常糟糕的想法,主要是因为即使在同一操作系统下也不相同。正如Justin指出的那样,本地化可能是一个问题,漫游配置文件是另一个常见原因。此外,用户可以更改它。在Windows 7中,只需右键单击您的“我的文档”文件夹(不是库,而是实际文件夹),然后在“位置”选项卡上更改它。 - vcsjones
1
我指的是硬编码一种区分每个操作系统的方法。 - Craig White
那并不是硬编码,只是编写一个函数。正如Justin所指出的,大多数操作系统在其API规范中已经“硬编码”了这一点。 - vcsjones

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接