运行时执行不显示结果
Runtime exec doesn't show results
我正在尝试使用以下代码在 netbeans 中获取 java 命令的结果:
Runtime rt = Runtime.getRuntime();
Process p = null;
try {
String cmd = "javac";
// OR String cmd = "cmd /c javac";
// OR String cmd = "java -cp myjar com.my.sample";
p = rt.exec(cmd);
p.waitFor();
BufferedReader br=new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch(Exception e){
//
}
并期望有以下输出,但它在控制台中没有显示任何内容。
Usage: javac
where possible options include:
-g Generate all debugging info
-g:none Generate no debugging info
-g:{lines,vars,source} Generate only some debugging info
-nowarn Generate no warnings
java -cp my.jar com.my.sample
Hello Sample Text
有两个系统相关的东西。
首先,在读取程序输出之前,您正在等待 p.waitFor()
过程完成。当管道容量耗尽时,这可能会永远阻塞,因为程序只有在写入所有输出后才能完成。管道的实际容量取决于系统且未指定。
此外,由于不提供参数是一种错误情况,因此消息可能已写入错误流而不是标准输出。在那种情况下,您将不得不阅读 p.getErrorStream()
而不是 p.getInputStream()
(在我的系统上,情况并非如此)。
所以,你可以试试
Runtime rt = Runtime.getRuntime();
try {
String cmd = "javac";
// OR String cmd = "cmd /c javac";
// OR String cmd = "java -cp myjar com.my.sample";
Process p = rt.exec(cmd);
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
p.waitFor();
} catch(Exception e){
e.printStackTrace();
}
如果它在没有打印任何内容的情况下完成,请尝试 p.getErrorStream()
而不是 p.getInputStream()
。
但是如果你只想将子进程的输出打印到控制台,你可以做得更好:
try {
String cmd = "javac";
// OR String cmd = "cmd /c javac";
// OR String cmd = "java -cp myjar com.my.sample";
Process p = new ProcessBuilder(cmd).inheritIO().start();
p.waitFor();
} catch(Exception e){
e.printStackTrace();
}
这会将您的输入和输出通道连接到子进程的输入和输出通道。所以你不需要为这种情况处理管道。
但是如果你真的想在你的程序中处理输出,即打印只是一个例子,ProcessBuilder
还有一个有趣的选项:
try {
String cmd = "javac";
// OR String cmd = "cmd /c javac";
// OR String cmd = "java -cp myjar com.my.sample";
Process p = new ProcessBuilder(cmd).redirectErrorStream(true).start();
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
p.waitFor();
} catch(Exception e){
e.printStackTrace();
}
通过使用 redirectErrorStream(true)
,您告诉它把任何错误输出写入与标准输出相同的通道,因此只有一个输出需要处理。
我正在尝试使用以下代码在 netbeans 中获取 java 命令的结果:
Runtime rt = Runtime.getRuntime();
Process p = null;
try {
String cmd = "javac";
// OR String cmd = "cmd /c javac";
// OR String cmd = "java -cp myjar com.my.sample";
p = rt.exec(cmd);
p.waitFor();
BufferedReader br=new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch(Exception e){
//
}
并期望有以下输出,但它在控制台中没有显示任何内容。
Usage: javac where possible options include: -g Generate all debugging info -g:none Generate no debugging info -g:{lines,vars,source} Generate only some debugging info -nowarn Generate no warnings
java -cp my.jar com.my.sample
Hello Sample Text
有两个系统相关的东西。
首先,在读取程序输出之前,您正在等待 p.waitFor()
过程完成。当管道容量耗尽时,这可能会永远阻塞,因为程序只有在写入所有输出后才能完成。管道的实际容量取决于系统且未指定。
此外,由于不提供参数是一种错误情况,因此消息可能已写入错误流而不是标准输出。在那种情况下,您将不得不阅读 p.getErrorStream()
而不是 p.getInputStream()
(在我的系统上,情况并非如此)。
所以,你可以试试
Runtime rt = Runtime.getRuntime();
try {
String cmd = "javac";
// OR String cmd = "cmd /c javac";
// OR String cmd = "java -cp myjar com.my.sample";
Process p = rt.exec(cmd);
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
p.waitFor();
} catch(Exception e){
e.printStackTrace();
}
如果它在没有打印任何内容的情况下完成,请尝试 p.getErrorStream()
而不是 p.getInputStream()
。
但是如果你只想将子进程的输出打印到控制台,你可以做得更好:
try {
String cmd = "javac";
// OR String cmd = "cmd /c javac";
// OR String cmd = "java -cp myjar com.my.sample";
Process p = new ProcessBuilder(cmd).inheritIO().start();
p.waitFor();
} catch(Exception e){
e.printStackTrace();
}
这会将您的输入和输出通道连接到子进程的输入和输出通道。所以你不需要为这种情况处理管道。
但是如果你真的想在你的程序中处理输出,即打印只是一个例子,ProcessBuilder
还有一个有趣的选项:
try {
String cmd = "javac";
// OR String cmd = "cmd /c javac";
// OR String cmd = "java -cp myjar com.my.sample";
Process p = new ProcessBuilder(cmd).redirectErrorStream(true).start();
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
p.waitFor();
} catch(Exception e){
e.printStackTrace();
}
通过使用 redirectErrorStream(true)
,您告诉它把任何错误输出写入与标准输出相同的通道,因此只有一个输出需要处理。