我目前正在编写基于servlet的应用程序(客户端)。我试图在代码所在的同一个包中找到一个文本文件。我遇到的所有方法都使用MyClass.class.getResourceAsStream("Words.txt")
或classLoader.getResourceAsStream("Words.txt")
来获取文本文件(例如:SO1,SO2)。但我已经尝试FileInputStream("./src/package/Words.txt")
,文本文件仍然可以成功加载。
有什么区别?为什么方法getResourceAsStream
被鼓励?
答案 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")