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

java中文件路径的相关问题

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

工程的项目结构如下:

image-20200503010444684

1. linux和win下的路径分隔符

Linux下:/

Window下:\

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

2. jvm的运行路径

通常,jvm启动的路径为项目文件夹,

比如一个名叫testpath的标准maven项目结构的java项目,jvm在testpath这个文件夹下启动

代码查看下文内容

3. 获取资源的路径

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

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

3.1 Class.getResource(String path)

通过类名

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

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

查看测试代码 4 5

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

image-20200503004045093

但是,我自己的实测,IDEA不会再编译后,将 src\main\java目录下的文件,放置到 target\classes路径下

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在使用时,根据类名和类的实例来确定路径,路径选择上也是一样的。

供测试的基础代码

1. 当前运行的jvm路径

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

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

当前jvm运行的路径:
C:\IDEA_WorkSpace\maven-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路径

也就是,当前类,编译完成后,所处的绝对路径

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

运行结果:

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

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

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

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

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

参考链接

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

getResourceAsStream的几种路径配置

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

猜你喜欢

转载自www.cnblogs.com/tangg/p/12820503.html
今日推荐