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

kar*_*sky -1 java servlets java-io

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

有什么区别?为什么getResourceAsStream鼓励这种方法呢?

JB *_*zet 5

目前,您在开发人员工作站上,可能正在从IDE运行您的应用程序.Tomcat碰巧是从IDE项目根目录启动的,因而使用

new FileInputStream("./src/package/Words.txt")
Run Code Online (Sandbox Code Playgroud)

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

但这不是该项目将如何在生产中运行.在生产中,您将使用shell脚本从完全不同的目录启动Tomcat服务器.并且生产服务器根本没有源项目.它将拥有Tomcat,以及构成从项目构建的工件的war文件.

因此根本就没有src目录,文件Words.txt甚至不会出现在文件系统的任何位置.它只会带WAR文件(这实际上是一个zip文件),位于下的项WEB-INF/classes/package与一起.class由编译器从Java源文件生成的文件.

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

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

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

MyClass.class.getResourceAsStream("Words.txt") 
Run Code Online (Sandbox Code Playgroud)

要么

AnyOtherOfYourClassesWhateverThePackageIs.class.getResourceAsStream("/com/foo/Words.txt") 
Run Code Online (Sandbox Code Playgroud)

要么

classLoader.getResourceAsStream("com/foo/Words.txt")
Run Code Online (Sandbox Code Playgroud)