Java I';我没有得到任何输出,可能机器挂起了代码
收到反馈后,我运行程序,但在控制台中没有得到任何输出Java I';我没有得到任何输出,可能机器挂起了代码,java,Java,收到反馈后,我运行程序,但在控制台中没有得到任何输出 import java.io.File; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.*; import java.io.InputStream; class pbdemo { static public void main(String[] args) throws Exception { Stri
import java.io.File;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.*;
import java.io.InputStream;
class pbdemo {
static public void main(String[] args) throws Exception {
String s;
ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/f", "dir");
pb.directory(new File("C:\\ljava"));
try {
Process pro = pb.start();
pro.waitFor();
BufferedReader br = new BufferedReader(new InputStreamReader(pro.getInputStream()));
while ((s = br.readLine()) != null) {
System.out.println("here we go" + s);
}
} catch (Exception e) {
System.out.println("sorry" + e);
}
}
}
程序运行但不输出。用于
CMD
的/F
标志用于文件完成。假设您希望使用/C
标志来执行该命令,这可能是安全的。如果没有/C
标志,cmd.exe
将交互运行,查找输入,并且您的程序将无限期地在waitFor
上阻塞。替换:
new ProcessBuilder("cmd.exe", "/f", "dir");
与
您正在等待进程完成,然后再尝试读取其输出。但很有可能,在你开始阅读之前,它可以完成所有输出的编写。。。因为操作系统无法将其全部缓冲。最终结果是死锁 更改代码,以便在读取所有输出后调用
pro.waitFor()
(也有可能会将内容写入“错误”流。但是,除非dir
命令出现严重的异常情况,否则它不太可能生成足够的错误输出以导致死锁。因此,可能可以忽略任何(假设的)错误输出…就像您当前所做的那样。)pro.waitFor()代码>是一种阻塞方法。它将等待进程退出后再返回。问题是,在读取/清除标准输出缓冲区之前,许多程序不会退出,这意味着,在您的情况下,它可能永远不会退出
试试这样吧
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
public class PBDemo {
public static void main(String[] args) throws Exception {
String s;
ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/c", "dir");
pb.directory(new File("C:\\ljava"));
pb.redirectError();
try {
Process pro = pb.start();
InputConsumer ic = new InputConsumer(pro.getInputStream());
System.out.println("...Waiting");
int exitCode = pro.waitFor();
ic.join();
System.out.println("Process exited with " + exitCode);
} catch (Exception e) {
System.out.println("sorry" + e);
}
}
public static class InputConsumer extends Thread {
private InputStream is;
public InputConsumer(InputStream is) {
this.is = is;
start();
}
@Override
public void run() {
// This is acutally a bad idea, not all process will write a new line ;)
// BufferedReader br = new BufferedReader(new InputStreamReader(pro.getInputStream()));
try {
int in = -1;
while ((in = is.read()) != -1) {
System.out.print((char) in);
}
} catch (IOException exp) {
exp.printStackTrace();
}
}
}
}
永远不要对标题使用所有的大写字母。您似乎在try块中有catch()。@Gus,除非它用COBOL标记。感谢您修改标题
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
public class PBDemo {
public static void main(String[] args) throws Exception {
String s;
ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/c", "dir");
pb.directory(new File("C:\\ljava"));
pb.redirectError();
try {
Process pro = pb.start();
InputConsumer ic = new InputConsumer(pro.getInputStream());
System.out.println("...Waiting");
int exitCode = pro.waitFor();
ic.join();
System.out.println("Process exited with " + exitCode);
} catch (Exception e) {
System.out.println("sorry" + e);
}
}
public static class InputConsumer extends Thread {
private InputStream is;
public InputConsumer(InputStream is) {
this.is = is;
start();
}
@Override
public void run() {
// This is acutally a bad idea, not all process will write a new line ;)
// BufferedReader br = new BufferedReader(new InputStreamReader(pro.getInputStream()));
try {
int in = -1;
while ((in = is.read()) != -1) {
System.out.print((char) in);
}
} catch (IOException exp) {
exp.printStackTrace();
}
}
}
}