类或文件加载问题

今天在Servlet 中的 init() 方法加载 freemaker 的配置文件时,总是加载不到文件




1.文件的加载有以下几种方式:
1. 用当前类加载  this.getClass().getResource(String url);
2. 用当前类的类加载器加载: this.getClass().getClassLoader().getResource(String url)
3. 用当前线程中的加载器去加载 Thread.currentThread().getContextClassLoader().getResource(String url)
4。在Servlet 下用 getServletContext().getResource(String url)
5.直接 new File进行加载
2下面来说一下这种加载的区别,到哪都是从什么地方加载的
1.this.getClass().getResource(String url) 是以当前类的class 中的加载方法加载的,
这是首先对参数 url 进行分析,如果 url 以 '/' 开始的话,只取 '/' 后面的部分,如果不是以'/' 开始的,则
以当前类的包名为前缀加到 url 的前面,这两部也就取出 url 的绝对路径(以包名加文件名)
第二部,将上面修改过的 url交给当前class的类加载器,然后由类加载器进行加载,既然由类加载器加载,我们就得说说下面的几种加载方式
2.this.getClassLoader().getResource(String url)
类加载器加载文件是以双亲委托模型建立的,也就是先交给其父亲加载器去加载,而父亲加载再加载父亲的父亲,直接到顶层类加载器,也就是 bootrapClassLoader
如果父亲加载不到,则父亲再转给其孩子加载,javase 中的类加载器有三个 appClassLoader,extClassLoader,bootrapClassLoader 

而classLooader 的加载是以当前classLoader的classPath 进行加载的,所以第三种也是同样的道理
3.getContext().getResource(String url) 是以项目的context-path 为基准进行加载的,而context-path 则对应于 webRoot 目录下,因此,
在我们加载webRoot 目录下的文件时,如果我们得到了 String contextpath = getServletContext().getContextPath(),那么 我们只要在
contextPath 下连接 我们webRoot 下的文件或文件夹即可,不要再加webRoot,否则会加载不到

4.直接new File进行加载时,new File("/")则是以 硬盘根开始查找,如 new File("/abc.txt") 则是查找 D:\a.txt

如果以相对路径  new File("abc.txt") 则以项目的根问题开始查找,如果当前项目为 job,则查找文件为 job路径+"/abc.txt"


3.在 eclipse for j2ee 中建项目时,在发布项目后,而不是将项目复制到 tomcat 下,而是在第一次将文件复制到 eclise 工作空间的中的.metadata\.plugins\org.eclipse.wst.server.core\tmp3\wtpwebapps\freemaker目录下
  而且对于文件,只是在第一次发布的时候进制复制,如果在加载webRoot 下的文件或文件夹时,明明存在却加载不到的话,那就去它上面的工作区间去看看有没有这个文件
  肯定会发现在没有的,那是因为对于一个新的文件或文件夹,eclipse 只是在第一次发布的时候进行复制过去,以后每次修改的话,如果上面的工作目录有,会改成修改
  以后的,如果工作目录中没有这个文件,则不会进行复制,只有手动进行复制或将服务器配置进行删除,重新配置一个服务器

 

 

你可能感兴趣的:(类或文件加载问题)