java-写入缓冲区时从进程读取
我有一个程序,在其中我调用另一个单独的程序来做一些工作(让我们称之为子进程),子进程需要一些时间来完成每个任务,并在一个简单的控制台中显示进度 问题是,当我尝试使用BufferedReader读取控制台时,我自己的程序会等待子进程完成,然后再将每一行写入文本区域 下面是我用来阅读每一行的代码:java-写入缓冲区时从进程读取,java,Java,我有一个程序,在其中我调用另一个单独的程序来做一些工作(让我们称之为子进程),子进程需要一些时间来完成每个任务,并在一个简单的控制台中显示进度 问题是,当我尝试使用BufferedReader读取控制台时,我自己的程序会等待子进程完成,然后再将每一行写入文本区域 下面是我用来阅读每一行的代码: JTextArea report = new JTextArea(20,40); report.setText(""); try {
JTextArea report = new JTextArea(20,40);
report.setText("");
try
{
Process p = new ProcessBuilder(command).start();
p.waitFor();
BufferedReader reader=new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = reader.readLine();
while(line!=null)
{
report.append(line+"\n");
line=reader.readLine();
}
}
catch(IOException e1){ error.setText("Failed to run toxpack");}
catch(InterruptedException e2) {error.setText("Failed to run command");}
我试着研究线程,但仍然不起作用
如何在不等待整个子过程完成的情况下读取每一行并将其添加到文本区域
编辑:添加了代码的其余部分,但我不确定它是否有多大帮助。
我想说的是,我希望子进程输出的每一行都出现在我的文本区域中。不必等待它完成。您应该创建另一个线程来读取进程,并更新Swing组件:
final Process p = new ProcessBuilder("cat", "/etc/hosts").start();
final BufferedReader br = new BufferedReader(new InputStreamReader(
p.getInputStream()));
final Runnable r = new Runnable() {
@Override
public void run() {
try {
try {
for (String line = br.readLine(); line != null; line = br
.readLine()) {
final String l = line;
System.out.println(l);
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
textArea.setText(textArea.getText() + "\n" + l);
}
});
Thread.sleep(50);
}
} finally {
br.close();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
};
final Thread t = new Thread(r);
t.start();
现在,在读卡器线程中连续读取这些行,并使用EventQueue.invokeLater将对Swing的更新发布到Swing的事件队列中,因为读取不是在Swing的事件调度线程中完成的(详细信息:)
睡眠
只是让它慢一点(模拟数据缓慢流入)
连同
public class TextAreaDemo {
public static void main(String[] args) {
final JTextArea textArea = new JTextArea(60, 5);
final JScrollPane sp = new JScrollPane(textArea,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS) {
@Override
public Dimension getPreferredSize() {
return new Dimension(600, 300);
}
};
final JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(sp);
frame.pack();
frame.setVisible(true);
// Add the reader snippet here
}
}
它将更新文本区域中的值。您需要提供更多代码或更好的解释您发布的代码不够。我的代码中没有更多内容。我只是运行第二个程序,并尝试读取它输出的每一行。您必须使用单独的线程来处理输出(或使用单独的线程等待进程完成)。如果你的UI需要保持响应,你需要两个独立的线程。我试着在一个新线程中加入几个不同的部分。结果还是一样,我试过了。还是一样的结果。当子进程运行时,文本区域中不会出现任何内容。我已经发布了剩余部分。您是否已删除代码中的waitFor()
?您是否尝试过使用一个进程来测试它,该进程实际上不需要输入就可以生成某些东西(如cat/etc/hosts
)?顺便问一下,您的程序是否需要来自调用Java程序的任何输入?什么都不起作用。我开始认为这是子进程的错误。感谢您的帮助如果您只是在命令行中键入子进程的命令,会发生什么?它是否向标准输出写入内容?到底是什么节目?