无法从类路径获取文件(使用NIO2)

时间:2015-04-15 16:31:08

标签: java io classpath jelastic nio2

我想从文件内容创建一个String。根据{{​​3}}我这样做:

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

因此,在classpath中提交文件,因为新文件(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的实用类。

重要说明:

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

MyClass.class.getResourceAsStream(stringTemplatePath);

所以,在调用 .getResourceAsStream(...)之前,我调用了 .getClassLoader(),它完美地运行了:

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

2 个答案:

答案 0 :(得分:2)

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

虽然当您的项目位于IDE设置中时,这很可能会有效,但是只要您的项目打包为jar,就不会这样做;然后甚至无法使用Path访问它们(即使你可以打开zip文件,因此jars,如FileSystem)。

使用专用方法代替,从.getResourceAsStream()开始:

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

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

答案 1 :(得分:1)

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

ClassName.class.getResource("/file name") 此返回网址