-10

得到反馈后,我运行程序但在控制台中没有输出

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);
        }
    }
}

程序运行但没有输出。

4

3 回答 3

1

用于文件完成的/F标志。CMD假设您希望/C标志执行命令可能是安全的。如果没有该/C标志,cmd.exe将交互式运行,寻找输入,您的程序将无限期地阻塞在waitFor. 代替:

new ProcessBuilder("cmd.exe", "/f", "dir");

new ProcessBuilder("cmd.exe", "/c", "dir");
于 2013-03-08T03:15:28.070 回答
1

在尝试读取其输出之前,您正在等待该过程完成。但是有可能它可以完成所有输出的写入,直到您开始阅读它……因为操作系统无法缓冲所有输出。净结果,僵局。

更改代码,以便在pro.waitFor()您读取所有输出后进行调用。

(也有可能将内容写入“错误”流。但除非dir命令发生严重奇怪的事情,否则它不太可能生成足够的错误输出以导致死锁。所以可能可以只是忽略任何(假设的)错误输出......就像你目前正在做的那样。)

于 2013-03-08T03:15:59.617 回答
1

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();
            }
        }

    }

}
于 2013-03-08T03:19:02.023 回答