当前位置: 首页 > 面试题库 >

使用CMD作为过程

穆鸿卓
2023-03-14
问题内容

我正在尝试直接通过Windows上的CMD(Linux上的终端)运行命令。我有以下代码。它的行为很奇怪。首先,运行程序时不打印任何内容。其次,在调试和逐步执行时,程序将打印默认的CMD文本和输入行。最后,我似乎无法写入CMD,因此它将执行命令。这是我的代码。我猜这可能是线程问题,但我对运行时不熟悉。

    Runtime r = Runtime.getRuntime();
    try {
        Process p = r.exec("cmd");
        InputStream iStream = p.getInputStream();
        BufferedReader sReader = new BufferedReader(new InputStreamReader(iStream));
        while(sReader.ready()) {
            System.out.print((char)sReader.read());
        }

        OutputStream oStream = p.getOutputStream();
        BufferedWriter sWriter = new BufferedWriter(new OutputStreamWriter(oStream));
        sWriter.write("mkdir test");
        sWriter.newLine();

        while(sReader.ready()) {
            System.out.print((char)sReader.read());
        }
    } catch(Exception e) {
        e.printStackTrace();
    }

我的输出在调试和逐步调试时运行(运行时不显示任何输出)

Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

D:\workspaces\Maven\Command Line>

问题答案:

可能发生了几件事。一是参数没有按照执行过程的方式正确传递。另一个,就像@zacheusz提到的那样,输出可能是从错误流而不是输入流中出来的。

ProcessBuilder可以帮助您完成这两项工作,从而轻松构建命令列表,并能够合并输入流和错误流。我建议尝试使用它:

Process p = null;
try {
    List<String> cmd = new LinkedList<String>();
    cmd.add("executable");
    cmd.add("-arg1");
    cmd.add("value1");
    cmd.add("-arg2");
    ProcessBuilder pb = new ProcessBuilder(cmd);
    pb.redirectErrorStream(true);
    p = pb.start();
    BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
    while (input.ready()) {
        String line = input.readLine();
        System.out.println("From process: "+line);
    }
    input.close();
} catch (IOException e) {
    this.logMessage("IOException caught: "+e.getMessage());
    e.printStackTrace();
}


 类似资料:
  • 本文向大家介绍mysql 详解隔离级别操作过程(cmd),包括了mysql 详解隔离级别操作过程(cmd)的使用技巧和注意事项,需要的朋友参考一下 读未提交示例操作过程-Read uncommitted 1、打开两个MySql的命令提示行,均进入相同数据库,并检查当前表内容为相同数据如下: 2、在A、B两端执行select @@tx_isolation;检查当前默认的隔离级别别,可以发现都是 Re

  • 问题内容: 我已经写了一个存储过程。除了将表名作为输入参数之外,它都工作正常。 让我们在MySQL中查看我的proc: 存储过程的调用参数: 在这里,服务名称参数可以正常工作。但是,如果我将newsInfoTable变量作为表输入参数包括在内,则会显示错误。 表’db_test.newsinfotable’不存在 为什么只对表参数发生这种情况?如何从此错误中检索或 如何将表名作为参数传递给存储过程

  • 问题内容: 我试图了解如何调用以as为参数的PL / SQL过程。 考虑以下PL / SQL过程: 在将值绑定到IN参数时,我应该使用哪种方法? 对我来说,一个具有单独的游标记录字段的Java类,因为它是该类的成员和实例数组,它似乎是表示plsql CURSOR的正确方法。当我这样做时,我得到一个SQLException: 我使用了以下设置方法 这是我使用上面的语句得到的例外: 问题答案: 对我来

  • 问题内容: 我正在使用以下代码来启动.cmd文件: 它工作正常,但我实际上希望看到cmd.exe窗口正在运行。如何显示?任何帮助将不胜感激! 问题答案: 除了运行路径外,请尝试实际运行,但是使用build in 命令启动新的命令窗口。您可以通过在命令提示符下输入以下命令来查看完整的命令行参数集: 在您的情况下,您可能想要执行类似以下命令的操作:

  • 问题内容: 我发现了几个用于通过Java类运行cmd命令的代码段,但我无法理解。 这是打开cmd的代码 我找到了一些其他链接来添加其他命令,例如cd http://www.coderanch.com/t/109753/Linux-UNIX/exec-command-cd-command-java 如何使用Java打开命令提示符并插入命令? 谁能帮助我了解如何CD目录,例如: 然后在该目录上运行其他

  • 我找到了几个通过Java类运行cmd命令的代码片段,但我无法理解。 这是打开命令的代码 我还找到了一些添加其他命令的链接,比如cdhttp://www.coderanch.com/t/109753/Linux-UNIX/exec-command-cd-command-java 如何使用Java打开命令提示符并插入命令? 有人能帮我了解如何cd目录,例如: 然后在该目录上运行其他命令?