编写跨平台Java控制台应用程序

编写跨平台Java控制台应用程序,java,console,native,Java,Console,Native,我有一个实际的任务,就是编写Java应用程序,使其具有适用于多个平台的本机控制台行为。 我已经设法检测到平台和环境软件是在刚刚好 我使用Netbeans本机打包为每个平台创建带有consoleapp二进制文件的包 public class ConnTrol { /** * @param args the command line arguments */ public static void main(String[] args) { Con

我有一个实际的任务,就是编写Java应用程序,使其具有适用于多个平台的本机控制台行为。 我已经设法检测到平台和环境软件是在刚刚好

我使用Netbeans本机打包为每个平台创建带有consoleapp二进制文件的包

public class ConnTrol {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Console c = System.console();
        if (c == null) {
            if (System.getProperty("os.name").contains("Linux")) {
                try {
                    Runtime.getRuntime().exec(new String[]{"konsole","--noclose","-e",AppPath.getPath()+"/../consoleapp"});
                } catch (IOException ex) {

                }
            } else if (System.getProperty("os.name").contains("Windows")) {
                try {
                    Runtime.getRuntime().exec(new String[]{"cmd","/c","start",AppPath.getPath()+"\\..\\consoleapp.exe"});
                } catch (IOException ex) {

                }
            }
            System.exit(0);
        }

        c.printf("Hello world!%n");
    }

}
扩展版本检查*nix系统上的不同控制台版本

我看到的棘手的部分是让它在Windows上工作。 问题是,在Windows上创建的“consoleapp.exe”始终是Windows应用程序(不是控制台应用程序),因此,如果应用程序没有在控制台中运行并尝试在控制台中运行其副本,则该副本的I/O也没有连接到调用控制台,并且应用程序最终进入死循环,重新启动自身


非常感谢您的帮助

具体问题是什么?我如何在Windows上实现此功能?:)为什么不使用System.out.println?作为一个选项-是的,但它不能解决问题。问题出现在Windows Runtime.getRuntime().exec上(新字符串[]{“cmd”、“/c”、“start”、AppPath.getPath()+“\\..\\consoleapp.exe”});不会将consoleapp.exe的流连接到cmd,因此新副本也会从console中运行。这是因为Netbeans总是将GUI二进制化,而且Windows上的GUI二进制永远不会连接到控制台,即使它们是从控制台启动的。我在寻找如何解决这个问题。深入研究cmd的构造,似乎cmd就是问题所在,因为它似乎在启动的应用程序标记为GUI应用程序时忽略了它的I/o