gpt4 book ai didi

java - 命令行终端在进程上执行并从此进程输入交互

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:19:26 25 4
gpt4 key购买 nike

<分区>

基本上,当我在我的 Java 应用程序上按下按钮时,我有一个运行的进程。并且这个过程向操作系统的终端执行命令。但有时此命令需要与用户进行交互。我想知道是否可以在需要时让流程与用户进行交互?

我的代码:

File marsSimulator = new File("resources/mars_simulator/Mars4_5.jar");
if(marsSimulator.exists() && temp.exists()){
String res="";
try {
Process p = Runtime.getRuntime().exec(new String[]{"java","-jar",marsSimulator.getAbsolutePath(),tempAssembly.getAbsolutePath()});
p.waitFor();

InputStream is = p.getInputStream();

byte b[] = new byte[is.available()];
is.read(b, 0, b.length); // probably try b.length-1 or -2 to remove "new-line(s)"

res = new String(b);

} catch (Exception ex) {
ex.printStackTrace();
}
}

此外,我忘了说该应用程序是使用 SWING 制作的,并且该过程的输出显示在 TextArea 上...我应该更改任何内容吗?

请注意,当与用户进行交互时,进程会阻塞。如果没有,进程不会阻塞!

在这种情况下我需要做什么(我不知道该怎么做)?

  1. 当流程需要交互时。我需要知道进程何时需要一些交互。
  2. 我需要以交互方式(逐行)获取流程生成的输出。

P.S.:对于想要了解生产线的人,我正在使用火星模拟器 ( http://courses.missouristate.edu/KenVollmar/MARS/ ) 并将 jar 应用程序发送到一个关联了 mips 汇编代码的进程中。


下一段代码正在与我的项目一起使用

希望对接下来的冒险家有所帮助!

感谢 Nicolas Filotto 对我的帮助。

我的类 ObservableStream:

class ObservableStream extends Observable {
private final Queue<String> lines = new ConcurrentLinkedQueue<>();

public void addLine(String line) {
lines.add(line);
setChanged();
notifyObservers();
}

public String nextLine() {
return lines.poll();
}

public String getLine(){return lines.peek();}
}

以及代码的另一部分:

Process p = Runtime.getRuntime().exec(new String[]{"java","-jar",marsSimulator.getAbsolutePath(),tempAssembly.getAbsolutePath()});

//This code does the interaction from the process with the GUI ! Implied, input interaction+output interaction from the process
ObservableStream out = new ObservableStream();
// Observer that simply sends to my external process line by line what we put in
// the variable output
PrintWriter writer = new PrintWriter(p.getOutputStream(), true);
out.addObserver(
(o, arg) -> {
ObservableStream stream = (ObservableStream) o;
String line;
while ((line = stream.nextLine()) != null) {
writer.println(line);
}
}
);

ObservableStream input = new ObservableStream();
input.addObserver(
(o, arg) -> {
ObservableStream stream = (ObservableStream) o;
String line;
while ((line = stream.nextLine()) != null) {
outputTextArea.appendText(line+"\n");
}
}
);

// The thread that reads the standard output stream of the external process
// and put the lines into my variable input
new Thread(
() -> {
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(p.getInputStream()))
) {
String line;
while ((line = reader.readLine()) != null) {
input.addLine(line);
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
).start();


new Thread(
()->{
while(p.isAlive()){
String res = input.getLine();
if(res!=null && res.equals("Enter integer value:")) {
boolean integerIsRequested=true;
Thread t=null;
while(integerIsRequested){
if(t==null) {
t = new Thread(new Runnable() {
public void run() {
String test1 = JOptionPane.showInputDialog("Enter Integer value:");
while(!test1.matches("^\\d+$")){
test1 = JOptionPane.showInputDialog("Error: Not a valid Integer.\nEnter a correct Integer value:");
}
Integer i = Integer.valueOf(test1);

if (i != null) {
out.addLine(test1);
}
}
});
t.start();

}
if(!t.isAlive()){
integerIsRequested=false;
}
}
}
}
outputTextArea.appendText("Program executed\n");
}
).start();

顺便说一下,这篇文章是独一无二的 Jarrod ;)

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