我是Threads,进程和终端的新手。 到目前为止它并没有那么糟糕,但我被卡住了。
在我的chiplotleErrorStream中,它永远不会到达:
它只是打印出找不到绘图仪的所有错误(我没有连接电缆)。但它永远不会:
System.out.println("it never reaches or prints this");
我无法理解为什么。 我做错了什么?
import java.io.*;
public class ExecTest {
ChiplotleInputStream chiplotleInputStream;
ChiplotleErrorStream chiplotleErrorStream;
PrintWriter pw;
public static void main(String[] args) {
new ExecTest().setup();
}
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
public void setup() {
try {
Runtime runTime = Runtime.getRuntime();
Process process = runTime.exec("chiplotle");
chiplotleInputStream = new ChiplotleInputStream(process);
chiplotleErrorStream = new ChiplotleErrorStream(process);
OutputStream os = process.getOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
pw = new PrintWriter(bw);
new Thread(chiplotleInputStream).start();
new Thread(chiplotleErrorStream).start();
// process.destroy();
}
catch (IOException e) {
e.printStackTrace();
}
}
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
public class ChiplotleInputStream implements Runnable {
BufferedReader in;
public ChiplotleInputStream(Process process) {
in = new BufferedReader(new InputStreamReader(process.getInputStream()));
}
@Override
public void run() {
while (true) {
String line;
try {
while ((line = in.readLine()) != null) {
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
public class ChiplotleErrorStream implements Runnable {
BufferedReader in;
public ChiplotleErrorStream(Process process) {
in = new BufferedReader(new InputStreamReader(process.getErrorStream()));
}
@Override
public void run() {
while (true) {
String line;
try {
while ((line = in.readLine()) != null) {
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("it never reaches or prints this");
// hoping for errors in the terminal so we see something
// but if it doesn't come here...
pw.println("dfsfsdfsdf");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
}
答案 0 :(得分:0)
您正在运行一个程序,在输出任何内容之前需要输入。
所以你创建的过程只是坐在那里,等着你把命令写入你创建的PrintWriter
。
只要进程处于活动状态并且正在等待,它就不会向其输出流(您的进程输入流)输出任何内容,也不会向其错误流输出任何内容。
因此,您在这些流上创建的阅读器上的readLine()
方法只是被阻止,等待一些输入通过。您标记的行只会在chiplotle
应用程序退出后执行,此时它将关闭其流,readLine()
将获得null
。