Java6中java.nio.file.Paths的替代方案

时间:2015-01-12 13:29:43

标签: java android javafx classloader

由于Java6和Android中不存在java.nio.file.Paths类及其包,我想知道如何为Paths.get("filename").toUri().toURL()使用替代方法?我尝试使用JavaFX中的fxml加载FXMLLoader文件。通常我将所有fxml文件放在src目录中的特定布局包中,这样可以通过相对路径轻松加载这些文件。但是,因为我为Android构建了JavaFX项目,所以我需要将fxml文件存储到assets目录中,以便它自动包含在apk文件中(使用gradle构建)。

到目前为止,这是我的项目结构:

MyProject
-- src\main\java\somepackage\Main.java
-- assets\sample_layout.fxml

但是,当我构建apk时,结构如下所示:

Content of MyProject.apk
-- assets\sample_layout.fxml
-- classes.dex // which contains all compiled classes
   -- somepackage\Main.java

我需要访问sample_layout.fxmlassets目录中的Main.java。知道我该怎么做吗?

以下是Java7的工作原理,但不适用于Java6 (而不是在Android上,因为Java6中没有Paths类):

URL myFxmlLayout= Paths.get("assets/sample_layout.fxml").toUri().toURL();
FXMLLoader loader = new FXMLLoader(myFxmlLayout);
AnchorPane page = (AnchorPane) loader.load();

对于Java6,我尝试了以下操作,但无效:

URL myFxmlLayout= new URI("file:///assets/sample_layout.fxml").toURL();
// OR
URL myFxmlLayout= new URI("file:///../../../../assets/sample_layout.fxml").toURL();

希望你能帮助我。

祝你好运, 迈克尔

2 个答案:

答案 0 :(得分:3)

事实上,Paths的使用在技术上是错误的。 FXML源可能最好作为只读资源打包在jar中。

MyProject
-- src\main\java\somepackage\Main.java
-- src\main\resources\assets\sample_layout.fxml

URL myFxmlLayout= Main.class.getResource("/assets/sample_layout.fxml");

在原始设计中,您可以改为使用new File(...),但是必须处理assetsgetAbsolutePath)的路径以及它的运行时安装。

答案 1 :(得分:1)

你可以做到

new File(filename).toURI().toURL()

我从未使用过JavaFX和Android,因此我没有在您描述的上下文中对此进行测试,但它是您使用的java.nio惯用语的前Paths.get(...)版本。