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 /c start cmd.exe」を実行することでプロセス内にプロセスを作成しているため、cmd を正しく呼び出していないことです。

たとえば、

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 に答える