【问题标题】:What is the difference between getResourceAsStream("Words.txt") and FileInputStream("./src/package/Words.txt")? [duplicate]getResourceAsStream("Words.txt") 和 FileInputStream("./src/package/Words.txt") 有什么区别? [复制]
【发布时间】:2016-02-19 09:01:20
【问题描述】:

我目前正在编写一个基于 servlet 的应用程序(客户端)。我试图在代码所在的同一个包中获取一个文本文件。我遇到的所有方法都使用MyClass.class.getResourceAsStream("Words.txt")classLoader.getResourceAsStream("Words.txt") 来获取文本文件(例如:SO1SO2)。但是我试过FileInputStream("./src/package/Words.txt") 还是可以成功加载文本文件。

有什么区别?为什么鼓励使用getResourceAsStream 方法?

【问题讨论】:

  • 对不起,我不明白你的意思。为什么我在运行程序时仍然可以使用 FileOutputStream 加载我想要的文件?
  • 我很抱歉,我意识到我在问题中的错误,我会改变它。应该是 FileInputStream
  • 这已在您的“SO2”问题的最佳答案下方的“另请参阅”链接中得到解答。对于相关问答,请仔细注意答案中的“另见”链接。
  • 哦,是的,你是对的。我的错,我没有注意到。

标签: java servlets java-io


【解决方案1】:

目前,您在开发人员工作站上,并且可能正在从您的 IDE 运行您的应用程序。 Tomcat恰好是从IDE项目根目录启动的,因此使用

new FileInputStream("./src/package/Words.txt")

允许读取存储在项目src 目录中的文件。

但这不是项目在生产中运行的方式。在生产环境中,您将拥有一个使用 shell 脚本从完全不同的目录启动的 Tomcat 服务器。而且生产服务器根本没有源项目。它所拥有的只是 Tomcat,以及构成从项目构建的工件的 war 文件。

所以根本不会有src 目录,文件Words.txt 甚至不会在文件系统上的任何位置。它只是 war 文件(实际上是一个 zip 文件)的入口,位于 WEB-INF/classes/package 下,以及编译器从您的 Java 源文件生成的 .class 文件。

因此,为了能够读取该“文件”,您不能使用文件 IO:文件系统中不存在“文件”。您需要使用 ClassLoader 来定位 war 文件中的“文件”并从那里加载它。

这在开发过程中也可以正常运行,当应用程序从分解的战争结构中运行时:类加载器将在您的 IDE 用于存储类文件和资源文件的目标目录下找到类。

请注意,如果它在包 com.foo 中并且 MyClass 在同一个包中,则加载该资源需要的是

MyClass.class.getResourceAsStream("Words.txt") 

AnyOtherOfYourClassesWhateverThePackageIs.class.getResourceAsStream("/com/foo/Words.txt") 

classLoader.getResourceAsStream("com/foo/Words.txt")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-05
    相关资源
    最近更新 更多