Java-跨平台文件路径

时间:2020-01-10 11:09:17

标签: java android javafx desktop gluon

我正在尝试使用JavaFX和Gluon开发一个跨平台应用程序,该应用程序也可以在桌面和Android上运行。

在运行时,我的代码在资源文件夹中创建一个序列化文件。我还需要读取/写入序列化数据。

我设法在台式机上工作,但在android上却没有。我猜因为它具有不同的文件结构。 这就是为什么我尝试动态获取文件路径的原因。

在运行时之前创建(而不进行修改)的现有资源文件似乎在两个平台上都能正常工作。

我尝试使用new File("src/main/resources/folder/file.ser").getAbsolutePath();,并尝试通过这样的根文件夹访问它:getClass.getResources("/folder/file.ser").getPath();。两者都可以在台式机(Windows)上正常运行,但不幸的是Android找不到按文件路径显示的文件。

另一个问题可能是我不应该在资源文件夹中创建运行时文件,但是应该在哪里?

有什么主意,我该如何读写在Android和台式机上均可运行时创建的文件?

(如果信息不足以帮助我,我会尝试以最小的形式复制代码并提供更多详细信息。)

2 个答案:

答案 0 :(得分:2)

我认为您的做法完全错误。通常,在资源文件夹中创建或写入文件不起作用。这个想法是将资源文件夹中的文件打包到jar文件中,或者与应用程序捆绑在一起,并且在运行时不可写。

您应该做的是在程序首次启动时创建一个应用程序文件夹。例如,在台式机上的常见做法是在用户的主目录中创建一个不可见的文件夹“ .myApp”。在其他平台(如Android)上,还有其他特定于平台的命名和位置规则,但是概念相同。在首次启动时,您还可以将必要的资源从资源文件夹复制到此应用程序文件夹,以便可以在运行时进行编辑。

答案 1 :(得分:2)

资源文件,其路径在 class路径上,可以打包在jar中,并且应被视为只读,尤其是在某些情况下可能会缓存资源时。他们不是 File。可以通过URL,URI,路径捕获它们。路径区分大小写,路径分隔符为/

因此,资源只能用作模板(初始文件)。应该将它们复制到应用程序外部的真实文件中。

Path path = Paths.get(System.getProperty("user.home"), ".myapp/file.ser");
Files.createDirectories(path.getParent());
if (Files.exists(path)) {
    URL url = MyClass.class.getResource("/folder/file.ser");
    Path template = Paths.get(url.toURI());

    Files.copy(template, path);
}

此外,.ser是序列化的Java对象,也不是一个好主意。我会建议XML 使用带有注释的JAXB。更具可读性,可维护性,可版本化。在您自己的位置开发JRE与在客户端部署JRE之间没有冲突。