Solved

Runtime.getRuntime().exec()  problem

Posted on 2006-11-06
6
294 Views
Last Modified: 2010-03-31
I am having difficulty getting Runtime.getRuntime().exec() to work.
If I run the java program (which calls an external fortran program), all goes well in the sense that there are no errors, but nothing seems to happen.  If I debug and stop execution after the exec() line, p.hasExited = true and p.exitcode = 127.  The fortran proglram, when executed from a command line, outputs a few lines of text and also writes 2 output files. I don't see either of these happening when attemting to execute from the java program. The line "System.out.println(line);" is never accessed.  I have checked and double-checked my command line for accuracy.  Code below.  Running on linux, fwtw.

public void runProgram (String cwd, String commandLine)
{
  // current working directory (where external program resides)
  File filecwd = new File(cwd);
  String[] environmentVariables = {""};

   try
   {
     String line;
     Process p = Runtime.getRuntime().exec(commandLine,
                                                                               environmentVariables, // empty
                                                                               filecwd);
          
     BufferedReader input = new BufferedReader (new InputStreamReader(p.getInputStream()));  
     // BufferedWriter output = new BufferedWriter(new OutputStreamWriter(p.getOutputStream())); // ?
          
     while ((line = input.readLine()) != null)
     {
        System.out.println(line);
     }
     input.close();
     }
    catch (Exception err)
    {
       err.printStackTrace();
     }
}
0
Comment
Question by:allelopath
  • 3
  • 2
6 Comments
 
LVL 86

Assisted Solution

by:CEHJ
CEHJ earned 150 total points
ID: 17882458
0
 
LVL 1

Author Comment

by:allelopath
ID: 17882726
I don't see a solution here, some parts I've covered, and some parts are focussed on Windows.
0
 
LVL 86

Accepted Solution

by:
CEHJ earned 150 total points
ID: 17882775
The most important part concerns the necessity (nearly always) of using separate threads to read the streams
0
Free Tool: Postgres Monitoring System

A PHP and Perl based system to collect and display usage statistics from PostgreSQL databases.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
LVL 24

Assisted Solution

by:sciuriware
sciuriware earned 100 total points
ID: 17883132
As a first improvement add after:

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

the next statement:

         p.waitFor();

The next improvement is to create 1 or 2 threads (input from the process or in/output both),
that write what you want to input by the process and collect what it wrote to you.

      Xq outputThread = new Xq(p.getInputStream());  // A class that collects the incoming input in itself.
      outputThread.start();

       p.waitFor();                                                      // Wait for the process to end
       outputThread.join();                                          // Wait for the reader thread to get all data (till EOF)

       String result = outputThread.getOutput();            // A 'getter' in the Xq class to release its collected data, String in this example.

This should work fine,

;JOOP!
0
 
LVL 1

Author Comment

by:allelopath
ID: 17884550
thanks
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 17885198
:-)
0

Featured Post

Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Custom Java Application connects to database: Which one of the 20? 4 35
ejb mdb examples 1 8
java example issue 3 23
collection output issue 9 37
Java contains several comparison operators (e.g., <, <=, >, >=, ==, !=) that allow you to compare primitive values. However, these operators cannot be used to compare the contents of objects. Interface Comparable is used to allow objects of a cl…
This was posted to the Netbeans forum a Feb, 2010 and I also sent it to Verisign. Who didn't help much in my struggles to get my application signed. ------------------------- Start The idea here is to target your cell phones with the correct…
Viewers learn about the third conditional statement “else if” and use it in an example program. Then additional information about conditional statements is provided, covering the topic thoroughly. Viewers learn about the third conditional statement …
Viewers will learn about the regular for loop in Java and how to use it. Definition: Break the for loop down into 3 parts: Syntax when using for loops: Example using a for loop:

860 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question