在java程序中运行时从控制台写入和读取数据

时间:2016-11-29 05:38:25

标签: java shell console command processbuilder

我有一个shell脚本,它有一些命令,其中一个命令期望在运行时输入一些数据。我正在使用exec()方法运行此shell脚本。目前,如果要求输入,我手动输入数据。以下是我的代码,

            Process p = Runtime.getRuntime().exec("myshellscript");

            BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));

            BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));

            // read the output from the command
            System.out.println("Here is the standard output of the command:\n");
            while ((s = stdInput.readLine()) != null) {
                System.out.println(s);
            }

           // read any errors from the attempted command
            System.out.println("Here is the standard error of the command (if any):\n");
            while ((s = stdError.readLine()) != null) {
                System.out.println(s);
            }

            System.exit(0);

我想要做的是每当控制台输入数据时,应该由java程序输入,然后继续我的进一步java程序。

1 个答案:

答案 0 :(得分:2)

这就是我的所作所为:

  1. 创建两个将从p.getInputStream()和p.getErrorStream()读取的线程,
  2. 在p.getOutputStream(),
  3. 中写入数据
  4. 等待两个线程终止(使用join()方法)
  5. 编辑:

    public class Main {
        private static final Logger LOG = Logger.getLogger(Main.class.getName());
    
        public static void main(String[] args) {
            try {
                Process p = Runtime.getRuntime().exec("myshellscript");
                Thread outHandler = new OutputHandler(p.getInputStream(), "UTF-8");
                outHandler.setDaemon(true);
                outHandler.start();
                Thread errHandler = new OutputHandler(p.getErrorStream(), "UTF-8");
                errHandler.setDaemon(true);
                errHandler.start();
                sendInput(p, "the input data", "UTF-8");
                int result = p.waitFor();
                outHandler.join();
                errHandler.join();
                System.out.println("exit code: " + result);
            } catch (IOException ex) {
                LOG.log(Level.SEVERE, null, ex);
            } catch (InterruptedException ex) {
                LOG.log(Level.SEVERE, null, ex);
            }
        }    
    
    private void sendInput(Process process, String input, String encoding)
            throws IOException {
    
        try (OutputStream stream = process.getOutputStream();
                Writer writer = new OutputStreamWriter(
                        stream, encoding == null ? "UTF-8" : encoding);
                PrintWriter out = new PrintWriter(writer)) {
            if (input != null) {
                Reader reader = new StringReader(input);
                BufferedReader in = new BufferedReader(reader);
                String line = in.readLine();
                while (line != null) {
                    out.println(line);
                    line = in.readLine();
                }
            }
        }
    }
    
        private static class OutputHandler extends Thread {
            private BufferedReader in;
    
            private OutputHandler(InputStream in, String encoding)
                    throws UnsupportedEncodingException {
                this.in = new BufferedReader(new InputStreamReader(
                        in, encoding == null ? "UTF-8" : encoding));
            }
    
            @Override
            public void run() {
                try {
                    String s = in.readLine();
                    while (s != null) {
                        System.out.println(s);
                        s = in.readLine();
                    }
                } catch (IOException ex) {
                    LOG.log(Level.SEVERE, null, ex);
                } finally {
                    try {
                        in.close();
                    } catch (IOException ex) {
                        LOG.log(Level.SEVERE, null, ex);
                    }
                }
            }
        }
    }