Я пытаюсь создать консоль, например, 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;
}
}
Должен ли процесс принимать входные данные при запуске? Или он запускается и прослушивается для ввода? – Aaron
* "используя 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' для учета аргументов, которые сами содержат пробелы. –