编程技术分享平台

网站首页 > 技术教程 正文

Java控制台小程序获得执行程序的目录学习笔记

xnh888 2025-07-19 23:29:53 技术教程 4 ℃ 0 评论

编写一个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()方法处理。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表