1

这是我的代码,它只是打开一个命令提示符 Windows 7,然后坐下。没有其他的。我希望它显然可以发送和接收命令。那怎么了??

String line;
try {
    Process p = Runtime.getRuntime().exec("cmd /c start cmd.exe");
    BufferedReader inp =
        new BufferedReader(
            new InputStreamReader(p.getInputStream()));
    BufferedWriter out =
        new BufferedWriter(
            new OutputStreamWriter(p.getOutputStream()));
    out.append("sometext");
    out.write("Some Text!\n\n");
    out.flush();
    line = inp.readLine();
    System.out.println("response1: " + line );   // that's ok
    out.write("Second Line...\n");
    out.flush();
    line = inp.readLine();
    // returns an empty string, if it returns...
    System.out.println("response2: " + line);    
    inp.close();
    out.close();
} catch (IOException io) {

}
4

2 回答 2

2

cmd start 将启动一个新的命令提示符窗口,您的输入和输出缓冲区将不会连接到它。

于 2012-05-28T19:11:02.090 回答
1

您可能希望在不同的线程上异步执行这些操作,并且您绝对不想忽略异常或错误流。

但最重要的是,您没有正确调用 cmd,因为通过执行“cmd /c start cmd.exe”,您正在进程中创建一个进程。

例如,

import java.io.*;

public class OpenCmd {
   public static void main(String[] args) {
      try {
         // Process p = Runtime.getRuntime().exec("cmd /c start cmd.exe");
         Process p = Runtime.getRuntime().exec("cmd.exe");
         final BufferedReader inp = new BufferedReader(new InputStreamReader(
               p.getInputStream()));
         final BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
               p.getOutputStream()));
         final BufferedReader err = new BufferedReader(new InputStreamReader(
               p.getErrorStream()));

         new Thread(new Runnable() {
            public void run() {
               try {
                  out.append("sometext");
                  out.write("Some Text!\n\n");
                  out.flush();
                  out.write("Second Line...\n");
                  out.flush();
               } catch (IOException e) {
                  e.printStackTrace();
               } finally {
                  try {
                     out.close();
                  } catch (IOException e) {
                     e.printStackTrace();
                  }
               }
            }
         }).start();
         new Thread(new Runnable() {
            public void run() {
               try {
                  String line = "";
                  while ((line = inp.readLine()) != null) {
                     System.out.println("response1: " + line);
                  }

               } catch (IOException e) {
                  e.printStackTrace();
               } finally {
                  try {
                     inp.close();
                  } catch (IOException e) {
                     e.printStackTrace();
                  }
               }
            }
         }).start();
         new Thread(new Runnable() {
            public void run() {
               try {
                  String line = "";
                  while ((line = err.readLine()) != null) {
                     System.err.println("err: " + line);
                  }
                  inp.close();
               } catch (IOException e) {
                  e.printStackTrace();
               }
            }
         }).start();
         int exitVal = p.waitFor();
         System.out.println("exitVal := " + exitVal);

      } catch (IOException io) {
         io.printStackTrace();
      } catch (InterruptedException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }
   }
}
于 2012-05-28T18:59:41.750 回答