Java 如何引用保存在类路径下的文件?
在我们的应用程序中,我们在注册期间发送电子邮件。Java 如何引用保存在类路径下的文件?,java,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
为此,我们在/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);
通过上面的代码,我在
IOUtils.copy(is,writer);
如果使用具有相对路径的getClass().getResourceAsStream,则如果资源与类位于同一个包中,则会找到该资源
或者,您可以使用绝对名称,如“/some/package/email.html”为什么不使用
this.getClass().getClassLoader().getResourceAsStream("email.html");
您的资源位于类路径上一个固定的已知位置,因此最好使用。在
类
对象上调用它,它会自动使用类的类加载器
,并在类的包中查找资源
例如,如果您有一个名为com.example.myapp.Emailer的类,并且您编写:
InputStream is = Emailer.class.getResourceAsStream("email.html");
它将通过用于加载Emailer
类的同一类加载器来查找com/example/myapp/email.html
。您应该将email.html
放入JAR中,与编译的Emailer.class
文件位于同一位置
我特别建议不要为此使用Thread.currentThread().getContextClassLoader()
,因为结果可能因线程而异,并且可能是类加载器无法访问保存资源的JAR文件。您希望确保始终使用实际加载应用程序类的类加载器,并通过在应用程序的一个类的Class
对象上调用getResourceAsStream
来实现这一点。它是否在根级别的类路径中?抱歉,但不能在静态上下文中使用它