JavaWeb中读取文件资源的路径问题

来源:互联网 发布:form表单转json 编辑:程序博客网 时间:2024/06/07 20:28

一. java中使用的两种路径:绝对路径和相对路径
绝对路径:文件在硬盘中存放的实际路径
相对路径:在javaweb中是相对于整个web应用在硬盘上的路径来说的。例如:在Servlet中,”/”代表Web应用的根目录。

为了更好的维护项目,即使你的web应用换了服务器环境,只要你的文件在web应用中的相对路径不变,都能动态的获取文件在当前服务器环境的绝对文件路径。所以在编程时,只要想清楚所操作的文件是相对于什么路径下的,写出其相对路径就可以得到其绝对路径。

二. web应用中普通java类获取文件路径
方法1:ClassLoader.getResource(String path)
path为相对ClassPath的路径,从ClassPath根下获取,不能以“/”开头。

对于ClassPath:
WEB-INF/classes目录存放src目录java文件编译之后的class文件以及xml、properties等资源配置文件;
src不是classpath, WEB-INF/classes,lib才是classpath,因为类加载器是从这个目录下找.class文件来加载的。

方法2:Class.getResource(String path)
path不以”/”开头时,相对此类所在包的路径;
path以”/”开头时,则是从ClassPath根下获取
Class.getResource(“/”) == ClassLoader().getResource(“”)

package test;public class Test {    public static void main(String[] args) {        //获取Test类所在包路径        //输出../WebRoot/WEB-INF/classes/test/        System.out.println(Test.class.getResource("").getPath());        //获取ClassPath的路径        //输出../WebRoot/WEB-INF/classes/        System.out.println(Test.class.getClassLoader().getResource("").getPath());        System.out.println(Test.class.getResource("/").getPath());        //获取ClassPath根下的src.xml文件        //输出../WebRoot/WEB-INF/classes/src.xml        System.out.println(Test.class.getClassLoader().getResource("src.xml").getPath());        System.out.println(Test.class.getResource("/src.xml").getPath());               //通过当前线程获取ClassLoader,推荐!!! System.out.println(Thread.currentThread().getContextClassLoader().getResource("src.xml").getPath());        //获取ClassPath根下test包中的package.xml        //输出../WebRoot/WEB-INF/classes/test/package.xml        System.out.println(Test.class.getClassLoader().getResource("test/package.xml").getPath());        System.out.println(Test.class.getResource("package.xml").getPath());    }}

三. web应用中servlet获取文件路径

ServletContext().getRealPath(String path);
path是相对于web应用的相对路径,而web应用都是发布到tomcat的webapps下面执行的,所以得到 webapps/projectName/path

ServletContext对象获得几种方式:
javax.servlet.http.HttpSession.getServletContext();
javax.servlet.jsp.PageContext.getServletContext();
javax.servlet.ServletConfig.getServletContext();

package test;import java.io.File;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;@WebServlet("/ServletPath")public class ServletPath extends HttpServlet {    private static final long serialVersionUID = 1L;    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        System.out.println(request.getContextPath());        System.out.println(request.getRequestURI());        //获得当前web应用的绝对路径,即web应用发布到tomcat后的硬盘路径        //输出../webapps/pathTest/        System.out.println(this.getServletContext().getRealPath(""));        System.out.println(this.getServletContext().getRealPath("/"));        //获得project下文件的绝对路径        //输出../webapps/pathTest/project.xml        System.out.println(this.getServletContext().getRealPath("project.xml"));        System.out.println(this.getServletContext().getRealPath("/project.xml"));        //获得WebRoot目录下文件的绝对路径,因为WebRoot目录相当于工程目录        //输出../webapps/pathTest/webroot.xml        System.out.println(this.getServletContext().getRealPath("webroot.xml"));        //获得WEB-INF目录下文件的绝对路径        //输出../webapps/pathTest/WEB-INF/webinf.xml        System.out.println(this.getServletContext().getRealPath("WEB-INF/webinf.xml"));    }}
原创粉丝点击