无法从类路径获取文件(使用 NIO2)
Cann't get file from classpath (using NIO2)
我想从文件的内容创建一个字符串。根据this answer我是这样操作的:
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")。我检查这个文件的位置。它在class路径中:../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 中,因为 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 的实用程序 class。
重要提示:
如果我只是从 class 调用 .getResourceAsStream(...),资源文件将找不到并且方法将 return null:
MyClass.class.getResourceAsStream(stringTemplatePath);
所以,我在调用 .getResourceAsStream(...) 之前调用了 .getClassLoader() 并且它完美地工作:
MyClass.class.getClassLoader().getResourceAsStream(stringTemplatePath);
如果文件确实是类路径的一部分,您应该使用:
ClassName.class.getResourceAsStream("/file name")
这个 return InputStraem
或
ClassName.class.getResource("/file name")
这个returnURL
您不应以 Path
s.
的方式尝试和访问类路径中的资源
虽然当您的项目位于 IDE 设置中时这很可能会起作用,但一旦您的项目被打包为 jar 就不会起作用;然后甚至无法使用 Path
访问它们(即使您可以打开 zip 文件,因此可以打开 jars,如 FileSystem
s)。
改用专用方法,从 .getResourceAsStream()
:
开始
final InputStream in = MyClass.class.getResourceAsStream("/path/to/resource");
请注意,您需要检查该方法的 return 代码是否为 null
(如果在类路径中未找到资源,这就是 returned 的内容) .
我想从文件的内容创建一个字符串。根据this answer我是这样操作的:
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")。我检查这个文件的位置。它在class路径中:../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 中,因为 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 的实用程序 class。
重要提示:
如果我只是从 class 调用 .getResourceAsStream(...),资源文件将找不到并且方法将 return null:
MyClass.class.getResourceAsStream(stringTemplatePath);
所以,我在调用 .getResourceAsStream(...) 之前调用了 .getClassLoader() 并且它完美地工作:
MyClass.class.getClassLoader().getResourceAsStream(stringTemplatePath);
如果文件确实是类路径的一部分,您应该使用:
ClassName.class.getResourceAsStream("/file name")
这个 return InputStraem
或
ClassName.class.getResource("/file name")
这个returnURL
您不应以 Path
s.
虽然当您的项目位于 IDE 设置中时这很可能会起作用,但一旦您的项目被打包为 jar 就不会起作用;然后甚至无法使用 Path
访问它们(即使您可以打开 zip 文件,因此可以打开 jars,如 FileSystem
s)。
改用专用方法,从 .getResourceAsStream()
:
final InputStream in = MyClass.class.getResourceAsStream("/path/to/resource");
请注意,您需要检查该方法的 return 代码是否为 null
(如果在类路径中未找到资源,这就是 returned 的内容) .