Solved

Runtime.getRuntime().exec()  problem

Posted on 2006-11-06
6
296 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
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
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

On Demand Webinar - Networking for the Cloud Era

This webinar discusses:
-Common barriers companies experience when moving to the cloud
-How SD-WAN changes the way we look at networks
-Best practices customers should employ moving forward with cloud migration
-What happens behind the scenes of SteelConnect’s one-click button

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
numbers ascending pyramid 101 236
difference of if loops 23 68
JDBC performance 8 28
Java array 10 55
Introduction This article is the second of three articles that explain why and how the Experts Exchange QA Team does test automation for our web site. This article covers the basic installation and configuration of the test automation tools used by…
In this post we will learn different types of Android Layout and some basics of an Android App.
Viewers will learn about the different types of variables in Java and how to declare them. Decide the type of variable desired: Put the keyword corresponding to the type of variable in front of the variable name: Use the equal sign to assign a v…
The viewer will learn how to implement Singleton Design Pattern in Java.

685 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