【问题标题】:Cross-platform way to ask for the user's documents folder?跨平台方式询问用户的文档文件夹?
【发布时间】:2011-08-01 04:40:12
【问题描述】:

我正在用 Java 编写一个跨平台程序,并希望将配置文件粘贴在用户的文档文件夹中(Windows 下的“我的文档”,适当的 Linux 下的“文档”,以及 Mac OS 下的任何文件夹) ,但我不知道如何向 Java 询问。

我想远离硬编码的事情(如果我们在 Windows 上做 X,如果我们在 Linux 上做 Y,或者 Z 如果我们在 OS X 上),因为这将支持的重担放在我的肩上,而不是 Oracle 开发团队。

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

【问题讨论】:

    标签: java cross-platform


    【解决方案1】:

    遗憾的是,没有简单的跨平台方式。您必须利用每个操作系统平台上的本机功能

    • 这里有一些关于如何在osx 中进行操作的信息
    • 这里有一些关于如何在windows 中进行操作的信息

    对于 Linux,我没有方便的链接,但鉴于 Linux 中不一定有 Documents 文件夹的概念,我不知道有什么好的解决方案。系统属性user.home 至少应该在 Linux 中有效。

    【讨论】:

    • 您认为每个操作系统只需要几行代码就可以逃脱惩罚吗?至少阅读你那里的 Windows 链接的一些答案让我认为你必须使用大量代码来做一些看起来应该相当容易的事情。
    • 我认为其中一个链接有一个指向谷歌代码库的链接,可以为你做这件事(对于 Windows)。因此,至少您个人不必编写太多代码来调用它。我不确定你认为很多很多代码是什么,但至少这是你做一次然后你可以将它用于你做过的所有项目的事情,所以它有很多价值。
    • "似乎应该很容易..." 这似乎不是一件容易的事...考虑到每个操作系统的每种风格都可以放入用户的“documents”目录可以放在任何地方。更不用说不是每个操作系统都有 文档目录。哎呀......用户甚至不需要在每个操作系统上都有一个主目录,是吗?
    【解决方案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");

    /用户/大卫/文档

    赢:System.getenv("APPDATA"));

    C:\Documents and Settings\david\Application Data

    【讨论】:

      【解决方案3】:

      这通常不可能以通用方式进行。您将不得不使用依赖于平台的方法。我对 AppData 这样做,例如,在 Windows 上,我检测 AppData/Roaming 或 AppData/Local,这取决于我需要存储的数据,在其他平台上,我在 userhome 中创建一个文件夹“.myappname”,并使用它。

      对于文档文件夹,您必须阅读注册表。在 Windows Vista 之前使用 user.home 属性 +“/Documents”是不够的,因为在其他语言中它可能是“/Dokumente”(德语)或其他语言。只是注册表有这个文件夹的真实路径。

      在 linux 平台上,它取决于桌面环境。你只需要尝试一下。 Gnome 和 KDE 使用不同的位置来存储 Documents 文件夹,恕我直言。如果你只是在那里使用 FVWM,除了 user.home 属性外,没有预定义的文档位置,这是一个很好的后备。

      【讨论】:

      • 如何查询注册表?
      【解决方案4】:

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

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

      或者,使用配置文件创建一个 jar 文件。使用 Classloader 的 getResourceAsStream 读取配置文件。只要配置 jar 在类路径下,您就可以访问这些文件。这还具有隐藏配置以防止意外修改的额外优势。这也适用于文件夹(如果用户需要修改配置)。

      【讨论】:

      • 您是建议使用配置数据创建第二个 .jar 文件还是将配置数据附加到“主” .jar 文件?
      • 我的意思是把它放在一个属于 CLASSPATH 的资源中 :)
      【解决方案5】:

      询问用户,他们想将数据保存到哪里,或使用当前目录(简单的相对路径)并提供适当的设置说明。 “询问”的一种方式是拥有一个可以通过命令行设置的属性。

      不要只是用你的应用程序的东西污染用户的主目录 - 你怎么知道他们喜欢他们的文档树的组织方式?

      我完全厌倦了面向 *nix 的程序将它们的小配置文件和数据文件夹放到我的文档文件夹的根目录中。

      【讨论】:

      • 我正在为我的应用程序建模的程序之一是 Arduino 开发工具,它只是将其文件放在 $HOME/sketchbook 中。 ardiuno.cc
      【解决方案6】:

      根据用户操作系统硬编码获取路径的方法有什么问题? 可能会有很大的差异,并且操作系统的工作方式不同,名称不同。 只需在启动时根据其操作系统找到文档文件夹的路径,然后在需要的地方继续引用该路径。

      【讨论】:

      • 问题是操作系统版本的多样性往往有不同的路径,本地化也会影响它。唯一正确的方法是在给定平台上使用操作系统提供的本机功能。
      • 硬编码路径是一个糟糕的想法,主要是因为即使在相同的操作系统下也不相同。正如贾斯汀指出的那样,本地化可能是一个问题,漫游配置文件是另一个常见原因。此外,用户可以更改它。在 Windows 7 中,只需右键单击“我的文档”文件夹(不是库,实际文件夹),然后在“位置”选项卡上进行更改。
      • 我指的是硬编码一种区分每个操作系统的方法。
      • 那并不是真正的硬编码,它只是编写一个函数。正如 Justin 所指出的,大多数操作系统都在其 API 规范中为您“硬编码”了这一点。
      猜你喜欢
      • 2013-10-05
      • 1970-01-01
      • 1970-01-01
      • 2017-08-11
      • 2012-03-15
      • 1970-01-01
      • 1970-01-01
      • 2010-09-06
      • 1970-01-01
      相关资源
      最近更新 更多