getResourceAsStream()和FileInputStream

问题:

我正在尝试在webapp中加载一个文件,当我使用FileInputStream时,我收到FileNotFound异常。然而,使用相同的路径,当我做getResourceAsStream()时,我可以加载该文件。
两种方法有什么区别,为什么一个工作而另一个不工作?

回答:

java.io.File和consorts作用于本地磁盘文件系统。您的问题的根本原因是java.io中的relative路径取决于当前的工作目录。即从其中启动JVM(在您的情况下:Web服务器的目录)的目录。这可能是C:\Tomcat\bin或完全不同的东西,但是not C:\Tomcat\webapps\contextname或者你期望的那样。在一个普通的Eclipse项目中,这将是C:\Eclipse\workspace\projectname。您可以通过以下方式了解当前工作目录:

System.out.println(new File(".").getAbsolutePath());

但是,工作目录绝对不可编程控制。您应该更喜欢在File API中使用absolute路径,而不是使用相对路径。例如。 C:\full\path\to\file.ext
您不想硬编码或猜测Java(Web)应用程序中的绝对路径。这只是可移植性的麻烦(即它在系统X中运行,但不在系统Y中)。通常的做法是将这些资源放在类路径中,或者将其完整路径添加到类路径(在类似于Eclipse的IDE中,分别是src文件夹和“构建路径”)。这样你可以借助于ClassLoader#getResource()ClassLoader#getResourceAsStream()ClassLoader来抓住他们。它能够相对于类路径的“根”找到文件,因为你巧合了。在web应用程序(或使用多个类加载器的任何其他应用程序)中,建议使用Thread.currentThread().getContextClassLoader()返回的ClassLoader,以便您可以在外部查看Web应用程序上下文。
webapps中的另一个选择是ServletContext#getResource()及其对应ServletContext#getResourceAsStream()。它可以访问位于webapp项目的public web文件夹中的文件,包括/WEB-INF文件夹。 ServletContext可以通过继承的getServletContext()方法在servlet中使用,您可以按原样调用它。

也可以看看:

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: getResourceAsStream() vs FileInputStream

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

70 + = 75