Java 读取/写入文件,使其在linux/windows环境下工作

Java 读取/写入文件,使其在linux/windows环境下工作,java,file-io,Java,File Io,如果有人在他们的计算机(windows/linux/mac)上安装了我的java应用程序,我如何确保我的应用程序能够在所有环境中读取/写入文件 我的应用程序是否有办法确定它在文件系统中的安装位置,然后安全地读/写 注意:这些正在读/写的文件都是应用程序文件,即它不试图引用任何操作系统文件/注册表 因此,所有文件都可以位于应用程序根文件夹中(无论安装在何处)Java的文件IO库是独立于平台的,应该可以在安装jvm的任何操作系统上工作。尽管如此,一些文件系统的行为(权限、用户/组等)有所不同,这可能

如果有人在他们的计算机(windows/linux/mac)上安装了我的java应用程序,我如何确保我的应用程序能够在所有环境中读取/写入文件

我的应用程序是否有办法确定它在文件系统中的安装位置,然后安全地读/写

注意:这些正在读/写的文件都是应用程序文件,即它不试图引用任何操作系统文件/注册表


因此,所有文件都可以位于应用程序根文件夹中(无论安装在何处)

Java的文件IO库是独立于平台的,应该可以在安装jvm的任何操作系统上工作。尽管如此,一些文件系统的行为(权限、用户/组等)有所不同,这可能导致您的文件操作在一个平台上成功,但在另一个平台上失败。因此,最好在希望系统运行的所有系统上测试代码。

使用java.io.File(或者java.nio包)。这通常会跨平台工作,但您需要了解平台差异以及围绕这些差异编写的代码。例如,您需要使用File.pathSeparator之类的工具来确保为平台使用正确的路径分隔符。此外,根据您所做的工作,锁定的工作方式等也存在差异,并且并非所有操作都能保证正常工作——有些操作只是默默地失败

我的应用程序是否有办法确定它在文件系统中的安装位置,然后安全地读/写

您可以读取
user.dir
系统属性,以获取应用程序在中启动的路径。请注意,
user.dir
是只读属性,即不能通过设置
user.dir
属性来更改“当前目录”。您可以使用
system.getProperty(String)
方法读取系统属性。这与“installed in”并不完全相同,但可能会起作用。但它有点弱

如果确实需要安装目录的位置,请强制用户设置环境变量(MYAPP_HOME)或扫描整个文件系统。就我个人而言,我不喜欢这些选择

实际上,如果数据是特定于用户的,我认为最好的选择是在用户主目录中读取/写入数据(使用系统属性
user.home
获取数据),例如在
~/.yourapp
(Windows用户无论如何都不会进入他们的
%user\u home%
中),或者更好,在Freedesktop之后的目录中(显然,只有Linux用户会关心这个问题)


然后,要读/写,只需使用
java.io.File
,它在正确使用时是跨平台的(例如,使用
File.separator
如果需要构建路径,不要使用名称分隔符的硬编码版本)。

您需要在命令行或某些配置文件中设置一个属性,例如“-Dapphome=abx”。在前者中,您可以使用System.getProperty(“apphome”)检索它,但在后者中,您仍然需要某种方法来查找配置文件

如果有帮助,您可以使用System.getProperty(“user.home”)查找用户的主目录。这非常有帮助,因为您可以使用它作为起点来读取每个用户的配置文件。多个用户的公共文件需要进入系统的某个位置,例如/etc/appname/config.properties或C:\


顺便说一句,您应该对临时文件使用System.getProperty(“java.io.tmpdir”)。不要把启动应用程序的目录(如果可以的话——你可能没有必要的权限!)或用户的主目录弄得乱七八糟。但是你需要小心-为你的应用程序创建一个子目录,可能为每个用户创建一个子目录,以避免一个应用程序踩到第二个应用程序使用的临时文件的风险。

Java文件类接受“/”作为路径分隔符,所以只需使用它。如果您需要根驱动器,请不要编写C:或任何代码,而是向JRE请求根驱动器,并使用它们

至少在Windows中,在安装应用程序的地方编写应用程序,这难道不被普遍认为是一种糟糕的风格吗?