首页 > 编程语言 >[Java SE] Java-文件系统-常用文件路径的获取方法

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

时间:2024-07-09 17:31:52浏览次数:14  
标签:jdk1.8 Java lib jar 文件系统 261 Program SE

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 参考文献

标签:jdk1.8,Java,lib,jar,文件系统,261,Program,SE
From: https://www.cnblogs.com/johnnyzen/p/18292387

相关文章

  • JAVA-二维数组-要求计算出每个季度的总营业额和全年的总营业额-求指导
            二维数组的练习某商城每个季度的营业额如下:单位(万元)第一季度:22,66,44第二季度:77,33,88第三季度:25,45,65第四季度:11,66,99要求计算出每个季度的总营业额和全年的总营业额package_exercis;publicclassTwoArray{publicstaticvoidmain(S......
  • ASP.Net Core解读launchSettings.json
    一、环境目标框架:.NETCore3.1ASP.NETCore是一个全新的Web开发平台,微软在它上面构建了MVC、SingalR、GRPC、Orleans这样广泛使用的Web框架,我们先以MVC框架为例介绍利用ASP.NETCore构建项目的常见名词。这篇文章介绍启动配置文件launchSettings.json ASP.NET Core MVC项目......
  • [深入理解Java虚拟机]Java内存模型
    Java内存模型概述多任务处理在现代计算机操作系统中几乎已是一项必备的功能了。在许多场景下,让计算机同时去做几件事情,不仅是因为计算机的运算能力强大了,还有一个很重要的原因是计算机的运算速度与它的存储和通信子系统的速度差距太大,大量的时间都花费在磁盘I/O、网络通信或者数......
  • Javase-3.运算符
    3.运算符1.算术运算符1.基本运算符:加减乘除模(+-*/%)inta=2;intb=1;System.out.println(a+b);//3System.out.println(a-b);//1System.out.println(a*b);//2System.out.println(b/a);//0int/int结果还是int类型,而且会向下取整System.out.print......
  • 【PHP】关于fastadmin框架中使用with进行连表查询时setEagerlyType字段的理解
    前言FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一款开源且免费商用的后台开发框架,它基于ThinkPHP和Bootstrap两大主流技术构建的极速后台开发框架,它有着非常完善且强大的功能和便捷的开发体验,使我逐渐喜欢上了它。什么是setEagerlyType?1.回归正题,什么是setEagerl......
  • Java泛型的定义与运用
    泛型泛型的作用从使用层面上来说是统一数据类型,防止将来的数据转换异常。从定义层面上来说,定义带泛型的类,方法等,将来使用的时候给泛型确定什么类型,泛型就会变成什么类型,凡是涉及到泛型的都会变成确定的类型,代码更灵活。不使用泛型,少了限制,则在集合添加数据就不会类型异常......
  • 简单的Java面向对象小游戏并使用三层架构(表示层、业务逻辑层、数据访问层)
    本人详解作者:王文峰,参加过CSDN2020年度博客之星,《Java王大师王天师》公众号:JAVA开发王大师,专注于天道酬勤的Java开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯山峯转载说明:务必注明来源(注明:作者:王文峰哦)简单的Java面......
  • Java Executors类的9种创建线程池的方法及应用场景分析
    在Java中,Executors类提供了多种静态工厂方法来创建不同类型的线程池。在学习线程池的过程中,一定避不开Executors类,掌握这个类的使用、原理、使用场景,对于实际项目开发时,运用自如,以下是一些常用的方法,V哥来一一细说:newCachedThreadPool():创建一个可缓存的线程池,如果线程池中......
  • Java 中的泛型 集合(List,Set) Map
    泛型集合(List,Set)Map泛型泛型的本质是参数化类型,即允许在编译时对集合进行类型检查,从而避免安全问题,提高代码的复用性泛型的具体定义与作用定义:泛型是一种在编译阶段进行类型检查的机制,它允许在类,方法,接口后通过<>来声明类型参数.这些参数在编译时会被具体的类......
  • Java token穷举id造假 jwt token伪造
    一、JWT简介1、简介JSONWebToken(JSONWeb令牌)是一个开放标准(rfc7519),它定义了一种紧凑的、自包含的方式,用于在各方之间以JSON对象安全地传输信息。通过JSON形式作为Web应用中的令牌,用于在各方之间安全地将信息作为JSON对象传输。在数据传输过程中还可以完成数据 加密、签名......