有些时候我们在程序中会生成一些结果信息,并期望将结果信息保存到本地路径的文件中;又或是程序需要读取一些信息,这些信息来自本地路径中的某个文件。java程序中路径可以由程序以及特定需求来决定,通常可以选择用户主目录(可以由System.getProperty("user.home")获取)、当前程序(或类文件)所在的目录(或上下级目录)、或者其他指定的目录。

当希望在当前程序(或类文件)所在的目录(或上下级目录)中读取或写入文件时,首先需要获得相应的路径。由于使用IDE(这里使用Eclipse)运行程序与使用jar包运行程序时获取的路径结果有些不同,本文主要记录了以这两种方式运行程序时获取当前路径的方法。

获取当前程序(或类文件)所在的目录可以用以下3个方法(可能还有其他方法,后续会逐步添加):

1、使用File类提供的方法来获取当前路径

2、使用Class类的getResource("").getPath()获取当前.class文件所在的路径

3、由System.getProperty("user.dir")获取当前程序的根目录

以下是以两种方式运行程序(使用Eclipse运行与使用jar包运行)时这些方法的使用情况(Eclipse中测试项目的根目录为E:\EclipseWorkspace\FileTestProject,jar包所在的路径为:H:\FileTestProject):

(附:项目的包层次结构如下)

1、使用File类提供的方法来获取当前路径:

File directory = new File(""); //实例化一个File对象。参数不同时,获取的最终结果也不同
directory.getCanonicalPath(); //获取标准路径。该方法需要放置在try/catch块中,或声明抛出异常
directory.getAbsolutePath(); //获取绝对路径。

我们来看一下实例化File时所使用的不同参数会导致的不同结果:

参数为"":

File directory = new File("");
directory.getCanonicalPath(); //eclipse中运行为:E:\EclipseWorkspace\FileTestProject,jar包运行为:H:\FileTestProject
directory.getAbsolutePath(); //eclipse中运行为:E:\EclipseWorkspace\FileTestProject,jar包运行为:H:\FileTestProject

参数为".":

File directory = new File(".");
directory.getCanonicalPath(); //eclipse中运行为:E:\EclipseWorkspace\FileTestProject,jar包运行为:H:\FileTestProject
directory.getAbsolutePath(); //eclipse中运行为:E:\EclipseWorkspace\FileTestProject\. ,jar包运行为:H:\FileTestProject\.

参数为"..":

File directory = new File("..");
directory.getCanonicalPath(); //eclipse中运行为:E:\EclipseWorkspace,jar包运行为:H:\
directory.getAbsolutePath(); //eclipse中为:E:\EclipseWorkspace\FileTestProject\.. ,jar包运行为:H:\FileTestProject\..

参数为"./src":

File directory = new File("./src");
directory.getCanonicalPath(); //eclipse中为:E:\EclipseWorkspace\FileTestProject\src,jar包运行为:H:\FileTestProject\src
directory.getAbsolutePath(); //eclipse中为:E:\EclipseWorkspace\FileTestProject\.\src,jar包运行为:H:\FileTestProject\.\src

综上,结合API文档可以看到,getCanonicalPath()方法其实是先调用了getAbsolutePath(),然后将返回结果处理为描述符合宿主系统路径命名规范的String(去掉了路径中多余的"."、".."等)。实例化File对象时,也可以自己使用参数"/"或"\\"等试试,其他情况也可以参照API中的构造函数,例如:File(String parent, String child)

2、使用Class类的getResource("").getPath()获取当前.class文件所在的路径:

参数为"/":

String path = Class.class.getClass().getResource("/").getPath();
/*eclipse中为:/E:/EclipseWorkspace/FileTestProject/bin/,jar包运行报错(可能是由于jar包为一个整体了无法给出路径)*/

参数为"/fileTest":

String path = Class.class.getClass().getResource("/fileTest").getPath();
/*eclipse中为:/E:/EclipseWorkspace/FileTestProject/bin/fileTest,jar包运行报错(可能是由于jar包为一个整体了无法给出路径)*/

附:可以使用Class类的getResource("")以及getResourceAsStream("")方法来获取项目中的资源文件,具体的使用方法可以参考java使用getResource("")、getResourceAsStream("")获取项目中的资源文件

3、由System.getProperty("user.dir")获取当前程序的根目录:

System.getProperty("user.dir");
/* eclipse中运行为:E:\EclipseWorkspace\FileTestProject,jar包运行为:H:\FileTestProject */