这个博客源于我遇到的bug
bug描述:大家都知道相对路径和绝对路径的含义,但是大家有没有想到web工程和非web工程的相对路径和绝对路径呢?
这就是我要在这篇博客中主要说明的。
需求:在web项目中获取到指定文件夹中的文件名称
在idea上的目录:src/main/resources/base/esXml/的目录下有 很多xml文件,要获取该目录条件下 所有xml文件的文件名称
1. 非web项目(包括web项目上的junit测试):下面是获取指定目录下文件名的代码
public static ListgetFile(String path) { File file = new File(path); File[] array = file.listFiles(); List list = new ArrayList<>(); for (int i = 0; i < array.length; i++) { if (array[i].isFile()) { list.add(array[i].getName()); } } return list; }
path:src/main/resources/base/esXml/
结果:
1.xml
2.xml
......
而上面的path就是相对路径(相对于当前项目为根目录,前面没有“/”)
当然我们也可以使用绝对路径path:users/IdeaProject/项目名称/src/main/resources/base/esXml/
2. 如果是web项目的,大家就要小心了,无论是相对路径还是绝对路径
原因:当我们用Tomcat启动项目的时候,是将工程重新编译的放到Tomcat中执行的,随之的目录结构也会发生变化
没有用Tomcat启动项目的目录:users/IdeaProject/项目名称/src/main/resources/base/esXml/
使用Tomcat启动项目的目录:/Users/zhangruibiao/install/apache-tomcat-8.5.9/webapps/ROOT/WEB-INF/classes
是放到tomcat目录下执行的,所有原来的相对路径和绝对路径都会是错的了
上图是工程重新编译并在tomcat下执行的目录结构,而要获取esXml文件夹下的xml文件的目录:
/Users/zhangruibiao/install/apache-tomcat-8.5.9/webapps/ROOT/WEB-INF/classes/esXml/
相比于非web项目的目录:users/IdeaProject/项目名称/src/main/resources/base/esXml/
有很大不同,这时在项目上我们要获取的目录应该是第一个,下面是获取该路径的代码
public String getPath(){ String pathWebroot = this.getClass().getResource("/").toString(); pathWebroot = pathWebroot + "esXml/"; LOG.info(pathWebroot); String path = pathWebroot.substring(5); LOG.info(path); return path; }
代码解释:大家应该很好奇为什么会有红色的代码,那是做什么的呢?
看了该代码的两个LOG日志打印,相信就会明白了
file:/Users/zhangruibiao/install/apache-tomcat-8.5.9/webapps/ROOT/WEB-INF/classes/esXml/