[R] Java and R help

John Wang junwen2u at gmail.com
Thu Jul 7 15:33:21 CEST 2005


>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




More information about the R-help mailing list