当前位置: 首页 > 面试题库 >

Java-getResourceAsStream()与FileInputStream

通煜祺
2023-03-14
问题内容

我试图在webapp中加载文件,而FileNotFound使用时却出现异常FileInputStream。但是,使用相同的路径时,我能够加载文件getResourceAsStream()。两种方法有什么区别,为什么一种方法有效而另一种无效?


问题答案:

java.io.File和配偶的行为在本地磁盘文件系统上。问题的根本原因是其中的相对路径java.io取决于当前工作目录。即从中启动JVM(在你的情况下为:Web服务器的目录)的目录。例如,这可能是C:\Tomcat\bin或完全不同的东西,但是却并非 如此,C:\Tomcat\webapps\contextname或者你期望的是什么。在正常的Ec​​lipse项目中,该值为C:\Eclipse\workspace\projectname。你可以通过以下方式了解当前工作目录:

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

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

你不想硬编码或猜测Java(Web)应用程序中的绝对路径。那只是可移植性的麻烦(即它在系统X中运行,而不在系统Y中运行)。通常的做法是将此类资源放置在类路径中,或将其完整路径添加到类路径(在像Eclipse这样的IDE中,分别是src文件夹和“构建路径”)。这样,你可以借助ClassLoaderby ClassLoader#getResource()或抓住它们ClassLoader#getResourceAsStream()。巧合的是,它能够相对于类路径的“根”定位文件。在Web应用程序(或使用多个类加载器的任何其他应用程序)中,建议为此使用ClassLoader返回的as Thread.currentThread().getContextClassLoader(),以便你也可以在webapp上下文之外查找。

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



 类似资料:
  • 问题内容: 我正在从Java项目的已编译JAR中的包中加载文本文件。相关目录结构如下: 我的代码通过调用返回来加载文件。 无论我使用什么,都将始终打印输出。我不确定为什么上面的方法行不通,所以我也尝试了: 这些都不起作用。我 读 了许多 问题至今的话题,但他们都不是有帮助的-通常情况下,他们只是说,使用根路径,这我已经在做负载文件。那,或者只是从当前目录加载文件(只是),我也尝试过。该文件将使用适

  • 问题内容: 我在Java Web应用程序中具有以下结构: 在中WS.java,我在Web方法中使用以下代码: 但是它总是返回null。我需要读取该文件,并且我读到如果将文件放入其中,则可以使用进行访问,但是该方法始终返回null。 对我可能做错的任何想法? 它正在工作,但是当我Clean and Build在Project上执行了a之后,它突然停止工作了 问题答案: 据我所知,该文件必须正确地放置

  • 问题内容: 我正在尝试存储对应用程序属性所做的更改。该文件位于包中,与包含我的UI和模型的包不同。 我使用以下方法打开了包装: 是否有与之等效的功能,允许我将对Properties类的更改持久保存在同一.Properties文件中? 问题答案: 听起来您想存储用户首选项。考虑为此使用Java Preferences API 。

  • 问题内容: 有人可以向我解释一下.getResourceAsStream()如何真正起作用。我试图找出令人痛苦的事实,在某些情况下是getClass()。getResourceAsStream(name); 在Eclipse中可以正常使用,但在部署版本(NPE)中则不能。我面临的另一个事实是,有时getClass()。getResource(name); 返回一个完全有效的网址,但getClass

  • 问题内容: 我试图将文件加载到Web应用程序中,FileNotFound但使用时出现异常FileInputStream。但是,使用相同的路径时,我能够加载文件getResourceAsStream()。两种方法有什么区别,为什么一种方法有效而另一种无效? 问题答案: 在和配偶的行为在本地磁盘文件系统上。问题的根本原因是其中的相对路径取决于当前工作目录。即启动JVM(在你的情况下为:Web服务器的目

  • 我有以下问题 返回null,但是 返回InputStream,并且两个文件都在此文件夹中。有什么不对劲? 我使用的是libgdx-0.9.6