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

java中getResourceAsStream()和FileInputStream()有什么区别?

程招
2023-03-14
问题内容

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


问题答案:

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());

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

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

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



 类似资料:
  • 问题内容: 我目前正在编写一个基于servlet的应用程序(客户端)。我试图在代码所在的同一包中获取一个文本文件。我遇到的所有方法都使用或获取了文本文件(例如:SO1,SO2)。但是我已经尝试过了,文本文件仍然可以成功加载。 有什么区别?为何鼓励使用该方法? 问题答案: 目前,您正在开发人员工作站上,并且可能正在通过IDE运行您的应用程序。Tomcat恰好是从IDE项目根目录启动的,因此使用 允许

  • 问题内容: 我试图在中加载文件,而使用时却出现异常。但是,使用相同的路径时,我能够加载文件。两种方法有什么区别,为什么一种方法有效而另一种无效? 问题答案: 在和配偶的行为在本地磁盘文件系统上。问题的根本原因是其中的相对路径取决于当前工作目录。即从中启动JVM(在你的情况下为:Web服务器的目录)的目录。例如,这可能是或完全不同的东西,但是却并非 如此,或者你期望的是什么。在正常的项目中,该值为。

  • Java中FileInputStream和BufferedInputStream的区别是什么?

  • 问题内容: 我只是想知道为什么我们通常在两个布尔之间使用逻辑OR 而不是按位OR ,尽管它们都运行良好。 我的意思是,请看以下内容: 我们可以代替使用吗?与和相同。 问题答案: 如果您使用和形式,而不是这些运算符的和形式,则Java不会费心地单独评估右手操作数。 这是您是否希望缩短评估时间的问题-在 大多数情况 下都是如此。 说明短路好处的一个好方法是考虑以下示例。 正如Jeremy和Peter提

  • 问题内容: 我一直认为Java 中的运算符用于验证其两个布尔操作数是否均为,并且该&运算符用于对两种整数类型进行按位运算。 最近我知道,也可以使用运算符来验证其两个布尔操作数是否均为,唯一的区别是即使LHS操作数为false,它也会检查RHS操作数。 Java中的运算符是否在内部重载?还是在这背后有其他概念? 问题答案: <-验证两个操作数 <-停止评估第一个操作数是否为false,因为结果为fa

  • 问题内容: 我在看一些模拟的OCJP问题。我遇到了一个非常令人困惑的语法。这里是: 为什么输出在和之间变化? 问题答案: 问题只是和您玩弄混乱的空格。 是通常的(不等于)比较。 另一方面: 最好写成如下形式: 因此,这是两个运算符。 首先反转。 然后将其分配回。 赋值运算符返回分配的值。因此,计算结果为true-这就是您要打印的内容。