gpt4 book ai didi

java - getResourceAsStream() 与 FileInputStream

转载 作者:行者123 更新时间:2023-12-03 23:14:54 24 4
gpt4 key购买 nike

我试图在 Web 应用程序中加载文件,但在使用 FileInputStream 时出现了 FileNotFound 异常。但是,使用相同的路径,我可以在执行 getResourceAsStream() 时加载文件。这两种方法有什么区别,为什么一种有效而另一种无效?

最佳答案

java.io.File and consorts 作用于本地磁盘文件系统。问题的根本原因是 java.io 中的相对 路径依赖于当前工作目录。 IE。启动 JVM(在您的例子中是网络服务器的目录)的目录。例如,这可能是 C:\Tomcat\bin 或完全不同的东西,但因此不是 C:\Tomcat\webapps\contextname 或其他什么你会期望它是。在普通的 Eclipse 项目中,它是 C:\Eclipse\workspace\projectname。您可以通过以下方式了解当前工作目录:

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

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

您不想硬编码或猜测 Java(网络)应用程序中的绝对路径。这只是可移植性问题(即它在系统 X 中运行,但不在系统 Y 中运行)。通常的做法是将这些类型的资源放在 classpath 中,或者将其完整路径添加到类路径中(在像 Eclipse 这样的 IDE 中是 src 文件夹和“构建路径”)。通过这种方式,您可以借助 ClassLoader#getResource()ClassLoader 获取它们或 ClassLoader#getResourceAsStream() .正如您偶然发现的那样,它能够定位相对于类路径“根”的文件。在 web 应用程序(或任何其他使用多个类加载器的应用程序)中,建议使用 Thread.currentThread().getContextClassLoader() 返回的 ClassLoader ,以便您可以查看也在 webapp 上下文“之外”。

webapps 中的另一种选择是 ServletContext#getResource()及其对应物ServletContext#getResourceAsStream() .它能够访问位于 webapp 项目的公共(public) web 文件夹中的文件,包括 /WEB-INF 文件夹。 ServletContext 由继承的 getServletContext() 在 servlet 中可用。方法,您可以按原样调用它。

另见:

关于java - getResourceAsStream() 与 FileInputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33156294/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com