3

我正在尝试在 Java 生成的 shell 中运行 BASH 脚本,然后使用 JTextArea 显示所述 BASH 脚本的结果。

这是(应该)发生魔法的课程。

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

3

Process不会覆盖toString()继承自的默认方法,Object因此它为什么显示该值。

相反,您可以使用getInputStream(),这将返回一个InputStream对象,您可以将其转换为这样的字符串:读取/将 InputStream 转换为 String

也不要忘记(事件调度线程)上的任务必须快速完成;如果他们不这样做,未处理的事件会备份并且用户界面变得无响应,因此请确保您使用另一个线程。EDT

于 2013-10-13T03:00:37.483 回答
0

您可以使用InputStream 和 aBufferedReader来读取输出,类似这样

 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 回答