Imprimindo um Java InputStream de um processo

UPDATE: I found a crucial part to why this probably isn't working! I used System.setOut(out); where out is a special PrintStream to a JTextArea

Esse é o código, mas o problema que estou tendo é que a informação é impressa apenas depois que eu termino o processo.

 public Constructor() { main(); } private void main() { btnStart.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { ProcessBuilder builder = new ProcessBuilder("java", textFieldMemory.getText(), "-jar", myJar); Process process = builder.start(); InputStream inputStream = process.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream), 1); String line; while ((line = bufferedReader.readLine()) != null) { System.out.println(line); } inputStream.close(); bufferedReader.close(); } catch (IOException ioe) { ioe.printStackTrace(); } } }); } 

Saída atual:

 Line 1 Line 2 Line 3 Line 4 Line 5 

Esta é a saída correta, mas está sendo impressa apenas como um grande bloco quando eu termino o processo.

Alguém sabe qual é o problema? Se sim, você pode me ajudar a explicar por que isso está acontecendo, obrigado antecipadamente.

O processamento do stream de saída do processo em um encadeamento separado pode ajudar aqui. Você também deseja esperar explicitamente que o processo termine antes de continuar com sua lógica:

 ProcessBuilder builder = new ProcessBuilder("java", textFieldMemory.getText(), "-jar", myJar); final Process process = builder.start(); final Thread ioThread = new Thread() { @Override public void run() { try { final BufferedReader reader = new BufferedReader( new InputStreamReader(process.getInputStream())); String line = null; while ((line = reader.readLine()) != null) { System.out.println(line); } reader.close(); } catch (final Exception e) { e.printStackTrace(); } } }; ioThread.start(); process.waitFor(); 

Basicamente, a partir de que pouca informação existe, parece que você está executando o processo e lendo o InputStream de dentro do segmento de expedição de events.

Qualquer coisa para bloquear o EDT impedirá que ele processe solicitações de repintura, em vez disso, você deve usar algo como um SwingWorker que tenha funcionalidade para permitir que você atualize a UI com o EDT.

Dê uma olhada no Concurrency in Swing para mais detalhes

insira a descrição da imagem aqui

 import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.List; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.SwingWorker; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class PBDemo { public static void main(String[] args) throws Exception { new PBDemo(); } public PBDemo() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(new TestPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class TestPane extends JPanel { public TestPane() { setLayout(new BorderLayout()); JTextArea ta = new JTextArea(); add(new JScrollPane(ta)); new ProcessWorker(ta).execute(); } @Override public Dimension getPreferredSize() { return new Dimension(200, 200); } } public interface Consumer { public void consume(String value); } public class ProcessWorker extends SwingWorker implements Consumer { private JTextArea textArea; public ProcessWorker(JTextArea textArea) { this.textArea = textArea; } @Override protected void process(List chunks) { for (String value : chunks) { textArea.append(value); } } @Override protected Integer doInBackground() throws Exception { // Forced delay to allow the screen to update Thread.sleep(5000); publish("Starting...\n"); int exitCode = 0; ProcessBuilder pb = new ProcessBuilder("java.exe", "-jar", "HelloWorld.jar"); pb.directory(new File("C:\\DevWork\\personal\\java\\projects\\wip\\StackOverflow\\HelloWorld\\dist")); pb.redirectError(); try { Process pro = pb.start(); InputConsumer ic = new InputConsumer(pro.getInputStream(), this); System.out.println("...Waiting"); exitCode = pro.waitFor(); ic.join(); System.out.println("Process exited with " + exitCode + "\n"); } catch (Exception e) { System.out.println("sorry" + e); } publish("Process exited with " + exitCode); return exitCode; } @Override public void consume(String value) { publish(value); } } public static class InputConsumer extends Thread { private InputStream is; private Consumer consumer; public InputConsumer(InputStream is, Consumer consumer) { this.is = is; this.consumer = consumer; start(); } @Override public void run() { try { int in = -1; while ((in = is.read()) != -1) { // System.out.print((char) in); consumer.consume(Character.toString((char)in)); } } catch (IOException exp) { exp.printStackTrace(); } } } }