网站首页 > 技术教程 正文
编写一个Java控制台的小程序,需要获得当前程序的运行目录。
从AI上获得攻略后的验证如下:
相关代码:
package com.zx.app.cmd.util;
import java.io.Console;
import java.io.File;
import java.net.URISyntaxException;
import java.nio.file.Paths;
import java.util.Scanner;
public class ZxCmdUtil {
public static boolean strIsTrimEmpty(String data) {
return data == null || data.trim().isEmpty();
}
public static String readPassword(Scanner scanner) {
// 优先使用 Java Console 实现安全输入(IDE 中可能不支持)
Console console = System.console();
if (console != null) {
char[] passwordChars = console.readPassword("");
return new String(passwordChars);
}
// 若 Console 不可用(如在 IDE 中),退回到普通输入(明文显示)
return scanner.nextLine();
}
public static String getWorkingDirectory() {
return System.getProperty("user.dir");
}
public static String getClassLocation() {
Class<?> clazz = ZxCmdUtil.class;
// 获取类文件的URL
java.net.URL location = clazz.getProtectionDomain().getCodeSource().getLocation();
try {
// 转换为文件路径
File jarFile = new File(location.toURI());
if (jarFile.isFile()) {
return jarFile.getParentFile().getAbsolutePath();
} else {
return jarFile.getAbsolutePath();
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static String getClassPath(){
try {
// 获取当前类的资源路径
java.net.URI uri = ZxCmdUtil.class.getResource("").toURI();
return Paths.get(uri).toString();
} catch (URISyntaxException e) {
e.printStackTrace();
return null;
}
}
public static String getJarDirectory(){
// 获取当前类所在的JAR文件路径
String jarPath = ZxCmdUtil.class.getProtectionDomain()
.getCodeSource()
.getLocation()
.getPath();
// 解码URL格式的路径(处理空格和特殊字符)
try {
jarPath = java.net.URLDecoder.decode(jarPath, "UTF-8");
} catch (java.io.UnsupportedEncodingException e) {
e.printStackTrace();
}
// 获取JAR包所在目录
File jarFile = new File(jarPath);
if (jarFile.isFile()) {
return jarFile.getParentFile().getAbsolutePath();
} else {
// 如果不是JAR包(例如IDE中运行),可能返回类路径目录
return jarFile.getAbsolutePath();
}
}
}
package com.zx.app.cmd.main;
import com.zx.app.cmd.enums.command.CmdMainNameEnum;
import com.zx.app.cmd.helper.AesCodeHelper;
import com.zx.app.cmd.helper.EncCodeHelper;
import com.zx.app.cmd.util.ZxCmdUtil;
import java.util.Scanner;
public class ZxCmdMain {
protected static void welcome() {
System.out.println("当前工作目录(user.dir):" + ZxCmdUtil.getWorkingDirectory());
System.out.println("获取类所在的JAR包或类文件目录:" + ZxCmdUtil.getClassLocation());
System.out.println("获取ClassPath路径:" + ZxCmdUtil.getClassPath());
System.out.println("获取可执行JAR包的目录(适用于打包后的应用):" + ZxCmdUtil.getJarDirectory());
}
public static void main(String[] args) {
welcome();
}
}
场景一、在IDEA下运行
输出:
"C:\Program Files\Java\jdk-11.0.14\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2025.1.1.1\lib\idea_rt.jar=64631" -Dfile.encoding=UTF-8 -classpath C:\Projects\zx\zx-java-cmd\codeV1\zx-java-cmd\target\classes;C:\MyProgramFiles\maven\maven_jar\org\jasypt\jasypt\1.9.3\jasypt-1.9.3.jar com.zx.app.cmd.main.ZxCmdMain
当前工作目录(user.dir):C:\Projects\zx\zx-java-cmd\codeV1\zx-java-cmd
获取类所在的JAR包或类文件目录:C:\Projects\zx\zx-java-cmd\codeV1\zx-java-cmd\target\classes
获取ClassPath路径:C:\Projects\zx\zx-java-cmd\codeV1\zx-java-cmd\target\classes\com\zx\app\cmd\util
获取可执行JAR包的目录(适用于打包后的应用):C:\Projects\zx\zx-java-cmd\codeV1\zx-java-cmd\target\classes
我工程的目录:
C:\Projects\zx\zx-java-cmd\codeV1\zx-java-cmd
Main的类所在目录:
C:\Projects\zx\zx-java-cmd\codeV1\zx-java-cmd\src\main\java\com\zx\app\cmd\main
ZxCmdUtil类所在的目录:
C:\Projects\zx\zx-java-cmd\codeV1\zx-java-cmd\src\main\java\com\zx\app\cmd\util
class文件所在的目录:
C:\Projects\zx\zx-java-cmd\codeV1\zx-java-cmd\target\classes
场景二、windows下打包输出
在C:\MyProgramFiles\cmd\java\zx目录下
bin:输出的class文件
com:源码
lib:放jar包
build.bat
javac -encoding UTF-8 -cp "lib\*;." -d bin com\zx\app\cmd\main\ZxCmdMain.java
run.bat
java -cp "bin;lib\*" com.zx.app.cmd.main.ZxCmdMain
输出:
当前工作目录(user.dir):C:\MyProgramFiles\cmd\java\zx
获取类所在的JAR包或类文件目录:C:\MyProgramFiles\cmd\java\zx\bin
获取ClassPath路径:C:\MyProgramFiles\cmd\java\zx\bin\com\zx\app\cmd\util
获取可执行JAR包的目录(适用于打包后的应用):C:\MyProgramFiles\cmd\java\zx\bin
在C:\MyProgramFiles\cmd\java\zx目录下执行java
class文件的根目录:C:\MyProgramFiles\cmd\java\zx\bin
调整一下执行脚本:
源码删掉,class文件从bin移动到根目录
C:\MyProgramFiles\cmd\java\zxtwo是根目录
java -cp ";lib\*" com.zx.app.cmd.main.ZxCmdMain
C:\MyProgramFiles\cmd\java\zxtwo>java -cp ";lib\*" com.zx.app.cmd.main.ZxCmdMain
当前工作目录(user.dir):C:\MyProgramFiles\cmd\java\zxtwo
获取类所在的JAR包或类文件目录:C:\MyProgramFiles\cmd\java\zxtwo
获取ClassPath路径:C:\MyProgramFiles\cmd\java\zxtwo\com\zx\app\cmd\util
获取可执行JAR包的目录(适用于打包后的应用):C:\MyProgramFiles\cmd\java\zxtwo
场景三、windows下相对路径输出
在c:\temps目录下输出
java -cp "C:\MyProgramFiles\cmd\java\zxtwo;C:\MyProgramFiles\cmd\java\zxtwo\lib\*" com.zx.app.cmd.main.ZxCmdMain
C:\temps>java -cp "C:\MyProgramFiles\cmd\java\zxtwo;C:\MyProgramFiles\cmd\java\zxtwo\lib\*" com.zx.app.cmd.main.ZxCmdMain
当前工作目录(user.dir):C:\temps
获取类所在的JAR包或类文件目录:C:\MyProgramFiles\cmd\java\zxtwo
获取ClassPath路径:C:\MyProgramFiles\cmd\java\zxtwo\com\zx\app\cmd\util
获取可执行JAR包的目录(适用于打包后的应用):C:\MyProgramFiles\cmd\java\zxtwo
场景四、Linux下输出
在/opt/app/cmd/java/tool/zx目录下
build.sh
javac -encoding UTF-8 -cp "lib/*:." -d bin com/zx/app/cmd/main/ZxCmdMain.java
run.sh
java -cp "bin:lib/*" com.zx.app.cmd.main.ZxCmdMain
输出:
当前工作目录(user.dir):/opt/app/cmd/java/tool/zx
获取类所在的JAR包或类文件目录:/opt/app/cmd/java/tool/zx/bin
获取ClassPath路径:/opt/app/cmd/java/tool/zx/bin/com/zx/app/cmd/util
获取可执行JAR包的目录(适用于打包后的应用):/opt/app/cmd/java/tool/zx/bin
切换到 /tmp 目录
[root@localhost tmp]# sh /opt/app/cmd/java/tool/zx/root-run.sh
当前工作目录(user.dir):/tmp
获取类所在的JAR包或类文件目录:/opt/app/cmd/java/tool/zx/bin
获取ClassPath路径:/opt/app/cmd/java/tool/zx/bin/com/zx/app/cmd/util
获取可执行JAR包的目录(适用于打包后的应用):/opt/app/cmd/java/tool/zx/bin
结论
System.getProperty("user.dir"):获得当前工作的目录(就是启动程序的目录)
其他,可以获得class文件所在的根目录(供参考)
附:AI的攻略
在 Java 中获取当前执行程序的目录有多种方式,具体取决于你的应用场景(如普通 Java 程序、JAR 包运行、Web 应用等)。以下是几种常见的实现方法:
方法一:获取当前工作目录(推荐)
java
public class GetWorkingDirectory {
public static void main(String[] args) {
// 获取当前Java虚拟机的工作目录
String workingDir = System.getProperty("user.dir");
System.out.println("当前工作目录: " + workingDir);
}
}
方法二:获取类所在的 JAR 包或类文件目录
java
import java.io.File;
public class GetClassLocation {
public static void main(String[] args) {
// 获取当前类的Class对象
Class<?> clazz = GetClassLocation.class;
// 获取类文件的URL
java.net.URL location = clazz.getProtectionDomain().getCodeSource().getLocation();
try {
// 转换为文件路径
File jarFile = new File(location.toURI());
if (jarFile.isFile()) {
// 如果是JAR包,获取JAR包所在目录
System.out.println("JAR包所在目录: " + jarFile.getParentFile().getAbsolutePath());
} else {
// 如果是类文件,获取类路径目录
System.out.println("类文件所在目录: " + jarFile.getAbsolutePath());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
方法三:获取 ClassPath 路径
java
import java.net.URISyntaxException;
import java.nio.file.Paths;
public class GetClassPath {
public static void main(String[] args) {
try {
// 获取当前类的资源路径
java.net.URI uri = GetClassPath.class.getResource("").toURI();
String path = Paths.get(uri).toString();
System.out.println("ClassPath路径: " + path);
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
}
方法四:获取可执行 JAR 包的目录(适用于打包后的应用)
java
import java.io.File;
public class GetJarDirectory {
public static void main(String[] args) {
// 获取当前类所在的JAR文件路径
String jarPath = GetJarDirectory.class.getProtectionDomain()
.getCodeSource()
.getLocation()
.getPath();
// 解码URL格式的路径(处理空格和特殊字符)
try {
jarPath = java.net.URLDecoder.decode(jarPath, "UTF-8");
} catch (java.io.UnsupportedEncodingException e) {
e.printStackTrace();
}
// 获取JAR包所在目录
File jarFile = new File(jarPath);
if (jarFile.isFile()) {
System.out.println("JAR包所在目录: " + jarFile.getParentFile().getAbsolutePath());
} else {
// 如果不是JAR包(例如IDE中运行),可能返回类路径目录
System.out.println("当前目录: " + jarFile.getAbsolutePath());
}
}
}
适用场景说明
- 方法一:获取的是 Java 虚拟机启动时的工作目录,与程序所在位置无关,适合需要相对路径的场景。
- 方法二和方法四:适合需要定位 JAR 包或类文件所在目录的场景,例如读取同目录下的配置文件。
- 方法三:获取的是类路径目录,适用于查找类路径下的资源文件。
注意事项
- 路径分隔符:不同操作系统使用不同的路径分隔符(Windows 使用\,Linux/Mac 使用/),建议使用File.separator或Paths类处理路径。
- 打包后运行:如果程序打包成 JAR 运行,System.getProperty("user.dir")可能返回 JAR 包的执行目录,而不是 JAR 包所在目录。
- 特殊字符处理:如果路径包含空格或特殊字符,建议使用URLDecoder.decode()方法处理。
猜你喜欢
- 2025-07-19 Linux基础运维篇:Linux 终端与 Shell 基础(第006课)
- 2025-07-19 仓颉语言与.net9的互操作【进阶版】
- 2025-07-19 249个Linux Shell脚本经典案例,拿来即用(附PDF)
- 2025-07-19 Linux 中什么是 dirname $0?(linux dirname命令)
- 2025-07-19 .NET 10 牛逼!Linux 以 Shebang 方式执行脚本
- 2025-07-19 Linux中的sudo功能(linux的sudoers)
- 2025-07-19 Linux man 命令使用教程(linux里的man)
- 2025-07-19 ElfBoard技术贴|如何在【RK3588】ELF 2开发板上进行根系统的定制
- 2025-07-19 Linux 如何每 5、10、15 或 30 分钟运行一次 Cron 作业?
- 2025-07-19 如何在Linux上运行exe文件,怎么用linux运行windows软件
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)
本文暂时没有评论,来添加一个吧(●'◡'●)