[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 文件然 ...
随机推荐
- Splashtop :符合 HIPAA 标准的远程桌面软件
如果您正在寻找可帮助您保持 HIPAA 遵从性的远程桌面软件,那么 Splashtop 就是您的最佳选择. 如果您的公司属于美国医疗保健行业,则您知道您必须遵守有关敏感和私人患者信息的联邦 HIPAA ...
- Git命令拾掇
修改commit信息 git commit --amend -m 'The new message' 使用ssh替换https:// 设置某个仓库 git remote set-url origin ...
- IDEA的Ctrl+Enter补全代码失效
前景提示 IDEA有个ctrl+enter可以补全代码的功能,但是,今天突然失效了,原来是这个问题. 修改配置 进入setting修改 进入Edit-->找到Intertions,搜素Intro ...
- 13-flask博客项目之restful api详解1-概念
一 传统的开发模式 前后端分类概念 前端只需要独立编写客户端代码,后端也只需要独立编写服务端代码提供数据接口即可前端通过AJAX请求来访问后端的数据接口,将Model展示到View中即可 前后端开发者 ...
- 基于Python实现MapReduce
一.什么是MapReduce 首先,将这个单词分解为Map.Reduce. Map阶段:在这个阶段,输入数据集被分割成小块,并由多个Map任务处理.每个Map任务将输入数据映射为一系列(key, va ...
- 微信小程序校园跑腿系统怎么做,如何做,要做多久
在这个互联网快速发展.信息爆炸的时代,人人都离不开手机,每个人都忙于各种各样的事情,大学生也一样,有忙于学习,忙于考研,忙着赚学分,忙于参加社团,当然也有忙于打游戏的(还很多),但生活中的一些琐事 ...
- linux下srpm源码包的使用和安装
目录 一.关于srpm包 二.srpm包和rpm包的区别 三.不对srpm包做修改,直接安装srpm包 四.对srpm包的源码进行修改,然后安装srpm包 一.关于srpm包 SRPM包是Sour ...
- C# fastreport 实现各个报表指定各自的默认打印机
1.业务需求 工作室有多个报表需要打印,如果在报表模板里设置默认打印机的话,每个人电脑上安装的打印机是不相同的,所以就需要设定各自的默认打印机实现打印功能. 2.xml模板设计(PrinterSett ...
- 论elasticsearch在Windows环境的安装
前置需求 一台电脑(我用的是Windows),有网 第一步:下载并安装 去java官网下载开发版java(考虑到可能有小白,我暂且这么说) java官网下载链接:https://www.oracle. ...
- nginx对称加密算法和非对称加密算法nginx证书配置
对称加密算法 对称加密性能更好 对称加密: 客户端和服务器之间的通信数据是通过对称加密算法进行加密,对称加密是在加密和解密的过程中使用同一个私钥进行加密和解密,而且加密算法是公开的,所以对称加密中的私 ...