java 路径

2016-10-10 22:30:02

总结了一下java中获取路径的一些方法。

相对路径

System.getProperty(“user.dir”) 可以获取java虚拟机调用目录,即当前用户目录。
JAVA IO操作中相对路径都是该路径。

public class Path {
    public static void main(String[] args) {
        System.out.println(System.getProperty("user.dir"));
    }
}

如Path类位于E:\java
运行Path类:

$ java Path
E:\java

可以看到输入Path类所在路径

但在tomcat启动的web项目中,System.getProperty(“user.dir”)获取到的是tomcat/bin目录
在eclipse或idea等IDE中获取的结果也不样
使用相对目录的缺点是无法获取一致的路径

classpath

默认情况下classpath表示编译文件.class的输出目录, 包括resources目录。

Class.getResource

Class.getResource("/") 可以获取表示classpath的URL
Class.getResource("") 可以获取表示该类编译后class文件所在目录的URL

一个简单的小栗子, 我现在的bin-learning有一个子项目, 目录结构为

|-- bin-learning
    |-- core
        |-- src            
            |-- main
            |-- test
                |-- java
                    |-- base
                        |-- simple
                            |-- SimpeTest.java
                |-- resources
                    |-- local.properties
                    |-- xml
                        |-- local.xml

该项目有一个Test

package com.study.path;

import org.junit.Test;

public class ClassPath {

    @Test
    public void testClassGetResource() {
        // 获取classpath, 结果 .../bin-learning/core/build/classes/test/
        this.getClass().getResource("/");    
        // 获取local.properties文件, 结果 ...bin-learning/core/build/resources/test/local.properties
        this.getClass().getResource("/local.properties");    
        // 获取xml/local.xml文件, 结果 .../bin-learning/core/build/resources/test/xml/local.xml
        this.getClass().getResource("/xml/local.xml");
        // 获取base目录,结果 .../bin-learning/core/build/classes/test/base
        this.getClass().getResource("/base");    
        // 获取base/simple目录, 结果 .../bin-learning/core/build/classes/test/base/simple
        this.getClass().getResource("/base/simple");    

        // 获取当前class所在目录, 结果 .../bin-learning/core/build/classes/test/base/
        this.getClass().getResource("");    
        // 获取当前class的simple子目录, 结果.../bin-learning/core/build/classes/test/base/simple
        this.getClass().getResource("simple");    
    }
}

可以看到,Class.getResource不仅可以获取到classes目录, 还可以获取resources目录及该目录的资源文件。

URL使用了utf-8字符集对路径进行了编码,会对中文和空格进行转换,可以调用URLDecoder.decode方法进行解码获取原始路径。

String classPath = java.net.URLDecoder.decode(classPath, "utf-8");

ClassLoader.getResource

ClassLoader.getResource("") 可以获取表示classpath的URL
ClassLoader.getResource("/")返回null,以/开始的参数是不合理参数

还是上文栗子中的项目结构

@Test
public void testClassLoaderGetResource() {
        // 获取classpath, 结果 .../bin-learning/core/build/classes/test/
        this.getClass().getClassLoader().getResource("");
        // 获取local.properties文件, 结果 ...bin-learning/core/build/resources/test/local.properties
        this.getClass().getClassLoader().getResource("local.properties");    
        // 获取xml/local.xml文件, 结果 .../bin-learning/core/build/resources/test/xml/local.xml
        this.getClass().getClassLoader().getResource("xml/local.xml");    
        // 获取base目录,结果 .../bin-learning/core/build/classes/test/base
        this.getClass().getClassLoader().getResource("base");    
        // 获取base/simple目录, 结果 .../bin-learning/core/build/classes/test/base/simple
        this.getClass().getClassLoader().getResource("base/simple");    
}

ClassLoader.getResource(“”)于Class.getResource(“/“)作用一样。

建议使用ClassLoader.getResource

参考:
java代码中获取classpath路径