• java File AbsolutePath的路径不正确


    前言

    最近做项目,出现一件特别不能理解的事情,文件的实际路径与绝对路径差别很大。其中绝对路径差距很大。当设置user.dir系统变量时,绝对路径就是不对的。

    demo

    模拟奇特路径的demo,可以看到AbsolutePath和文件真实的路径相差太远了

    1. public class FileUtils {
    2. public static void main(String[] args) {
    3. File file = new File(".");
    4. System.out.println(file.getAbsolutePath());
    5. Arrays.stream(file.listFiles()).forEach(p -> System.out.println(p.getAbsolutePath()));
    6. // Arrays.stream(file.listFiles()).forEach(p -> System.out.println(p.getPath()));
    7. // Arrays.stream(file.list()).forEach(System.out::println);
    8. // System.out.println(file.getAbsolutePath());
    9. }
    10. }

    可以看到路径是

     

    但是当VM参数设置-Duser.dir=xxx,

    这里以 -Duser.dir=/Users/huahua为例

    但是目录下根本没有这个文件啊,如果相对路径再复杂一点,直接就出问题了

    1. public class FileUtils {
    2. public static void main(String[] args) {
    3. File file = new File("./go");
    4. System.out.println(file.exists());
    5. System.out.println(file.getAbsolutePath());
    6. Arrays.stream(file.listFiles()).forEach(p -> System.out.println(p.getAbsolutePath()));
    7. // Arrays.stream(file.listFiles()).forEach(p -> System.out.println(p.getPath()));
    8. // Arrays.stream(file.list()).forEach(System.out::println);
    9. // System.out.println(file.getAbsolutePath());
    10. }
    11. }

    得出结果

    那么真实的路径是

     真实路径与没有设置user.dir的情况一样。

     这个为啥影响绝对路径呢,因为很可能因为路径问题导致生产事故。

    原理

     根据上面的实际测试,相对路径是相对当前user.dir而言的,那么绝对路径呢

     userDir

    1. private static final String USER_DIR = initProperty("user.dir");
    2. private static String initProperty(String key) {
    3. String v = System.getProperty(key);
    4. if (v == null) {
    5. throw new InternalError("null property: " + key);
    6. }
    7. return v;
    8. }

    那么真实的user.dir是,不设置VM -Duser.dir参数

     可以看出实际上,user.dir真实为当前的根路径,设置-Duser.dir并不会影响实际的文件路径,但是AbsolutePath就会不一致

    那么使用绝对路径new File呢

    1. public String resolve(File f) {
    2. if (isAbsolute(f)) return f.getPath();
    3. SecurityManager sm = System.getSecurityManager();
    4. if (sm != null) {
    5. sm.checkPropertyAccess("user.dir");
    6. }
    7. return resolve(userDir, f.getPath());
    8. }

    if (isAbsolute(f)) return f.getPath();

    如果是绝对路径不再拼接,所以绝对路径是绝对准确的,相对路径就会出问题。

    总结

    不知道为什么File的AbsolutePath要取系统变量,而实际文件的地址却是另外的地址,这很容易导致文件路径不对,导致读取不到。关键在于读取绝对路径使用user.dir但是文件的真实路径与绝对路径不对应。

  • 相关阅读:
    Elasticsearch 相关问题总结
    opencv dnn模块 示例(19) 目标检测 object_detection 之 yolox
    Python 练习题讲解
    第二十一章 数据库连接池,过滤器
    RocketMQ源码阅读(九)DefaultMQProducer消息发送
    新闻稿写作结构有哪些类型?新闻稿写作要点是什么?
    LeetCode: 数组峰值与谷值问题总结 - Python
    三、性能分析工具的使用
    [LeetCode308周赛] [前缀和] [栈] [拓扑排序]
    Vue学习:webpack-dev-server和nginx问答
  • 原文地址:https://blog.csdn.net/fenglllle/article/details/125881069