我正在尝试开发一个跨平台的应用程序,它也可以在桌面和安卓上使用JavaFX和胶子。
在运行时,我的代码在资源文件夹中创建一个序列化文件。我还需要从它读取和写入序列化的数据。
我设法在桌面上工作,但没有在android上工作。因为它有不同的文件结构。这就是为什么我试图动态获取文件路径的原因。
在运行时之前创建的现有资源文件(而不是修改的)在这两个平台上似乎都能正常工作。
我尝试使用new File("src/main/resources/folder/file.ser").getAbsolutePath();,并尝试从我的根文件夹访问它,比如:getClass.getResources("/folder/file.ser").getPath();。它们都可以在桌面(Windows)上正常工作,但不幸的是,Android并没有按文件路径找到文件。
另一个问题可能是我不应该在资源文件夹中创建运行时文件,但是应该在哪里创建呢?
你知道我怎样才能读和写运行时创建的文件,在android和桌面上都能工作吗?
(如果这些信息不足以帮助我,我尝试以最小的形式复制我的代码,并提供更多的细节。)
发布于 2020-01-10 11:29:53
我觉得你走错了路。一般情况下,创建或写入资源文件夹中的文件不起作用。其想法是将资源文件夹中的文件打包到jar文件中,或者以其他方式与应用程序捆绑在一起,并且在运行时不能写。
您应该做的是在程序第一次启动时创建一个应用程序文件夹。例如,桌面上的一个常见做法是在用户主目录中创建一个不可见的文件夹".myApp“。在其他平台上,比如Android,有其他特定于平台的命名和位置规则,但概念是相同的。第一次启动时,您还可以将必要的资源从资源文件夹复制到此应用程序文件夹中,以便在运行时编辑它们。
发布于 2020-01-10 11:30:04
资源文件在类路径上有一个路径,可以打包在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之间没有冲突。
https://stackoverflow.com/questions/59680493
复制相似问题