首先,我想说我阅读了有关 apache commons exec 的所有其他线程。我有一个基于终端的可执行文件。运行时,它会提示用户从命令行输入一些输入。我需要从我的 java 程序中运行这个程序并向程序提供一些命令。我使用apache commons exec。这是我到目前为止所拥有的:
CommandLine command = new CommandLine("myExec");
DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler();
DefaultExecutor executor = new DefaultExecutor();
ShutdownHookProcessDestroyer processDestroyer = new ShutdownHookProcessDestroyer();
TextareaOutputStream outputstream = new TextareaOutputStream(jTextArea1); //this redirects the output to a text area by extending and overriding outputstream. Works perfect.
PumpStreamHandler streamHandler = new PumpStreamHandler(outputstream, outputstream);
executor.setStreamHandler(streamHandler);
OutputStream out = new ByteArrayOutputStream();
executor.getStreamHandler().setProcessInputStream(out);
executor.setProcessDestroyer(processDestroyer);
executor.execute(command, resultHandler);
out.write("myFile.dat\n".getBytes());
这行不通。我的程序一启动它就会崩溃:
forrtl: severe (24): end-of-file during read, unit 5, file stdin
我还尝试使用 pipedinputstream 作为此处->使用 Apache Commons Exec 为命令提供多个输入并提取输出时遇到问题:
CommandLine command = new CommandLine("myExec");
DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler();
DefaultExecutor executor = new DefaultExecutor();
ShutdownHookProcessDestroyer processDestroyer = new ShutdownHookProcessDestroyer();
TextareaOutputStream outputstream = new TextareaOutputStream(jTextArea1); //this redirects the output to a text area by extending and overriding outputstream. Works perfect.
PipedInputStream stdin = new PipedInputStream();
BufferedOutputStream processInput = new BufferedOutputStream(new PipedOutputStream(stdin));
PumpStreamHandler streamHandler = new PumpStreamHandler(outputstream, outputstream, stdin);
executor.setStreamHandler(streamHandler);
executor.setProcessDestroyer(processDestroyer);
executor.execute(command, resultHandler);
processInput.write("myFile.dat\n".getBytes());
processInput.flush();
有了这个,它会挂到第一个提示!好像 flush() 没有效果。终端程序永远不会得到任何东西。
我也尝试过这个想法:如何将字符串参数传递给使用 Apache Commons Exec 启动的可执行文件?
如果我在启动 exec 之前在 ByteArrayInputStream 中写入所有内容,那么它可以工作。如果我启动 exec 然后尝试写一些东西,那么我会再次遇到第一个错误。
任何帮助将不胜感激。
只是为了完整性(我没有写这个,我不记得我是从哪里得到的)。它用于将输出重定向到 jTextArea:
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
class TextareaOutputStream extends OutputStream {
private final JTextArea area;
private final StringBuffer buf = new StringBuffer(128);
public TextareaOutputStream(final JTextArea area) throws IOException {
this.area = area;
}
@Override
public void write(int c) throws IOException {
// append character to buffer
buf.append((char) c);
// and newline appends to textarea
if (c == '\n' || c == ':') {
flush();
}
}
@Override
public void close() {
flush();
}
@Override
public void flush() {
SwingUtilities.invokeLater(new Runnable() {
String str = buf.toString();
@Override
public void run() {
area.append(str);
}
});
buf.setLength(0);
}
public void message(String msg) {
if (buf.charAt(buf.length() - 1) != '\n') {
buf.append('\n');
}
buf.append(msg);
buf.append('\n');
flush();
}
}