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()的方法,你可以把它原样.
duf*_*ymo 26
getResourceAsStream 是为网络应用程序执行此操作的正确方法(正如您已经了解的那样).
原因是如果您将Web应用程序打包在WAR中,则无法从文件系统读取数据.这是打包Web应用程序的正确方法.它是可移植的,因为您不依赖于绝对文件路径或安装应用服务器的位置.
mat*_*t b 13
FileInputStream将从Java进程的工作目录中加载您传递给构造函数的文件路径.通常在Web容器中,这类似于bin文件夹.
getResourceAsStream()将从您的应用程序的类路径加载相对的文件路径.
Dir*_*irk 12
本FileInputStream类直接与底层的文件系统.如果有问题的文件没有在那里存在,它将无法打开它.该getResourceAsStream()方法的工作方式不同 它尝试使用ClassLoader调用它的类来定位和加载资源.这使它能够找到例如嵌入到jar文件中的资源.
classname.getResourceAsStream()通过classname的类加载器加载文件.如果类来自jar文件,那么将从中加载资源.
FileInputStream用于从文件系统中读取文件.
| 归档时间: |
|
| 查看次数: |
186731 次 |
| 最近记录: |