2013-09-22 1 views
0

Я пытаюсь создать консоль, например, java-приложение для запуска другой java-программы, используя Runtime.getRuntime.exec(). Вход в процесс должен быть задан с помощью JTextField. Но процесс запускается перед подачей ввода. Как заставить процесс ждать ввода из текстового поля?Предоставление ввода для процесса в java с использованием getOutputStream()

package org.peditor; 

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 


public class RunProg extends JFrame implements ActionListener { 


private static final long serialVersionUID = 1L; 
private String line="",editorString=""; 
final JTextField intext = new JTextField(25); 
JTextArea outtext = new JTextArea(20,40); 

public RunProg (String fileName){ 
    JPanel cp = new JPanel(new BorderLayout()); 
    intext.addActionListener(this); 
    outtext.setEditable(false); 
    intext.setEditable(true); 
    JScrollPane sp = new JScrollPane(outtext); 
    cp.add(sp,BorderLayout.WEST); 
    cp.add(intext,BorderLayout.SOUTH); 
    this.setContentPane(cp); 
    this.setVisible(true); 
    this.pack(); 
    this.setLocationRelativeTo(null); 
    this.setTitle("*************OUTPUT CONSOLE***********"); 
    try 
    { 
     Runtime r = Runtime.getRuntime(); 
     Process p = null; 
     //Stripping the file extension 
     fileName = fileName.substring(0, fileName.lastIndexOf("."));    
     p = r.exec("java "+fileName); 
     BufferedReader inputStream = new BufferedReader(new InputStreamReader(p.getInputStream())); 
     BufferedReader errStream = new BufferedReader(new InputStreamReader(p.getErrorStream())); 
     OutputStream childin = p.getOutputStream(); 
     BufferedWriter childWriter = new BufferedWriter(new OutputStreamWriter(childin)); 
     childWriter.write(getInput()); 
     childWriter.newLine(); 
     childWriter.flush(); 
     childin.close(); 

     while ((line = inputStream.readLine())!=null) 
     { 
      editorString = editorString+line+"\n"; 
      outtext.append(editorString); 
     } 
     while ((line = errStream.readLine())!=null) 
     { 
      editorString = editorString+line+"\n"; 
      outtext.append("ERROR"+"\n"+editorString); 
     } 
     p.waitFor(); 
     inputStream.close(); 
     errStream.close(); 
    } 
    catch(Exception e1) 
    { 
     outtext.setText("Error running the program "+e1.getMessage()); 
    } 

} 
public void actionPerformed(ActionEvent e) { 
    getInput(); 

} 
private String getInput() { 
    String s = intext.getText(); 
    intext.setText(""); 
    outtext.append(s+"\n"); 
    return s; 
} 

}

+0

Должен ли процесс принимать входные данные при запуске? Или он запускается и прослушивается для ввода? – Aaron

+0

* "используя Runtime.getRuntime.exec()." * Sheesh. Присоединяйтесь к нам в этом тысячелетии и используйте 'ProcessBuilder'. В более общем смысле. Прочитайте (и внесите) * все * рекомендации [Когда Runtime.exec() не будет] (http://www.javaworld.com/jw-12-2000/jw-1229-traps.html). Это может решить проблему. Если нет, он должен предоставить дополнительную информацию о причине отказа. Затем проигнорируйте, что он ссылается на 'exec' и создает' Process' с помощью 'ProcessBuilder'. Также разбивайте 'String arg' на' String [] args' для учета аргументов, которые сами содержат пробелы. –

ответ

0

Вы звоните ехес метод в конструкторе. Очевидно, это не сработает. У вас также есть случайный actionPerformed, который абсолютно ничего не делает. Удалите все материалы Runtime из вашего конструктора, добавьте JButton, добавьте actionListener в этот JButton и выполните код выполнения, когда они нажмут на эту кнопку.