在 java 程序中的 运行 时间从控制台写入和读取数据
Write and read data from console at run time in java program
我有一个 shell 脚本,其中有一些命令,其中一个命令需要在运行时输入一些数据。我 运行 这个 shell 脚本使用 exec() 方法。目前,如果要求输入,我正在手动输入数据。以下是我的代码,
Process p = Runtime.getRuntime().exec("myshellscript");
BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
// read the output from the command
System.out.println("Here is the standard output of the command:\n");
while ((s = stdInput.readLine()) != null) {
System.out.println(s);
}
// read any errors from the attempted command
System.out.println("Here is the standard error of the command (if any):\n");
while ((s = stdError.readLine()) != null) {
System.out.println(s);
}
System.exit(0);
我想做的是,每当输入控制台期望的数据时,它应该由 java 程序输入,然后继续我的 java 程序。
这是我的做法:
- 创建两个将从 p.getInputStream() 和 p.getErrorStream() 读取的线程,
- 将数据写入p.getOutputStream(),
- 等待两个线程终止(使用 join() 方法)
编辑:
public class Main {
private static final Logger LOG = Logger.getLogger(Main.class.getName());
public static void main(String[] args) {
try {
Process p = Runtime.getRuntime().exec("myshellscript");
Thread outHandler = new OutputHandler(p.getInputStream(), "UTF-8");
outHandler.setDaemon(true);
outHandler.start();
Thread errHandler = new OutputHandler(p.getErrorStream(), "UTF-8");
errHandler.setDaemon(true);
errHandler.start();
sendInput(p, "the input data", "UTF-8");
int result = p.waitFor();
outHandler.join();
errHandler.join();
System.out.println("exit code: " + result);
} catch (IOException ex) {
LOG.log(Level.SEVERE, null, ex);
} catch (InterruptedException ex) {
LOG.log(Level.SEVERE, null, ex);
}
}
private void sendInput(Process process, String input, String encoding)
throws IOException {
try (OutputStream stream = process.getOutputStream();
Writer writer = new OutputStreamWriter(
stream, encoding == null ? "UTF-8" : encoding);
PrintWriter out = new PrintWriter(writer)) {
if (input != null) {
Reader reader = new StringReader(input);
BufferedReader in = new BufferedReader(reader);
String line = in.readLine();
while (line != null) {
out.println(line);
line = in.readLine();
}
}
}
}
private static class OutputHandler extends Thread {
private BufferedReader in;
private OutputHandler(InputStream in, String encoding)
throws UnsupportedEncodingException {
this.in = new BufferedReader(new InputStreamReader(
in, encoding == null ? "UTF-8" : encoding));
}
@Override
public void run() {
try {
String s = in.readLine();
while (s != null) {
System.out.println(s);
s = in.readLine();
}
} catch (IOException ex) {
LOG.log(Level.SEVERE, null, ex);
} finally {
try {
in.close();
} catch (IOException ex) {
LOG.log(Level.SEVERE, null, ex);
}
}
}
}
}
我有一个 shell 脚本,其中有一些命令,其中一个命令需要在运行时输入一些数据。我 运行 这个 shell 脚本使用 exec() 方法。目前,如果要求输入,我正在手动输入数据。以下是我的代码,
Process p = Runtime.getRuntime().exec("myshellscript");
BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
// read the output from the command
System.out.println("Here is the standard output of the command:\n");
while ((s = stdInput.readLine()) != null) {
System.out.println(s);
}
// read any errors from the attempted command
System.out.println("Here is the standard error of the command (if any):\n");
while ((s = stdError.readLine()) != null) {
System.out.println(s);
}
System.exit(0);
我想做的是,每当输入控制台期望的数据时,它应该由 java 程序输入,然后继续我的 java 程序。
这是我的做法:
- 创建两个将从 p.getInputStream() 和 p.getErrorStream() 读取的线程,
- 将数据写入p.getOutputStream(),
- 等待两个线程终止(使用 join() 方法)
编辑:
public class Main {
private static final Logger LOG = Logger.getLogger(Main.class.getName());
public static void main(String[] args) {
try {
Process p = Runtime.getRuntime().exec("myshellscript");
Thread outHandler = new OutputHandler(p.getInputStream(), "UTF-8");
outHandler.setDaemon(true);
outHandler.start();
Thread errHandler = new OutputHandler(p.getErrorStream(), "UTF-8");
errHandler.setDaemon(true);
errHandler.start();
sendInput(p, "the input data", "UTF-8");
int result = p.waitFor();
outHandler.join();
errHandler.join();
System.out.println("exit code: " + result);
} catch (IOException ex) {
LOG.log(Level.SEVERE, null, ex);
} catch (InterruptedException ex) {
LOG.log(Level.SEVERE, null, ex);
}
}
private void sendInput(Process process, String input, String encoding)
throws IOException {
try (OutputStream stream = process.getOutputStream();
Writer writer = new OutputStreamWriter(
stream, encoding == null ? "UTF-8" : encoding);
PrintWriter out = new PrintWriter(writer)) {
if (input != null) {
Reader reader = new StringReader(input);
BufferedReader in = new BufferedReader(reader);
String line = in.readLine();
while (line != null) {
out.println(line);
line = in.readLine();
}
}
}
}
private static class OutputHandler extends Thread {
private BufferedReader in;
private OutputHandler(InputStream in, String encoding)
throws UnsupportedEncodingException {
this.in = new BufferedReader(new InputStreamReader(
in, encoding == null ? "UTF-8" : encoding));
}
@Override
public void run() {
try {
String s = in.readLine();
while (s != null) {
System.out.println(s);
s = in.readLine();
}
} catch (IOException ex) {
LOG.log(Level.SEVERE, null, ex);
} finally {
try {
in.close();
} catch (IOException ex) {
LOG.log(Level.SEVERE, null, ex);
}
}
}
}
}