Java 如何执行一系列相关的控制台命令?

Java 如何执行一系列相关的控制台命令?,java,process,runtime.exec,Java,Process,Runtime.exec,我目前正在从事一个项目,其中客户机从服务器接收shell/console命令,并且必须执行这些命令 如何让Java在shell或命令提示符中运行这些命令?我希望能够忽略平台类型,而不必指定shell或命令提示符,但如果我不能,那也没关系 我必须能够发送一系列相关命令,而不仅仅是一个命令。这意味着shell/prompt不能在命令之间退出或关闭 我当前的代码(如下所示)允许执行一系列程序,但这些命令必须以某种方式通过管道传输到shell/命令提示符中,从中必须读取输出 ArrayList<S

我目前正在从事一个项目,其中客户机从服务器接收shell/console命令,并且必须执行这些命令

如何让Java在shell或命令提示符中运行这些命令?我希望能够忽略平台类型,而不必指定shell或命令提示符,但如果我不能,那也没关系

我必须能够发送一系列相关命令,而不仅仅是一个命令。这意味着shell/prompt不能在命令之间退出或关闭

我当前的代码(如下所示)允许执行一系列程序,但这些命令必须以某种方式通过管道传输到shell/命令提示符中,从中必须读取输出

ArrayList<String> comDat = new ArrayList<>();

while(true) {
    String input = con.recv();
    System.out.println("> " + input);

    if(!input.equals("EOF")) comDat.add(input); else {
        String[] s = new String[comDat.size()];
        for(int i = 0; i < comDat.size(); i++) s[i] = comDat.get(i);

        System.out.println("---Command sequence executing---");
        Process p = Runtime.getRuntime().exec(s);
        p.waitFor();

        System.out.println("---ErrorStream output---"); String line = "";
        BufferedReader errStream = new BufferedReader(new InputStreamReader(p.getErrorStream()));
        while((line = errStream.readLine()) != null) System.out.println("< " + line);

        System.out.println("\n---OutputStream output---"); line = "";
        BufferedReader outStream = new BufferedReader(new InputStreamReader(p.getInputStream()));
        while((line = errStream.readLine()) != null) System.out.println("< " + line);
    }
    Thread.sleep(200);
}
ArrayList comDat=new ArrayList();
while(true){
字符串输入=con.recv();
系统输出打印项次(“>”+输入);
如果(!input.equals(“EOF”))comDat.add(输入);则{
String[]s=新字符串[comDat.size()];
对于(int i=0;i

谢谢你的帮助

基本前提是,dir
不是一个外部命令,而是
cmd
的函数

在读取进程的输出时,我会避免使用
BufferedReaders
,因为并非所有进程在发送输出时都使用新行(例如进度指示器),相反,您应该读取char for char(IMHO)

您应该使用
ProcessBuilder
而不是
Runtime\exec
。它提供了更好的管理,并允许您将错误流重定向到输入流中,从而更容易读取输入

import java.io.IOException;
import java.io.InputStream;

public class TestProcessBuilder {

    public static void main(String[] args) {

        try {
            ProcessBuilder pb = new ProcessBuilder("cmd", "/c", "dir");
            pb.redirectError();
            Process p = pb.start();
            InputStreamConsumer isc = new InputStreamConsumer(p.getInputStream());
            isc.start();
            int exitCode = p.waitFor();

            isc.join();
            System.out.println("Process terminated with " + exitCode);
        } catch (IOException | InterruptedException exp) {
            exp.printStackTrace();
        }

    }

    public static class InputStreamConsumer extends Thread {

        private InputStream is;

        public InputStreamConsumer(InputStream is) {
            this.is = is;
        }

        @Override
        public void run() {

            try {
                int value = -1;
                while ((value = is.read()) != -1) {
                    System.out.print((char)value);
                }
            } catch (IOException exp) {
                exp.printStackTrace();
            }

        }

    }
}

“Dir”不是一个可执行的命令,它是命令处理器的一部分,你需要通过“cmd”@MadProgrammer来执行它。我已经意识到-仍然不确定如何以平台通用的方式执行它。抱歉,查看一些答案,试着看看@MadProgrammer-Hmm,这是一个很好的线索。尽管如此,它仍然不能完全解决这个问题——它不允许一系列命令;我需要在同一个提示符下运行多个连续命令。那么?
Runtime#exec
,您只需继续创建新实例即可。事实上,我刚刚编写了一个类,它很好地包装了这一切,并提供了线程回调。现在我只需将一系列的
String
s传递给类attach a listener,瞧……但这就是我问题的重点:我需要在同一个提示符中使用命令。我想。。。不是最理想的解决方案,但它会起作用。谢谢你的帮助!我很久以前也做过类似的事情,但我在运行时基于一些其他变量编写了批处理文件。。。