Java命令提示符模拟器

时间:2016-06-20 17:04:25

标签: java

我试图创建一个通过cmd.exe命令并打印输出的java程序。为此,我使用此代码:

cmdLine = Runtime.getRuntime().exec("cmd.exe");
cmdLineOut = new BufferedReader(new InputStreamReader(cmdLine.getInputStream()));
cmdLineIn = new PrintWriter(cmdLine.getOutputStream());
// ...
cmdLineIn.println(command);
cmdLineIn.flush();
String s = null;
while ((s = cmdLineOut.readLine()) != null)
    System.out.println(s);

虽然,在给出输入时,输出永远不会打印。

编辑:解决了 当输入为空时,cmdLineOut.readLine()不会返回null,它会冻结。由于readLine在结束时冻结没有执行其他代码,我只是将readLine的打印放在一个单独的线程中。

如果有人想要更好地回答这个问题,请继续。

1 个答案:

答案 0 :(得分:0)

您永远不会实际执行用户的命令,至少在您发布的代码段中。此外,几乎所有命令提示符“命令”实际上只是默认程序搜索路径上的程序。对于每个命令,您应该只需要Runtime.getRuntime().exec(user_command)。这意味着您必须像为每个命令所做的那样设置输入和输出流。您在单独的线程中获取输入是正确的,因为尝试读取输入将阻止当前线程,直到实际输入要读取为止。 但是,某些命令,即使在UNIX或Linux系统下,也是“内置”的(如cd),这意味着命令提示符(也称为“shell”)在内部处理命令。您的程序必须测试用户输入以查看它们是否正在调用内置命令,并专门处理对内置命令的调用。您的程序实际上应该可以移植到非Windows计算机上。当然,用户会使用不同的命令(cp而不是copy),但是你必须添加的唯一部分是处理内置插件的其他操作系统“shell”列表(或简单地说让你的程序实现一个“跨平台”的内置函数 - 这是你的shell程序,你可以制定规则。)