【问题标题】:I'm not getting any output and probably the machine hangs with the code [duplicate]我没有得到任何输出,并且机器可能与代码一起挂起[重复]
【发布时间】:2013-02-23 12:40:22
【问题描述】:

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

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

程序运行但没有输出。

【问题讨论】:

  • 标题不要全部大写
  • 你似乎在 try 块中有 catch()。
  • @Gus 除非用 COBOL 标记。
  • 感谢您修改标题

标签: java


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您正在等待进程完成,然后再尝试读取其输出。但是有可能它可以完成所有输出的写入,直到您开始阅读它……因为操作系统无法缓冲所有输出。最终结果,死锁。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-03
        • 2021-02-07
        • 1970-01-01
        相关资源
        最近更新 更多