• 读懂Java文件路径的相关问题


    java中文件路径的相关问题

    文章用到的IDEA工程链接为:git,

    本文文章地址

    工程的项目结构如下:

    image-20200503010444684

    1. 基础概念

    1.2 linux和win下的路径分隔符

    Linux下:/

    Window下:

    Java中通用:System.getProperty(“file.separator”);

    1.2 路径分类

    • 绝对路径
    • 相对路径
    • 相对classpath的路径
    • 相对于当前用户目录的路径(JVM的运行路径)

    2. jvm的运行路径

    通常,jvm启动的路径为项目文件夹,比如一个名叫testpath的标准maven项目结构的java项目,jvm在testpath这个文件夹下启动,查看下文 测试代码1。

    默认情况下,java.io 包中的类总是根据当前用户目录来分析相对路径名。
    此目录由系统属性 user.dir 指定,通常是 Java 虚拟机的调用目录。

    关于相对路径:注意点

    • 在使用java.io包中的类时,最好不要使用相对路径。
    • 对于JavaEE服务器,这可能是服务器的某个路径。这个并没有统一的规范!
    • 在J2SE应用程序中可能还算正常,但是到了J2EE程序中,一定会出问题!而且这个路径,在不同的服务器中都是不同的!

    3. 获取资源的路径

    Java中取资源时,经常用到Class.getResource()ClassLoader.getResource()

    在取资源文件时候可能的路径问题:

    3.1 Class.getResource(String path)

    通过类名

    • path 不以’/'开头时,默认是从此类所在的包下取资源;

    • path 以’/'开头时,则是从ClassPath根下获取;

    查看测试代码 4 5

    注意,不同的IDE可能不同,网上资料说eclipse会将项目src文件夹下的文件,经过编译,放置在Testin目录下,如下图中的1.properities 2.properities 3.properities文件

    image-20200503004045093

    但是,我自己的实测,IDEA开发环境,不会在编译后,将 srcmainjava目录下的文件,放置到 targetclasses路径下

    3.2 Class.getClassLoader().getResource(String path)

    通过类的实例

    • path不能以’/'开头时;
    • path是从ClassPath根下获取;

    Class.getClassLoader().getResource(String path)

    从结果来看

    TestMain.class.getResource("/") == t.getClass().getClassLoader().getResource("")

    其他:

    Class.getClassLoader().getResource和Class.getClassLoader().getResourceAsStream在使用时,根据类名和类的实例来确定路径,路径选择上也是一样的。

    4.推荐使用的路径方式

    推荐使用相对于当前classpath的路径,因为此路径不会因为时J2SE 或者 J2EE 而变化或者出错

    供测试的基础代码

    1. 当前运行的jvm路径

    //查看jvm正在运行的当前路径,后续的File类的相对路径都是以这个路径为基础
    System.out.println("当前jvm运行的路径:");
    System.out.println(System.getProperty("user.dir"));
    

    比如,我的一个 maven-hello-pathtestIDEA项目,上述代码运行结果

    当前jvm运行的路径:
    C:IDEA_WorkSpacemaven-hello-pathtest
    

    说明,这个项目的jvm是在maven-hello-pathtest这个文件夹下启动的

    2. 在当前目录创建文件

    .表示当前目录,但是在java中 表示转义,因此,代码中,需要使用个 \ (两个)

    也可以直接给出文件名,则会在当前jvm的路径下创建文件

    //在当前目录创建
    File file1 = new File(".\当前目录创建1.properties");
    file1.createNewFile();
    File file11 = new File("当前目录创建2.properties");
    file11.createNewFile();
    

    3. 在指定文件夹创建文件

    • 指定向下位置目录

    同理,从当前目录开始,可以在项目的指定文件夹下创建文件(下面的代码默认此文件夹已经存在)

    File file2 = new File(".\target\generated-sources\在指定目录创建文件1.properties");
    file2.createNewFile();
    File file22 = new File("target\generated-sources\在指定目录创建文件2.properties");
    file22.createNewFile();
    
    • 上级目录

    4. 获取类所在的包的路径

    System.out.println("当前类所在的包的路径:");
    System.out.println(Main.class.getResource(""));
    

    比如,

    当前类所在的包的路径:
    file:/C:/IDEA_WorkSpace/maven-hello-pathtest/target/classes/com/itranswarp/learnjava/
    

    5. 获取类的ClassPath路径

    也就是,当前类,编译完成后,所处的绝对路径 (classpath: 就是项目中存放.class文件的路径。)

    System.out.println("当前类的ClassPath路径(不同的IDE可能目录结构不同)");
    System.out.println(Main.class.getResource("/"));
    

    运行结果:

    当前类的ClassPath路径(不同的IDE可能目录结构不同)
    file:/C:/IDEA_WorkSpace/maven-hello-pathtest/target/classes/
    

    能实现类似效果的代码:

    Thread.currentThread().getContextClassLoader().getResource("")
    
    FileTest.class.getClassLoader().getResource("")
    
    ClassLoader.getSystemResource("")
    

    6. 通过类的实例,获取路径

    • 查看类名
    System.out.println(t.getClass());
    
    • 获取类的 ClassPath路径(编译后的类的 .class文件的路径)

      (类似于方法5,通过类名事项的)

    System.out.println(t.getClass().getClassLoader().getResource(""));
    

    参考链接

    关于java 路径的一点总结

    https://blog.csdn.net/u011983531/article/details/48443195

    getResourceAsStream的几种路径配置

    深入解析Java绝对路径与相对路径

  • 相关阅读:
    Java基础回顾 —内部类
    JAVA设计模式之观察者模式
    Java基础回顾 —注解
    JAVA设计模式之代理模式
    Java基础回顾 —反射机制
    JAVA设计模式之策略模式
    Java基础回顾 —String常量池
    JAVA设计模式之单例模式
    Java基础回顾 —抽象类、接口、多态
    Git的简单应用
  • 原文地址:https://www.cnblogs.com/tangg/p/12820503.html
Copyright © 2020-2023  润新知