Vanitas
Vanitas

Reputation: 903

Display BASH result with Java

I'm trying to run a BASH script inside a shell spawned by Java and then display the results of said BASH script with a JTextArea.

Here is the class where the magic is (supposed to be) happening.

import java.io.IOException;

public class Bobsors {

public static Mainframe frame;

public static void main(String[] args) {

    frame = new Mainframe();
    frame.start();

    run();

}

public static void run() {

    String[] cmd = new String[]{"/bin/sh", "PATH=~/Desktop/bobsors.sh"};
    try {
        Process process = Runtime.getRuntime().exec(cmd);
        frame.setLog(process);
    } catch (IOException e) {
        e.printStackTrace();
    }



}

}

And this is the class for my frame.

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JTextArea;
import javax.swing.JLabel;
import javax.swing.border.TitledBorder;

@SuppressWarnings("serial")
public class Mainframe extends JFrame {

private JPanel contentPane;

public static Mainframe frame;
public static JTextArea log = new JTextArea();

/**
 * Launch the application.
 */
public void start() {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                frame = new Mainframe();
                frame.setVisible(true);
                frame.setTitle("Bobsors Java Application.");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}



public void setLog(Process process) {
    log.setText(process.toString());
}


/**
 * Create the frame.
 */
public Mainframe() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 450, 300);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);

    JPanel panel = new JPanel();
    panel.setBorder(new TitledBorder(null, "Shell Log", TitledBorder.LEADING, TitledBorder.TOP, null, null));
    panel.setBounds(7, 50, 434, 217);
    contentPane.add(panel);
    panel.setLayout(null);

    log.setBounds(5, 17, 424, 210);
    log.setEditable(false);
    panel.add(log);

    JLabel lblBobsors = new JLabel("Bobsors");
    lblBobsors.setBounds(12, 12, 70, 15);
    contentPane.add(lblBobsors);

    JLabel lblWorksOnLinux = new JLabel("Works on Linux only");
    lblWorksOnLinux.setBounds(12, 26, 203, 15);
    contentPane.add(lblWorksOnLinux);


}
}

When running the only thing that gets displayed is this "java.lang.UNIXProcess@509d5bae" Does anyone know how to properly do this?

Upvotes: 3

Views: 316

Answers (2)

0x6C38
0x6C38

Reputation: 7076

Process doesn't override the default toString() method inherited from Object hence why its displaying that value.

Instead you can use getInputStream(), which will return an InputStream object which you can convert to a string like this: Read/convert an InputStream to a String.

Also don't forget tasks on the EDT (event dispatch thread) must finish quickly; if they don't, unhandled events back up and the user interface becomes unresponsive, so make sure you use another thread.

Upvotes: 3

lazyprogrammer
lazyprogrammer

Reputation: 629

You can use, InputStream and a BufferedReader to read output, something like this

 InputStream input = process.getInputStream();
 BufferedReader result = new BufferedReader(new InputStreamReader(input));

Convert to String

 StringBuilder builder = new StringBuilder();
 String line="";
 while((line=result.readLine()) != null){
     builder.append(line + "\n");
 }

Please add try & catch appropriately.

Upvotes: 0

Related Questions