在开发java程序的过程中,我们经常要获取到资源的路径或者输入流,在java程序中资源的存放位置也是各异的。有的存放在classpath中,有的存放在文件系统中,有的存放在web应用中。而对于不同位置的资源,java程序获取这些资源的方法各有不同。下面让我们来看看常用的获取方式:
- 获取到Path,当前类的绝对路径;
加”\”
Thread.currentThread().getContextClassLoader().getResource("students.xml");
File f = new File(this.getClass().getResource("/").getPath());
System.out.println(f);
结果: C:\Documents%20and%20Settings\Administrator\workspace\projectName\bin
如果不加“/”
File f = new File(this.getClass().getResource("").getPath());
System.out.println(f);
结果:
C:\Documents%20and%20Settings\Administrator\workspace\projectName\bin\com\test
使用相对路径
使用绝对路径,如果tomcat的路径变化了,那么项目代码就要修改.为了改进这种缺点,要使用相对路径,
myeclipse中,在src下的文件,最后放在服务器器下面的webapps\MyServlet\WEB-INF 中1.获得lib目录下的资源
getServletContext().getRealPath("/WEB-INF/lib/students.xml");
2.获得src下的资源==> 获得classes目录下的资源
getServletContext().getRealPath("/WEB-INF/classes/students.xml");
3.获得com.stroe.servlet.servlet_context包下的资源
getServletContext().getRealPath("/WEB-INF/classes/com/stroe/servlet/servlet_context/students.xml");
4.如果获得的是包上面的这种情况,那么太麻烦了.
//使用getClass().getResourceAsStream方法,相对路径分为两种情况
//1: 加"/" ==> 相对的是classes目录
//2: 不加"/" ==> 相对的是本类当前目录
InputStream is = this.getClass().getResourceAsStream("students.xml");
System.out.println(is);
5.使用this.getClass().getClassLoader().getResourceAsStream("");
推荐使用这种:只有一个相对路径 ==> 就是相对于 classes目录
//1.只有一个相对路径 ==> 就是相对于 classes目录
InputStream is2 = this.getClass().getClassLoader().getResourceAsStream("students.xml");
System.out.println(is2);
//注意: 使用类和类加载器加载资源文件时
//1 jvm运行期间只加载一次. 但是使用下面的代码可以解决这个问题.
String path = this.getClass().getClassLoader().getResource("students.xml").getPath();
File file = new File(path.substring(1, path.length()));
System.out.println(path);
//2 getClassLoader()原本是用来加载.class文件的, 所以缓存设计的很小.不要用他加载一些别较大的资源.