在web开发中, 如果要在程序中获取web应用的资源文件, 需要写一个路径时:
(1) 如果写一个相对路径 File file = new File("conf.properties"); 这时会到程序启动的目录下去寻找这个资源, 对于web应用来说, web应用是在容器中运行的, 这时候就会到tomcat/bin目录下去找这个文件, 找不到!!
(2) 如果写一个绝对路径, 则会到程序启动目录的硬盘根目录去找这个资源文件, 也找不到!!
(3) 写一个盘符开始的硬盘路径, 可以解决这个问题, 但是这种写法一旦换一个发布环境, 路径很可能是错误的. 这种写法也不可取!!
可以通过ServletContext提供的方法来解决这个路径问题:
sc.getRealPath("xxx"); 传入一个相对于web应用根目录的资源文件的路径, 这个方法会在传入的路径的前面动态的拼接上当前web应用根目录的硬盘路径, 从而拼接出当前资源文件的硬盘路径, 由于web应用的根目录的硬盘路径是动态获取的. 没有写死, 即使换一个发布环境, 也能获取到正确的路径
WEB应用在开发和部署时使用的是不同的路径,开发是在workspace里面,部署是在WEB服务器上,在开发时很可能不知道未来应用部署的绝对路径.在读取一些资源时,需要指定该资源的绝对路径,就需要通过方法来动态获取当前应用所在的绝对路径.解决方案就是通过调用ServletContext对象的getRealPath(path)方法,其中path指定的是相对于Web应用的路径,该方法会返回该资源的绝对路径.
当没有ServletContext对象可以使用时, 可以通过类加载器来加载资源, 类加载器提供了方法来加载资源, 但是要求传入的文件路径必须是相对于类加载器加载类的路径:
getResource(xxx)
getResourceAsStream(xxx)