[Java SE] Java-文件系统-常用文件路径的获取方法

news/2024/11/18 19:47:58/文章来源:https://www.cnblogs.com/johnnyzen/p/18292387

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\\dir1String absolutePathB = fileB.getCanonicalPath();//E:\\user\\myproject\\dir2\\subdir\\file.txtString relativePath = absolutePathB.substring(absolutePathA.length()); // 输出:/dir2/subdir/file.txtlog.info("absolutePathA : {}, absolutePathB : {}", absolutePathA, absolutePathB);//absolutePathA : E:\\user\\myproject\\dir1, absolutePathB : E:\\user\\myproject\\dir2\\subdir\\file.txtlog.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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/741237.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CH582 CH592 CH573 BLE central主机获取handle值

GATT_DiscCharsByUUID和GATT_ReadUsingCharUUID 差异

[深入理解Java虚拟机]Java内存模型

Java内存模型 概述 多任务处理在现代计算机操作系统中几乎已是一项必备的功能了。在许多场景下,让计算机同时去做几件事情,不仅是因为计算机的运算能力强大了,还有一个很重要的原因是计算机的运算速度与它的存储和通信子系统的速度差距太大,大量的时间都花费在磁盘I/O、网络…

深入理解 DB-GPT

DB-GPT 项目介绍 DB-GPT是一个开源的AI原生数据应用开发框架(AI Native Data App Development framework with AWEL(Agentic Workflow Expression Language) and Agents)。目的是构建大模型领域的基础设施,通过开发多模型管理(SMMF)、Text2SQL效果优化、RAG框架以及优化、Mult…

2024年国内最经典好用的5款项目管理软件工具助你一路长虹

目前市场上的项目管理软件众多,但是它们也都有一些共同的功能及特点。比如任务和进度管理、资源分配、财务监控、风险评估、协作增强以及报告和洞察力等。这些功能不仅提供了强大的工具来确保项目的高效执行和按时交付,而且还为团队成员和管理者提供了实时的数据和信息,帮助…

「代码随想录算法训练营」第六天 | 哈希表 part2

454. 四数相加 II题目链接:https://leetcode.cn/problems/4sum-ii/ 题目难度:中等 文章讲解:https://programmercarl.com/0454.四数相加II.html 视频讲解: https://www.bilibili.com/video/BV1Md4y1Q7Yh 题目状态:没思路思路:创建一个unordered_map<int, int>类型的…

C#和VB.NET连接Access

一、直接通过软件连接Access表 1:新建一个windowsForm工程。2:打开"检视\伺服器总管\资料连接"后,右击"资料连接"后打开"连接资料连接",选择正确的资料来源与资料库档名,若有密码请输入正确的密码,如无,则不输入。3:点击"测试连接&qu…

一对一关联

一对一关系实际上是通过建立双向关系的一对多关系的基础上转化而来。比如:一个用户对应一张身份证,一张身份证属于一个用户。 class IdCard(Base): """省份证的模型类, 它和员工之间是一对一的关联关系""" __tablename__ = t_id_card id: Map…

CSS minification error: Lexical error on line 1:Unrecognized text

删除node_modules 重新安装,如果还不行,就复制一份别的能用的

【goreplay】python简单使用goreplay中间件功能

一、场景流量录制,需要对播放的流量进程定制化处理,那么可以使用中间件来实现二、官网 https://pypi.org/project/gor/三、编写中间件代码# coding: utf-8 import sys from gor.middleware import AsyncioGordef on_request(proxy, msg, **kwargs):proxy.on(response, on_res…

一对多和多对一关联

比如:作者和文章之间, 部门和员工之间都是一对多的关联关系。反过来就是:多对一的关联关系 1、定义外键约束 定义关系的第一步是创建外键。外键是(foreign key)用来在 A 表存储 B 表的主键值以便和 B 表建立联系的关系字段。因为外键只能存储单一数据(标量),所以外键总…

树莓派4B-用串口读取JY901S陀螺仪数据

陀螺仪是一种用来感测与维持方向的装置,基于角动量的理论设计出来的。陀螺仪主要是由一个位于轴心可以旋转的轮子构成,陀螺仪一旦开始旋转,由于轮子的「角动量」,陀螺仪有抗拒方向改变的趋向。陀螺仪多用于导航、定位等系统JY901S是9轴姿态角度传感器,支持串口和 IIC 两种…