[Java SE] Java-文件系统-常用文件路径的获取方法
1 获取相对路径
/**
* 获取相对路径 【推荐】
* 使用Java提供的Path类和Paths类来获取相对路径。
* 例如,假设有两个路径a和b,我们可以使用Path类的relativize()方法来获取相对路径,该方法返回一个相对路径的Path对象。
*/
@Test
public void getRelativePathTest1(){
Path pathA = Paths.get("/user/myproject/dir1");//不需要保证文件实际存在
Path pathB = Paths.get("/user/myproject/dir2/subdir/file.txt");//不需要保证文件实际存在
Path relativePathB = pathA.relativize(pathB);//[√]
log.info("relativePathB : {}", relativePathB);// "relativePathB : ..\dir2\subdir\file.txt"
Path relativePathA = pathB.relativize(pathA);
log.info("relativePathA : {}", relativePathA);// "relativePathA : ..\..\..\dir1"
}
/**
* 获取相对路径 【推荐】
*/
@Test
public void getRelativePathTest2() throws IOException {
File fileA = new File("/user/myproject/dir1");//不需要保证文件实际存在
File fileB = new File("/user/myproject/dir2/subdir/file.txt");//不需要保证文件实际存在
String absolutePathA = fileA.getCanonicalPath();//E:\\user\\myproject\\dir1
String absolutePathB = fileB.getCanonicalPath();//E:\\user\\myproject\\dir2\\subdir\\file.txt
String relativePath = absolutePathB.substring(absolutePathA.length()); // 输出:/dir2/subdir/file.txt
log.info("absolutePathA : {}, absolutePathB : {}", absolutePathA, absolutePathB);//absolutePathA : E:\\user\\myproject\\dir1, absolutePathB : E:\\user\\myproject\\dir2\\subdir\\file.txt
log.info("relativePath : {}", relativePath);//relativePath : \\subdir\\file.txt
}
/**
* 获取相对路径
* 如果是在Web应用中获取相对路径,可以使用ServletContext的getRealPath()方法来获取文件的绝对路径,然后使用字符串的截取来获取相对路径。
*/
// @Test
// public void getRelativePathTest3(){
// ServletContext servletContext = null;
// String absolutePathA = servletContext.getRealPath("/dir1");
// String absolutePathB = servletContext.getRealPath("/dir2/subdir/file.txt");
// String relativePath = absolutePathB.substring(absolutePathA.length()); // 输出:/dir2/subdir/file.txt
// }
2 获得绝对路径
基于相对路径获得绝对路径
@Test
public void getAbsolutePathByRelativePathTest(){
// 相对路径
String relativePath = "example.txt";
// 获取绝对路径
String absolutePath = null;
//方式1
//absolutePath = ( new File(relativePath) ).getAbsolutePath( );//E:\source_code\ADP\poc-bigdata\poc-common-demo\example.txt
//方式2
//absolutePath = ( (Path) Paths.get(relativePath)).toAbsolutePath().toString();//E:\source_code\ADP\poc-bigdata\poc-common-demo\example.txt
/**
* 方式3 【推荐】
* ClassLoader 提供的 getResource()方法可以获取资源文件的URL。通过 URL 对象的 getPath 方法可以获取文件的绝对路径
*/
//absolutePath = getAbsolutePath(ClassLoader.getSystemClassLoader(), relativePath);
//方式4 【推荐】 基于基础参考路径、相对路径,拼接出文件的绝对路径
String classpath = ClassLoader.getSystemResource("").getPath();//如: /E:/source_code/xxx/xxx-bigdata/xxx-common-demo/target/classes/
absolutePath = getAbsolutePath( classpath, relativePath );
//方式5 通过 javax.servlet.ServletContext#getRealPath(relativePath) 方法
//ServletContext servletContext = null;//获取 servletContext 对象,此处省略获取过程
//absolutePath = servletContext.getRealPath(relativePath);
// 输出绝对路径
System.out.println("absolutePath: " + absolutePath);
}
/**
* 通过 classloader 、相对路径,获得绝对路径
* @param relativePath
* @param classLoader
* [1] 获取ClassLoader的方式
* ClassLoader classLoader = ClassLoader.getSystemClassLoader();
* ClassLoader classLoader = Thread.currentThread().getContextClassLoader() * ClassLoader classLoader = XXClass.class.getClassLoader(); * @return */public String getAbsolutePath(ClassLoader classLoader, String relativePath){
String absolutePath = null;
URL resource = classLoader.getResource(relativePath);// ClassLoader.getSystemResource(relativePath);
if(resource != null){
absolutePath = resource.getPath();
} else{
log.warn("the relative path's resource not for classpath!relativePath:{}", relativePath);
}
return absolutePath;
}
/**
* 通过 基础参考路径 、相对路径,获得绝对路径
* @param relativePath 注:路径的首个字符不得含有文件夹符号
* @param basePath 注: 路径的最后必须含文件夹符号 [ "/"(Linux) , "\"(Windows) ]
* @return */public String getAbsolutePath(String basePath, String relativePath) {
//File.separator
return basePath + relativePath;
}
3 获取 classpath 路径
public class ClassPathDemo {
public static void main(String[] args) {
String classpath = null;
//方式1
classpath = System.getProperty("java.class.path");//classpath:D:\Program\Java\jdk1.8.0_261\jre\lib\charsets.jar;D:\Program\Java\jdk1.8.0_261\jre\lib\deploy.jar;D:\Program\Java\jdk1.8.0_261\jre\lib\ext\access-bridge-64.jar;D:\Program\Java\jdk1.8.0_261\jre\lib\ext\cldrdata.jar;D:\Program\Java\jdk1.8.0_261\jre\lib\ext\dnsns.jar;D:\Program\Java\jdk1.8.0_261\jre\lib\ext\jaccess.jar;D:\Program\Java\jdk1.8.0_261\jre\lib\ext\jfxrt.jar;D:\Program\Java\jdk1.8.0_261\jre\lib\ext\localedata.jar;D:\Program\Java\jdk1.8.0_261\jre\lib\ext\nashorn.jar;D:\Program\Java\jdk1.8.0_261\jre\lib\ext\sunec.jar;D:\Program\Java\jdk1.8.0_261\jre\lib\ext\sunjce_provider.jar;D:\Program\Java\jdk1.8.0_261\jre\lib\ext\sunmscapi.jar;D:\Program\Java\jdk1.8.0_261\jre\lib\ext\sunpkcs11.jar;D:\Program\Java\jdk1.8.0_261\jre\lib\ext\zipfs.jar;D:\Program\Java\jdk1.8.0_261\jre\lib\javaws.jar;D:\Program\Java\jdk1.8.0_261\jre\lib\jce.jar;D:\Program\Java\jdk1.8.0_261\jre\lib\jfr.jar;D:\Program\Java\jdk1.8.0_261\jre\lib\jfxswt.jar;D:\Program\Java\jdk1.8.0_261\jre\lib\jsse.jar;D:\Program\Java\jdk1.8.0_261\jre\lib\management-agent.jar;D:\Program\Java\jdk1.8.0_261\jre\lib\plugin.jar;D:\Program\Java\jdk1.8.0_261\jre\lib\resources.jar;D:\Program\Java\jdk1.8.0_261\jre\lib\rt.jar;E:\source_code\xxx\xxx-bigdata\xxx-common-demo\target\classes;D:\Program\IDEA\IDEA_COMMUNITY_2023.2\lib\idea_rt.jar
//方式2
//String classpath = ClassPathDemo.class.getResource("/").getPath();//out : 同方式1
//方式3 【推荐】
//classpath = ClassLoader.getSystemResource("").getPath();//classpath:/E:/source_code/xxx/xxx-bigdata/xxx-common-demo/target/classes/
//方式4 | 仅适用于 servlet web 项目
//ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext();
//classpath = context.getResource("").getFile().getAbsolutePath();
System.out.println("classpath:" + classpath);
}
}
4 获取当前工程根路径
- 在Java程序中,可以通过
System.getProperty("user.dir")来获取当前工作目录的路径,即程序运行时所在的目录。这个属性通常用于读取或写入文件时指定文件相对路径,以便程序能够正确找到文件。 - 举例说明,如果当前工作目录是/Users/username/Documents,那么System.getProperty("user.dir")将返回/Users/username/Documents。
//获取当前工作目录的路径
//String projectRootPath = ( new File("") ).getCanonicalPath();//方式1
String projectRootPath = System.getProperty("user.dir");//方式2
System.out.println("projectRootPath :" + projectRootPath);//E:\source_code\xxx\xxx-yy
5 获取用户主目录
String userHomePath = null;
userHomePath = org.apache.commons.io.FileUtils.getUserDirectoryPath();// 等效于 : System.getProperty("user.home");System.out.println("userHomePath :" + userHomePath);//C:\Users\xxxx
6 获取OS临时目录
String tempDirectoryPath = FileUtils.getTempDirectoryPath();//等效于 : System.getProperty("java.io.tmpdir")System.out.println("tempDirectoryPath :" + tempDirectoryPath);// C:\\Users\\xxxx\\AppData\\Local\\Temp\\
X 参考文献
- java通过文件的相对路径怎么获取绝对路径 - 51CTO
- 【JAVA】获取当前项目的classpath路径 - CSDN
- [Java SE] 基础工具库 : Apache Commons IO - 博客园
- Java 获取路径的方法归总 - CSDN
[Java SE] Java-文件系统-常用文件路径的获取方法的更多相关文章
- Windows文件路径转换为java中可识别的文件路径的转义方法,(另附转义多种格式)
ps:欢迎加qq好友:2318645572,交流学习 一:路径转化 Windows中的文件路径格式为 D:\eclipse\apache-tomcat-7.0.67\wtpwebapps\... Ja ...
- 牛客网Java刷题知识点之File对象常用功能:获取文件名称、获取文件路径、获取文件大小、获取文件修改时间、创建与删除、判断、重命名、查看系统根目录、容量获取、获取某个目录下内容、过滤器
不多说,直接上干货! 获取文件名称.获取文件路径.获取文件大小.获取文件修改时间 FileMethodDemo.java package zhouls.bigdata.DataFeatureSelec ...
- Java SE 基础:常用关键字
Java SE 基础:常用关键字 常用关键字表
- JAVA中比较两个文件夹不同的方法
JAVA中比较两个文件夹不同的方法,可以通过两步来完成,首先遍历获取到文件夹下的所有文件夹和文件,再通过文件路径和文件的MD5值来判断文件的异同.具体例子如下: public class TestFo ...
- iOS文件路径相关的方法
文件路径相关的方法在NSPathUtilities中,主要是操作路径 获得一个路径 NSString *documents = [NSSearchPathForDirectoriesInDomains ...
- Hosts文件路径及修改方法
(转自:http://www.techolics.com/softdev/20111029_100.html) 什么是Hosts文件? 根据百度百科的定义,Hosts文件是一个系统文件,这是一个本地的 ...
- Eclipse将引用了第三方jar包的Java项目打包成jar文件的两种方法
方案一:用Eclipse自带的Export功能 步骤1:准备主清单文件 “MANIFEST.MF”, 由于是打包引用了第三方jar包的Java项目,故需要自定义配置文件MANIFEST.MF,在该项目 ...
- Java中几种常用数据类型之间转换的方法
Java中几种常用的数据类型之间转换方法: 1. short-->int 转换 exp: short shortvar=0; int intvar=0; shortvar= (short) in ...
- 将引用了第三方jar包的Java项目打包成jar文件的两种方法
方案一:用Eclipse自带的Export功能 步骤1:准备主清单文件 “MANIFEST.MF”, 由于是打包引用了第三方jar包的Java项目,故需要自定义配置文件MANIFEST.MF,在该项目 ...
- 将Java代码打包成jar文件转换为.exe可执行程序方法
做完学生管理系统后我想将代码打包成一个可执行程序,那样就可以直接点击在Windows下运行了,下面就跟大家分享下打包方法. 将Java的代码转换成 .exe 文件需要先把代码打包成 jar 文件然 ...
随机推荐
- 网络拓扑—DNS服务搭建
目录 DNS服务搭建 网络拓扑 配置网络 DNS PC 安装DNS服务 配置DNS服务 创建正向查找区域 创建反向查找区域 创建子域名 PC机DNS域名解析 DNS服务搭建 网络拓扑 为了节省我的U盘 ...
- Vue cli之项目执行流程
整个项目是一个主文件index.html,index.html中会引入src文件夹中的main.js,main.js中会导入顶级单文件组件App.vue,App.vue中会通过组件嵌套或者路由来引用其 ...
- 005. gitlab安装
1. gitlab介绍 官方网站: www.gitlab.com gitlab是一款使用ruby编写的代码版本管理系统,他可以通过web界面来管理代码. 2. gitlab安装 官方安装文档: htt ...
- c++ Primer Plus 第六版学习记录
立个flag,一天看20页,一个半月看完!!! 第一章 预备知识 高效简洁.面向对象.泛型编程 汇编不具有通用性,换一个处理器可能就要重新写一套! 编译器(是一个程序)负责解决这个问题,把一份高级语言 ...
- 面试必会->Redis篇
01- 你们项目中哪里用到了Redis ? 在我们的项目中很多地方都用到了Redis , Redis在我们的项目中主要有三个作用 : 使用Redis做热点数据缓存/接口数据缓存 使用Redis存储一些 ...
- docker inspect 格式化输出
docker inspect 例子 [root@hmm ~]# docker run -tid --name YUN-teSt ubuntu 337170fc3109a824273a7f04dd5c5 ...
- ajax传参
// ajax传参 // ajax传参特点: // 1,不需要跳转 // 2,ajax传参,都是异步程序 // ...
- vue局部注册
只能在当前注册它的vue实例中使用,通过某个 Vue 实例/组件的实例选项 components 注册仅在其作用域中可用的组件 var Child = { template: '<div> ...
- Nodejs静态资源管理 路由
express提供了一个非常好用的方法,叫做 express.static(),通过此方法,可以非常方便地创建一个静态web资源服务器 app.use(express.static('public') ...
- Scrapy框架(六)--图片数据抓取
基于文件下载的管道类 在scrapy中我们之前爬取的都是基于字符串类型的数据,那么要是基于图片数据的爬取,那又该如何呢? 其实在scrapy中已经为我们封装好了一个专门基于图片请求和持久化存储的管道类 ...