我的头条面试经历分享,还没搞懂Java中的路径?看完这篇文章你就全懂了

private static void filePath() {
        File file = new File("D:\code\River\JavaSE\javaIO\src\main\java\org\huanghe\stream\Java中字符流与字节流的区别.md");
        System.out.println(file.exists());
        System.out.println(System.getProperty("user.dir"));
    }

image.gif

四、获取文件的路径class.getResource和class.getClassLoader

在我们Java开发中往往需要去获取文件中的内容,一般的我们会使用File的形式获取,如:我要获取“c:\文件.txt”此时我们需要创建一个File的对象File file=new FIle(“c:\文件txt”);

然后在使用file类创建一个文件文件输入流 :FileInputStream in =new FileInputStream(file),然后再是使用该输入流进行我们想要的操作,但是这样有一个弊端,就是我们的文件路径是一种硬编码的形式,在Java编码过程中我们极其不推荐这种写法

当然在web项目下,我们可以通过application对象的getRealPath(“文件名”)的方式获取文件的绝对路径,但是这样也不是很推荐,因此我们可以使用class.getResource(path)和class.getClassLoader(path)方法来获取文件资源,那么我们来研究一下两者的区别:

4.1 class.getResource(path)

其中的参数path有两种形式,一种是以“/”开头的,另一种是不以"/"开头;

  • 「以’/'开头的表示」:从项目的根路径下去获取文件即classPath目录下
  • **不以"/"开头:**以该类对象所在位置为根路径来进行查找的
/**
     * 测试class.getResource获取文件路径
     */
    public static void testClassGetResource() {
        System.out.println(_01_JavaFilePath.class.getResource(""));
        System.out.println(_01_JavaFilePath.class.getResource("/"));
    }

image.gif

输出的结果为:

file:/D:/Code/JavaSE/io/target/classes/com/huanghe/chapter/  : 返回的是 testClassGetResource.class这个类所在的目录
file:/D:/Code/JavaSE/io/target/classes/ : 返回的是 项目的classpath目录的路径

image.gif

假设现在的项目结构如下所示,针对下面的三种情况如何获取:

获取上图所示的三种文件的方法:

/**
     * 测试class.getResource获取文件路径
     */
    public static void testClassGetResource2() {
        System.out.println(_01_JavaFilePath.class.getResource("file/test.properties"));
        System.out.println(_01_JavaFilePath.class.getResource("../txt/01-java-filepath.txt"));
        System.out.println(_01_JavaFilePath.class.getResource("/01-java-filepath.txt"));
    }

image.gif

输出的结果为:

file:/D:/Code/JavaSE/io/target/classes/com/huanghe/chapter/one/file/test.properties

file:/D:/Code/JavaSE/io/target/classes/com/huanghe/chapter/txt/01-java-filepath.txt

file:/D:/Code/JavaSE/io/target/classes//01-java-filepath.txt

image.gif

:class.getResource()和class.getResourceAsStream()方式的使用在路径上是一致的。

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

该方法中的参数path不能以“/“开头,path表示的是从classpath下获取资源的

package testpackage;
public class TestMain {
    public static void main(String[] args) {
        TestMain t = new TestMain();
        System.out.println(t.getClass());
        System.out.println(t.getClass().getClassLoader());
        System.out.println(t.getClass().getClassLoader().getResource(""));
        System.out.println(t.getClass().getClassLoader().getResource("/"));//null
    }
}

image.gif

输出结果:

1\. class testpackage.TestMain
2\. sun.misc.Launcher$AppClassLoader@1fb8ee3


0158)] 

输出结果:

1. class testpackage.TestMain
2. sun.misc.Launcher$AppClassLoader@1fb8ee3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值