1.绝对路径:以前想用输入流读取如下图的ideaProject目录下的这个文件时,
就会这样写:
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);
}
}