3

Javaによって生成されたシェル内でBASHスクリプトを実行し、そのBASHスクリプトの結果をJTextAreaで表示しようとしています。

これが魔法が起こっている(と思われる)クラスです。

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();
    }



}

}

これが私のフレームのクラスです。

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);


}
}

実行時に表示されるのは、この「java.lang.UNIXProcess@509d5bae」だけです。これを適切に行う方法を知っている人はいますか?

4

2 に答える 2

0

このようなものを使用しInputStream て、BufferedReader出力を読み取ることができます

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

文字列に変換

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

適当にtry&をつけてください。catch

于 2013-10-13T03:24:08.677 に答える