如何使用java.io.File类从src / main / resources读取文件?

时间:2014-07-14 13:47:48

标签: java maven weka

我有一个maven项目,其资源打包在src / main / resources中。该依赖项使用weka库,特别是AddClassification.setOptions()方法中的AddClassification class使用java.io.FILE类来读取给定的模型文件。 也许重要的是要注意这个项目是其他maven项目的依赖项,最后它将被运行在apache-tomcat中的Web应用程序应用程序使用。

为了澄清,方法AddClassification.setOptions()被称为:

AddClassification filter = new AddClassification();
filter.setInputFormat(labeled);
String[] options = new String[3];
options[0] = "-serialized";
options[1] = "models/trained.model";
options[2] = "-classification";
filter.setOptions(options);

所以,直到我的问题和需求:

  • 我需要将文件路径字符串传递给AddClassification.setOptions();
  • 我需要使用weka库,因为这个小依赖不是我自己编写的;
  • 所有模型文件都应该在Jar文件(src / main / resources)中,以便于分发;
  • java.io.File无法直接读取Jar文件中的文件(我查了一下);
  • 我知道class.getResourceAsStream可以很好地解决问题但是weka库需要一个String参数来使用java.io.File

我该如何解决这个问题?我可以轻松地将所有资源复制到硬编码的系统目录,但这会使我的项目难以分发到其他系统。 我正在寻找解决问题的正确方法。

我希望自己足够清楚。

3 个答案:

答案 0 :(得分:0)

查看代码我可以看到实现它的最简单方法是子类AddClassification并覆盖受保护的getActualClassifier方法以从getResourceAsStream加载分类器。令人讨厌的是,您仍然必须确保将路径传递给setOptions肯定存在的文件,否则它会抱怨,但您可以使用/dev/null或{{1}之类的东西逃脱因为您不需要从文件中实际读取,所以它必须存在。

/bin/sh

答案 1 :(得分:-1)

您始终可以将资源复制到临时文件中:

Path file = Files.createTempFile(null, null);

try (InputStream stream =
    MyOwnClass.class.getResourceAsStream("models/trained.model")) {

    Files.copy(stream, file, StandardCopyOption.REPLACE_EXISTING);
}

options[1] = file.toString();

答案 2 :(得分:-2)

请试一试

AddClassification filter = new AddClassification();
filter.setInputFormat(labeled);
String[] options = new String[3];
options[0] = "-serialized";
options[1] =  this.getClass().getResource("/models/trained.model").getFile();
options[2] = "-classification";
filter.setOptions(options);