如何引用保存在classpath下的文件?

时间:2017-05-18 11:35:03

标签: java

在我们的申请中,我们会在注册时发送电子邮件 为此,我们在/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.NullPointerException
IOUtils.copy(is,writer);

3 个答案:

答案 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来实现此目的。