getResourceAsStream(“Words.txt”)和FileInputStream(“./ src / package / Words.txt”)之间有什么区别?

时间:2016-02-19 09:01:21

标签: java servlets java-io

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

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

1 个答案:

答案 0 :(得分:5)

目前,您已经在开发人员工作站上,并且可能正在从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文件中的“文件”并从那里加载它。

在开发期间,当应用程序从爆炸的war结构运行时,也可以正常运行:类加载器将在IDE使用的目标目录下找到类来存储类文件和资源文件。

请注意,加载该资源所需的内容(如果它位于包com.foo中且MyClass位于同一个包中)是

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

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

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