从java与Windows批处理文件(或外部程序)通信

时间:2011-08-06 22:15:36

标签: java windows

我知道有类似的线程,我已经全部阅读过了。然而,他们都没有任何帮助。

我有这个简单的批处理文件:

@echo off
set /p UserInput=Enter a number: 
echo Number was %UserInput%

我想从java运行这个批处理文件,将数字发送给它并获取输入。

我有一个奇怪的问题。我使用cmd / c启动批处理文件,打开输入和输出流,但它仍然无法正常工作。当我运行程序时,例如“cmd.exe”,它会返回打开CMD窗口时获得的实际输出:

  

Microsoft Windows ...版权所有(c)2009 Microsoft   公司。保留所有权利。

所以至少代码部分工作。但是当我使用"cmd /c C:\\test.bat"(其中test.bat是一个有效的批处理文件)时,它根本不会给我任何输出。

这是java代码。怎么了?

      import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.OutputStreamWriter;

    public class Test {

        private static BufferedReader bufIn;
        private static BufferedWriter printOut;
        private static Process p;

        public static void main(String[] args) throws IOException {

            Runtime rt = Runtime.getRuntime() ;

            p = rt.exec("cmd.exe /c C:\\test.bat");
            InputStream in = p.getInputStream() ;
            OutputStream out = p.getOutputStream ();

            bufIn = new BufferedReader(new InputStreamReader(in));
            printOut = new BufferedWriter(new OutputStreamWriter(out));

            int ch = 0;
            ch = bufIn.read();

            while (ch != 0) 
            {
                System.out.print((char) ch);
                ch = bufIn.read();
            }

            //send a command to 

            printOut.write("209");
            printOut.flush();

            while (ch != 0) 
            {
                System.out.print((char) ch);
                ch = bufIn.read();
            }



    //p.destroy() ;

    }


}

我应该得到:

Please enter a number:
Number was 209

编辑:我编辑了代码,因为它显然卡在readLine上而没有行:)

无论如何,我还是有问题。 我得到了:

Enter a number: 

,没有别的,几乎就像输出流根本不工作一样。

1 个答案:

答案 0 :(得分:0)

不要使用PrintWriter,而是尝试使用BufferedWriter包装的OutputStreamWriter:

printOut = new BufferedWriter(new OutputStreamWriter(out));

显然,您还需要将printOut更改为BufferedWriter。

看起来你正在以错误的顺序冲洗和打印给我,我会这样做:

printOut.println("209");
printOut.flush();

作为一个侧面,您可以在BufferedReader上使用readLine()而不仅仅是read()