0

我想从文件的内容创建一个字符串。根据这个答案,我这样做:

private static String buildStringFromTemplate(String stringTemplatePath) throws IOException {
    byte[] encoded = Files.readAllBytes(Paths.get(stringTemplatePath));
    return new String(encoded, "UTF-8");
}

(据我了解,这是一条新的 NIO2 API 路径,它是 Java 7 的一部分。)

stringTemplatePath参数是文件的名称(“template.html”)。我检查了这个文件的位置。它在类路径中:../classes /template.html

调用此函数后,我得到一个异常:

java.nio.file.NoSuchFileException: template.html

也许我以错误的方式发送文件名参数?我尝试发送此修改:"file:///template.html""classpath:template.html",但没有帮助。

我也试过这段代码:

private static String buildStringFromTemplate(String stringTemplatePath) throws IOException {
    File file = new File(stringTemplatePath);
    String absolutePath = file.getAbsolutePath();
    byte[] encoded = Files.readAllBytes(Paths.get(absolutePath));
    return new String(encoded, "UTF-8");
}

我调用了这个函数,我得到了以下异常:

java.nio.file.NoSuchFileException: /opt/repo/versions/8.0.9/temp/template.html

所以,类路径中的文件,因为new File(stringTemplatePath)可以创建一个文件。但是这个文件的路径很奇怪(/opt/repo/versions/8.0.9/temp/template.html)。我使用 Jelastic 作为主机(环境:Java 8、Tomcat 8),如果它是 metter 的话。


更新:最终工作解决方案:

private static String buildStringFromTemplate(String stringTemplatePath) throws IOException {
    InputStream inputStream = MyClass.class.getClassLoader().getResourceAsStream(stringTemplatePath);
    return IOUtils.toString(inputStream, "UTF-8"); 
}

IOUtils是来自 Apache IO Commons 的 util 类。

重要提示:

如果我只是从class调用.getResourceAsStream(...),将找不到资源文件并且方法将返回null

MyClass.class.getResourceAsStream(stringTemplatePath);

因此,我在调用 .getResourceAsStream(... )之前调用了 .getClassLoader()并且它运行良好:

MyClass.class.getClassLoader().getResourceAsStream(stringTemplatePath);
4

2 回答 2

2

您不应该以 s 的身份尝试和访问类路径中Path的资源。

虽然当您的项目位于 IDE 设置中时这很可能会起作用,但一旦您的项目被打包为 jar 就不会了;然后就不可能使用 even 访问它们Path(即使您可以打开 zip 文件,因此可以打开 jars,as FileSystems)。

使用专用方法来代替,从.getResourceAsStream()

final InputStream in = MyClass.class.getResourceAsStream("/path/to/resource");

请注意,您需要检查该方法的返回代码是否为null(如果在类路径中找不到资源,则返回此代码)。

于 2015-04-15T20:13:17.623 回答
1

如果文件确实是您应该使用的类路径的一部分: ClassName.class.getResourceAsStream("/file name") 返回 InputStraem

ClassName.class.getResource("/file name") 返回 URL

于 2015-04-15T19:04:40.370 回答