繁体   English   中英

Java - 跨平台文件路径

[英]Java - Cross-platform filepath

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

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

我设法在桌面上工作,但不是在 android 上。 因为我猜它有不同的文件结构。 这就是我尝试动态获取文件路径的原因。

在运行之前创建(且未修改)的现有资源文件似乎在两个平台上都可以正常工作。

我尝试使用new File("src/main/resources/folder/file.ser").getAbsolutePath(); 并尝试从我的根文件夹访问它,如下所示: getClass.getResources("/folder/file.ser").getPath(); . 它们都可以在桌面(Windows)上正常工作,但不幸的是 Android 没有通过文件路径找到文件。

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

知道如何读取和写入在 android 和桌面上都可以使用的运行时创建的文件吗?

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

我认为你在一个完全错误的轨道上。 在资源文件夹中创建或写入文件通常不起作用。 这个想法是资源文件夹中的文件被打包成 jar 文件或以其他方式与应用程序捆绑在一起并且在运行时不可写。

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

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

因此资源只能用作模板,一个初始文件。 它们应该被复制到应用程序之外的真实文件中。

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 对象,不是一个好主意。 我建议使用带有注释的 JAXB 的 XML。 更具可读性、可维护性、可版本化。 在您的位置开发 JRE 与在客户端部署 JRE 之间没有冲突。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM