为什么 System.console() 返回“java.io.ProxyingConsole@7ab2bfe1”,而我认为它应该返回 null?

问题描述 投票:0回答:1

我正在尝试制作一个程序,该程序将打开命令行,以便用户在运行它时进行交互。我对如何做到这一点做了一些研究,并在堆栈溢出上找到了这个解决方案,这基本上就是我所需要的: 如何让我的 Java 应用程序打开控制台/终端窗口? 它检查程序是否有与其关联的控制台,如果没有,则启动命令行并从其中运行 jar 文件。我发现的所有解决方案都使用相同的方法来检查 System.console() 是否为 null 来检查程序是否正在使用控制台运行,例如: 查看Java程序是否从CMD运行 如何检查应用程序是否在命令行上运行? 这是我正在使用的代码,其灵感来自上面的链接。

if(System.console() == null) {
    String filename = Main.class.getProtectionDomain().getCodeSource().getLocation().toString().substring(6);
    Runtime.getRuntime().exec(new String[]{"cmd","/c","start","cmd","/k","java","-jar","\"" + filename + "\""});
    System.exit(0);
}

不幸的是,当我运行 jar 文件时,没有任何明显的变化。我尝试修改程序以打开一个命令行窗口,显示

System.console()
返回的内容,以确保它像我期望的那样为空,但我得到的是“java.io.ProxyingConsole@7ab2bfe1”

我尝试查找 java.io.ProxyingConsole (和变体),我所能找到的只是源代码,这对我没有多大帮助。我尝试让我的代码越来越类似于示例,最终只是尝试直接复制粘贴它以查看它是否有效,但问题仍然存在。据我所知

System.console()
永远不会返回 null。

禁用此功能的方法,检测它是否是“ProxyingConsole”,或者检测是否有控制台/从 jar 中的 cmd 行运行程序的替代方法都值得赞赏

java console-application executable-jar
1个回答
0
投票

看起来

System.console()
在您的环境中没有按预期运行,可能是因为 JVM 或 IDE 的配置方式所致。有时,当从 IDE 或某些环境运行 Java 应用程序时,即使应用程序实际上并未从终端运行,System.console() 也可能不会返回 null。

这里有另一种方法来确定您的 Java 应用程序是否在终端中运行:

使用 System.getenv()System.getProperty()

您可以使用环境变量和系统属性来推断您的应用程序是否在终端中运行。

  • Windows 上,
    COMSPEC
    环境变量的存在通常表示终端或命令提示符环境。
  • 类 Unix 系统上,
    TERM
    环境变量的存在表明应用程序可能正在终端中运行。
private static boolean isRunningInTerminal() {
        // Check if environment variables typically set for terminals are present
        String os = System.getProperty("os.name").toLowerCase();
        if (os.contains("windows")) {
            String comSpec = System.getenv("COMSPEC");
            return comSpec != null && !comSpec.isEmpty();
        } else {
            String term = System.getenv("TERM");
            return term != null && !term.isEmpty();
        }
    }

您还可以检查是否存在指示在终端环境中运行的特定系统属性或运行时配置。添加额外的调试输出以更好地了解环境:

System.out.println("Console: " + System.console());
System.out.println("COMSPEC: " + System.getenv("COMSPEC"));
System.out.println("TERM: " + System.getenv("TERM"));
System.out.println("OS Name: " + System.getProperty("os.name"));
System.out.println("OS Version: " + System.getProperty("os.version"));
System.out.println("Java Version: " + System.getProperty("java.version"));
System.out.println("User Directory: " + System.getProperty("user.dir"));
System.out.println("Current Working Directory: " + System.getProperty("user.dir"));

这将帮助您确定哪些环境变量和属性可用,以及为什么

System.console()
可能不会返回
null

© www.soinside.com 2019 - 2024. All rights reserved.