getResourceAsStream()vs FileInputStream

Viv*_*ath 168 java file-io web-applications fileinputstream

我试图在webapp中加载一个文件,FileNotFound当我使用时我得到了一个例外FileInputStream.但是,使用相同的路径,我能够在我这样做时加载文件getResourceAsStream().这两种方法之间有什么区别,为什么一种方法有效而另一方方法无效?

Bal*_*usC 255

java.io.File和配偶的行为在本地磁盘文件系统上.问题的根本原因是相对路径java.io依赖于当前工作目录.即从中启动JVM(在您的情况下:Web服务器的一个)的目录.例如,这可能是C:\Tomcat\bin或完全不同的东西,但因此不是 C:\Tomcat\webapps\contextname或任何你期望的.在一个普通的Eclipse项目中,那就是C:\Eclipse\workspace\projectname.您可以通过以下方式了解当前工作目录:

System.out.println(new File(".").getAbsolutePath());
Run Code Online (Sandbox Code Playgroud)

但是,工作目录绝不能以编程方式控制.您应该更喜欢在API中使用绝对路径File而不是相对路径.例如C:\full\path\to\file.ext.

您不希望硬编码或猜测Java(Web)应用程序中的绝对路径.这只是可移植性问题(即它在系统X中运行,但在系统Y中运行).通常的做法是将这些资源放在类路径中,或者将其完整路径添加到类路径中(在像Eclipse这样的IDE中,分别是src文件夹和"构建路径").这样你就可以在ClassLoaderby ClassLoader#getResource()或者的帮助下抓住它们ClassLoader#getResourceAsStream().它可以找到相对于类路径的"根"的文件,因为巧合的想法.在webapplications(或任何其他使用多个类加载器的应用程序)中,建议使用ClassLoaderas返回的as Thread.currentThread().getContextClassLoader(),这样你也可以在webapp上下文中"查看".

webapps的另一个替代方案是ServletContext#getResource()它的对应物ServletContext#getResourceAsStream().它能够访问位于webwebapp项目的/WEB-INF公用文件夹中的文件,包括该文件夹.该ServletContext是由继承的Servlet可用getServletContext()的方法,你可以把它原样.

也可以看看:

  • @khylo:相关:http://stackoverflow.com/questions/7952090/accessing-i18n-properties-file-in-a-jsf-application-programmatically/7955826#7955826 (4认同)
  • Thread.currentThread().getContextClassLoader()保存了我的培根 (2认同)

duf*_*ymo 26

getResourceAsStream 是为网络应用程序执行此操作的正确方法(正如您已经了解的那样).

原因是如果您将Web应用程序打包在WAR中,则无法从文件系统读取数据.这是打包Web应用程序的正确方法.它是可移植的,因为您不依赖于绝对文件路径或安装应用服务器的位置.

  • +1 - 虽然"无法工作"太强大了.(从文件系统中读取可以工作,但是可移植它是一个棘手的...以及更多的代码,特别是如果资源在JAR中.) (3认同)

mat*_*t b 13

FileInputStream将从Java进程的工作目录中加载您传递给构造函数的文件路径.通常在Web容器中,这类似于bin文件夹.

getResourceAsStream()将从您的应用程序的类路径加载相对的文件路径.


Dir*_*irk 12

FileInputStream类直接与底层的文件系统.如果有问题的文件没有在那里存在,它将无法打开它.该getResourceAsStream()方法的工作方式不同 它尝试使用ClassLoader调用它的类来定位和加载资源.这使它能够找到例如嵌入到jar文件中的资源.


Lac*_*che 6

classname.getResourceAsStream()通过classname的类加载器加载文件.如果类来自jar文件,那么将从中加载资源.

FileInputStream用于从文件系统中读取文件.


归档时间:

查看次数:

186731 次

最近记录:

6 年,9 月 前