在我们的申请中,我们会在注册时发送电子邮件 为此,我们在/usr/local/email.html
下有一个电子邮件模板StringWriter writer = new StringWriter();
IOUtils.copy(new FileInputStream(new File("/usr/local/email.html")),writer);
message.setContent(writer.toString(), "text/html");
Transport.send(message);
上述情况正常。
我们不想对此路径进行硬编码(/usr/local/email.html),希望保留在classpath下
如果我将它保存在classpath下,我该怎么读?
StringWriter writer = new StringWriter();
ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream is = loader.getResourceAsStream("email.html");
IOUtils.copy(is,writer);
message.setContent(writer.toString(), "text/html");
Transport.send(message);
使用上面的代码,我在
处获得了java.lang.NullPointerExceptionIOUtils.copy(is,writer);
答案 0 :(得分:0)
如果你使用具有相对路径的getClass()。getResourceAsStream,那么找到资源,如果它与该类在同一个包中。
或者,您可以使用绝对名称,例如“/some/package/email.html”
答案 1 :(得分:0)
为什么不使用
this.getClass().getClassLoader().getResourceAsStream("email.html");
答案 2 :(得分:0)
您的资源位于类路径上固定的已知位置,因此最好使用Class#getResourceAsStream
method。您在Class
对象上调用它,它会自动使用类ClassLoader
并在类的包中查找资源。
例如,如果您有一个名为com.example.myapp.Emailer
的类,并且您写了:
InputStream is = Emailer.class.getResourceAsStream("email.html");
它将通过用于加载com/example/myapp/email.html
类的相同类加载器查找Emailer
。您将email.html
放在JAR中,与编译的Emailer.class
文件位于同一位置。
我特别推荐不使用Thread.currentThread().getContextClassLoader()
,因为结果因线程而异,并且它可能是一个无法访问的类加载器保存资源的JAR文件。您希望确保始终使用实际加载应用程序类的类加载器,并通过在应用程序的某个类的getResourceAsStream
对象上调用Class
来实现此目的。