Java学习笔记之获取当前目录或文件

时间:2022-06-07 12:49:41
近来在项目中遇到一个关于获取项目目录下配置文件的问题?在eclipse中可以正确获取配置文件,但是当项目打包成jar包后就出现"找不到文件"的异常。特此研究了一下java中获取当前目录和获取项目中文件的方法。

实验代码如下

import java.io.File;
import java.io.IOException;
import java.net.URL;


public class Test {

public static void main(String[] args) {
// 获取当前程序执行的目录
String path = System.getProperty("user.dir");
System.out.println("current diretory:" + path);

// 获取/config/test.txt
URL url = Test.class.getResource("/config/test.txt");
System.out.println("test.txt path:" + url);

// 获取test.txt
url = Test.class.getResource("/test.txt");
System.out.println("test.txt path:" + url);

// 获取class目录
path = System.getProperty("java.class.path");
System.out.println("class path:" + path);

// 获取codesource path
url = Test.class.getProtectionDomain().getCodeSource().getLocation();
System.out.println("codesource path:" + url);

// 获取当前程序目录
File file = new File("");
try {
System.out.println(file.getCanonicalPath());
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(file.getAbsolutePath());
}

}

项目目录

Java学习笔记之获取当前目录或文件


运行结果

  • 在eclise中的运行的结果为:
current diretory:/home/lyh/workspace/GetDirectory
test.txt path:file:/home/lyh/workspace/GetDirectory/bin/config/test.txt
test.txt path:file:/home/lyh/workspace/GetDirectory/bin/test.txt
class path:/home/lyh/workspace/GetDirectory/bin
codesource path:file:/home/lyh/workspace/GetDirectory/bin/
canonicalpath:/home/lyh/workspace/GetDirectory
absolutepath:/home/lyh/workspace/GetDirectory
  • 在控制台中运行命令lyh@lyh-pc:~$ java -jar GetDirectory.jar的结果为:
current diretory:/home/lyh
test.txt path:jar:file:/home/lyh/GetDirectory.jar!/config/test.txt
test.txt path:jar:file:/home/lyh/GetDirectory.jar!/test.txt
class path:GetDirectory.jar
codesource path:file:/home/lyh/GetDirectory.jar
canonicalpath:/home/lyh
absolutepath:/home/lyh

结果分析

从中可以看出各中获取目录或文件的方法在eclipse中和命令行中结果的区别:

  • System.getProperties("user.dir")在eclipse中结果就是项目的根目录,然而在终端执行时结果就是当前执行命令的目录(与pwd命令结果一样)。
  • Test.class.getResource()方法在eclipse中会在项目的/bin文件夹下找文件,而在终端中则在jar包中的根目录找文件。

总结可以得出当用Test.class.getResource()找文件时,就是在class目录(即System.getProperty("java.class.path")的结果)中找文件。