gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 04:44:13 26 4
gpt4 key购买 nike

我目前正在开发一个项目,其中客户端从服务器接收 shell/控制台命令,并且必须执行它们。

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

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

我当前的代码(如下所示)允许执行一系列程序,但这些命令必须以某种方式通过管道传输到 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);
}

感谢您的帮助!

最佳答案

基本前提围绕以下事实:dir 不是外部命令,而是 cmd 的函数。

在读取进程的输出时,我会避免使用 BufferedReaders ,因为并非所有进程在发送输出(例如进度指示器)时都使用换行符,而是应该逐个读取字符(恕我直言)。

您应该使用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();
}

}

}
}

关于java - 如何执行一系列相关的控制台命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16093754/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com