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

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

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

目前,您在开发人员工作站上,可能正在从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")