user1058682
user1058682

Reputation: 11

java pipe/process builder not working with cmd.exe

here's my code it just opens a command prompt windows 7 and then sits. nothing else. i want it to send and receive commands obviously. so whats wrong??

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) {

}

Upvotes: 1

Views: 1024

Answers (2)

Hovercraft Full Of Eels
Hovercraft Full Of Eels

Reputation: 285405

You may want to do these things asynchronously on different threads, and you will definitely not want to ignore exceptions or the error stream.

But most important, you're not calling cmd correctly since by doing "cmd /c start cmd.exe" you're creating a process within a process.

For e.g.,

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

Upvotes: 1

MK.
MK.

Reputation: 34517

cmd start will launch a new command prompt window and your input and output buffers will not be connected to it.

Upvotes: 2

Related Questions