1. 什么是绝对路径? 什么是相对路径?
绝对路径: 也可称完整路径, 是指向文件系统中某个固定位置的路径, 不会因当前的工作目录而产生变化. 为做到这点, 它必须包括根目录.
举例:
test.txt 文件的绝对路径为: D:\documents\develop\test.txt
https://www.oracle.com/index.html 代表了一个 URL 绝对路径
相对路径: 则是以指定的工作目录作为基点, 避开提供完整的绝对路径. 文件名称就可以被视为指定工作目录为基点的一个相对路径(虽然一般不将其称之为路径).
Java 中加载文件时使用的相对路径, 究竟是相对于什么路径呢?
据 java doc 上说明, Java 使用的相对路径, 就是相对于 "当前用户目录", 即 "Java 虚拟机的调用目录", 更白话就是: 我们在哪里调用了 JVM 的路径.
举例:
D 盘根目录下有一 java 源文件 Test.java, 如: D:\Test.java
该 Test.java 文件不含 package 信息, 在命令行窗口编译此文件(执行命令: javac Test.java), 则会在 D 盘自动生成 Test.class 文件.
然后在命令行窗口执行该程序(执行命令: java Test), 此时已启动一个 JVM, 这个 JVM 是在 D 盘根目录下被启动的, 则 JVM 所加载程序中 File 类的相对路径就是相对 D 盘根目录的, 即 D:\
"当前用户目录", 即 Java 虚拟机的调用目录, 也是: D:\
System.getProperty("user.dir")中系统变量 "user.dir" 存放的也是 D:\
说明: 把 Test.class 移动到不同路径下, 执行 java Test 命令启动 JVM, 发现 "当前用户目录" 是不断变化的, 始终和在哪启动 JVM 的路径是一致的.
来自维基百科: zh.wikipedia.org/wiki / 路径_(计算...
2. 路径的分类
3. 路径的区别和操作 API
3.1 Java Class 的相对路径
相对于 classpath 的相对路径
classpath: 就是项目中存放. class 文件的路径.
举例:
Eclipse 项目中 classpath 为: D:\eclipse32\workspace\java-demo\bin, 相对于 classpath 的相对路径, 就是相对于 D:\eclipse32\workspace\java-demo\bin 的相对路径.
(URL 形式表示为: file:/D:/eclipse32/workspace/java-demo/bin/)
IntelliJ IDEA 项目中 classpath 为: D:\ideaProjectDemo\java-demo\target\classes, 相对于 classpath 的相对路径, 就是相对 D:\ideaProjectDemo\java-demo\target\classes 的相对路径.
(URL 形式表示为: file:/D:/ideaProjectDemo/java-demo/target/classes/)
相对于当前用户目录的相对路径
当前用户目录: 即 Java 虚拟机的调用目录, 即 System.getProperty("user.dir")返回的路径.
对于一般项目, 就是项目的根目录, 例如: java-demo 项目的项目根目录为: D:\ideaProjectDemo\java-demo.
对于 JavaEE 服务器, 可能是服务器的某个路径, 这个没有统一的规范, 例如: 在 Tomcat 中运行 web 应用, 那 "当前用户目录" 是:%Tomcat_Home%/bin(即 System.gerProperty("user.dir")输出 %Tomcat_Home%/bin), 即 D:\Program Files\tomcat-5.0.28\bin, 由此可以看出 Tomcat 服务器是在 bin 目录下启动 JVM 的(其实是在 bin 目录下的 "catalina.bat" 文件中启动 JVM 的).
说明:
默认情况下, java.io 包中的类总是根据 "当前用户目录" 来分析相对路径名, 此目录由系统属性 user.dir 指定, 通常是 Java 虚拟机的调用目录.
也就是说: 在使用 java.io 包中的类时, 最好不要使用相对路径.(在 J2EE 程序中会出问题, 这个路径在不同的服务器中都是不同的)
所以, 不要使用相对于 "当前用户目录" 的相对路径.
3.2 Web 应用程序相对路径
服务器端相对地址
服务器端的相对地址指的是相对于你的 Web 应用的地址, 这个地址是在服务器端解析的. 也就是说在 jsp 和 servlet 中的相对地址是相对于你的 Web 应用, 即相对于 http://192.168.0.1/webapp / 的.
举例:
1.servlet 中:
request.getRequestDispatcher("/user/index.jsp"), 这个 "/user/index.jsp" 是相对于当前 Web 应用的 webapp 目录的,
其绝对地址就是: http://192.168.0.1/webapp/user/index.jsp
2.jsp 中:
<%response.sendRedirect("/user/a.jsp");%>
其绝对地址是: http://192.168.0.1/webapp/user/a.jsp
客户端相对地址
所有的 HTML 页面中的相对地址都是相对于服务器根目录 (http://192.168.0.1/) 的, 而不是相对于服务器根目录下 Web 应用目录 (http://192.168.0.1/webapp/) 的.
举例:
HTML 中 form 表单的 action 属性的地址是相对于服务器根目录 (http://192.168.0.1) 的,
所以提交到 index.jsp 为: action="/webapp/user/index.jsp" 或 action="<%=request.getContextPath()%>/user/a.jsp";
说明:
一般情况下, 在 JSP/HTML 页面等引用的 CSS,JavaScript.Action 等属性前面最好都加上<%=request.getContextPath()%>, 以确保所引用的文件都属于 Web 应用中的目录.
注意:
应该尽量避免使用 ".","./","../../" 等类似的相对该文件位置的相对路径, 否则当文件移动时, 很容易出现问题.
"./" 代表当前目录
"../" 代表上级目录
"../../" 代表上级目录的上级目录
来源: https://juejin.im/post/5c6e50c251882562eb50fd42