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

    }

}