通过线程的一个方法获取IDEA 文件的绝对路径

1.绝对路径:以前想用输入流读取如下图的ideaProject目录下的这个文件时,
7e65b12626.png)
就会这样写:
FileReader fr=new FileReader("javavode/classinfo3.properties");

但其实这种路径是相对路径,缺点就是:移植性差,因为在IDEA中文件默认的当前路径是project的根。这个代码离开了IDEA,换到了其它位置,可能当前路径就不是project的根了,这时这个路径就无效了

2.所以这个时候,就要用绝对路径,更保险安全,以下这种方式就是比较一种通用的获取绝对路径的方式(以获取以下文件的绝对路径为例):
在这里插入图片描述

public class AboutPath {
    public static void main(String[] args){
        String path=Thread.currentThread().getContextClassLoader().getResource("classinfo.properties").getPath();
        //起点是从类的根路径下开始加载,就连src的子目录都不行!
        System.out.println(path);
    }
}

输出结果:/D:/ideaProjects/out/production/javacode/classinfo.properties

对那一长串代码的解释:

  • Thread.currentThread() :当前线程对象
  • getContextCLassLoader() :是线程对象的方法,可以获取到当前线程的类加载器对象
  • getResource():这是类加载器对象的方法,当前线程的类加载器默认从类的根路下加载资源(获取资源)
  • 使用以上通用方式的前提是:这个文件必须在类路下,也就是说要在src 下(src是类的根路径)

3.以上方式就可以获取IDEA一个文件的绝对路径了,但是在获取的过程中,很容易遇到空指针异常,可以尝试采用以下几种方法解决:

1)检查一下文件名是否正确,文件是否在src这个目录下;
2)检查一下路径中含有特殊字符或中文,然后改成英文;
3)这个是URL地址要用 / 而不是 \

4.应用:将获取文件绝对路径和IO以及Properties联合使用起来,读取配置文件里的value

配置文件是下图中的classinfo.properties,内容是:className=com.java.note.User
在这里插入图片描述
代码:

import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;

public class IOPropertiesTest {
    public static void main(String[] args) throws IOException {
        String path=Thread.currentThread().getContextClassLoader().getResource("classinfo.properties").getPath();
        FileReader reader=new FileReader(path);
        Properties pro=new Properties();
        pro.load(reader);
        reader.close();

        //通过key获取value
        String className=pro.getProperty("className");
        System.out.println(className);
    }
}

运行结果:com.java.note.User

也可以换一种写法,直接以流的形式返回绝对路径:

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class IOPropertiesTest1 {
    public static void main(String[] args) throws IOException {
        InputStream reader=Thread.currentThread().getContextClassLoader().getResourceAsStream("classinfo.properties");
        
        Properties pro = new Properties();
        pro.load(reader);
        reader.close();

        //通过key获取value
        String className = pro.getProperty("className");
        System.out.println(className);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值