Re: [R] Java and R help

From: John Wang <junwen2u_at_gmail.com>
Date: Thu 07 Jul 2005 - 23:33:21 EST


>Im doing an aplication in Java and i have a program made in R what i
>want to launch with Java.
>
>I have the following instructions:
>
>Runtime r = Runtime.getRuntime();
>
>try
>{
>
> System.out.println ("Llamada a R...");
> p = r.exec(sRutaR);
> }
> catch (IOException e)
> {
> System.out.println ("Error lanzando R: " + e.getMessage());
> e.printStackTrace();
> }
> catch (Exception ex)
> {
> System.out.println ("Error lanzando R!!!! " + ex.toString());
> ex.printStackTrace();
> }
>}
>
>and after that i wait for a file that R must to make called
>terminado.dat. But when i launch the process the file doesn't create
>until i destroy the process.
>
>can anyone explain what's happend with the process?
>
>Thx in advance and sorry for my poor english
>
The reason is that you did consume java output buffer, the process hanged until you clear them. Try to use following StreamGobbler.java to catch all the outputs:
//start of StreamGobbler.java
import java.util.*;
import java.io.*;

class StreamGobbler extends Thread
{

    InputStream is;
    String type;     

    StreamGobbler(InputStream is, String type)     {

        this.is = is;
        this.type = type;

    }     

    public void run()
    {

        try
        {
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String line=null;
            while ( (line = br.readLine()) != null)
                System.out.println(type + ">" + line);    
            } catch (IOException ioe)
              {
                ioe.printStackTrace();  
              }

    }
}
//end of StreamGobbler

then use this method to do system call:

    public boolean execWait(String comm){

        try{
            Process proc = Runtime.getRuntime().exec(comm);
            StreamGobbler errorGobbler = new
StreamGobbler(proc.getErrorStream(), "ERROR");
            
            // any output?
            StreamGobbler outputGobbler = new
StreamGobbler(proc.getInputStream(), "OUTPUT");
                
            // kick them off
            errorGobbler.start();
            outputGobbler.start();

            int returnVal = proc.waitFor();
            if (returnVal != 0) {
                return(false);
            }
        } catch (Exception e){
            e.printStackTrace();
            return false;
        }
        return true;

    }

Hope this helps,
Junwen



R-help@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html Received on Thu Jul 07 23:38:19 2005

This archive was generated by hypermail 2.1.8 : Fri 03 Mar 2006 - 03:33:20 EST