0. 环境介绍
在Java应用程序特别是JavaWeb程序中,我们经常需要访问本程序下的文件或者外部的文件,但是如何组织文件的路径信息才可以更好的访问到文件呢?今天我们来分析一下。
首先是所需要的开发环境:
系统:Windows7
JDK:JDK1.8.0_101
IDE:Intellij IDEA 15.0.3
1. Java路径介绍
在Java处理的文件系统中,目录的表示方式有两种:
- 绝对目录,它以”/”为起始字符,代表从根目录下开始寻找给出的目录,如/JavaPath/src/mysql.properties
- 相对路径,它以不带”/”的目录名表示,表示以当前Java程序正在运行的目录作为起始目录来寻找给出的目录。如src/classes。在相对路径中,有一些特定的字符,可以代表特的的目录,比如,”/”代表当前目录,”//”代表当前目录的上一级目录。在网上很多给出的例子中,就是利用”.”作为目录名,构造File对象的实例,然后通过File对象的方法来获取当前程序运行的目录
归根结底,Java本质上只能使用绝对路径来寻找资源。所有的相对路径寻找资源的方法,都不过是一些便利方法。不过是API在底层帮助我们构建了绝对路径,从而找到资源的!
2. URL和URI
- URI:统一资源标识符,如
/F:/Projects/IDEA workplace/JavaPath/out/production/JavaPath/com/weegee/path/
。 - URL:统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它,如https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/logo_white_fe6da1ec.png。
URL是URI的特例,URL可以打开资源,而URI则不行。URL和URI对象可以互相转换,使用各自的toURI(),toURL()方法即可
3. J2SE的应用程序获取路径信息
项目结构(只罗列出有用的项目结构信息)
JavaPath # 项目名称,在F:\Projects\IDEA workplace\下
| root.properties # 用于测试路径的文件
|-config # 用于测试路径的目录
| | config.properties # 用于测试路径的文件
|-out # 存放编译后的类的目录
| |-production
| | |-JavaPath # classpath,在Eclipse中
# out/production/JavaPath
# 相当于bin目录
# 存放.class文件和配置文件
| | | | src.properties
| | | |-com
| | | | |-weegee
| | | | | |-path
| | | | | | | GetPath.class
| | | | | | | current.properties
|-src
| | src.properties # 用于测试路径的文件
| |-com
| | |-weegee
| | | |-path
| | | | | GetPath.java
| | | | | current.properties # 用于测试路径的文件
在JVM中已经有一个属性用于输出当前程序的路径信息
//最简单的获取Java程序根目录的方法 System.out.println(System.getProperty("user.dir")); 输出:F:\Projects\IDEA workplace\JavaPath
不过这种方法不太推荐。
另一种获取Java程序根目录的方法
System.out.println(new File("").getAbsolutePath()); 输出: F:\Projects\IDEA workplace\JavaPath
获取当前类编译后的.class文件所在的目录
System.out.println(GetPath.class.getResource("")); System.out.println(GetPath.class.getResource(".")); 输出: file:/F:/Projects/IDEA%20workplace/JavaPath/out/production/JavaPath/com/weegee/path/
获取当前类编译后的.class文件所在的目录的上层目录
System.out.println(GetPath.class.getResource("..")); 输出: file:/F:/Projects/IDEA%20workplace/JavaPath/out/production/JavaPath/com/weegee/
获取classpath的绝对路径
System.out.println(GetPath.class.getResource("/")); System.out.println(Thread.currentThread().getContextClassLoader().getResource("")); System.out.println(GetPath.class.getClassLoader().getResource("")); System