Olá pessoal. Estou com uma dúvida de como usar o Runtime.getRuntime().exec("") e waitFor() corretamente.
Vou explicar o que quero fazer para então poder explicar o problema.
Preciso fazer uma interface em Java que rode um script em perl quando aperto um botão. Essa parte está OK.
O script em Perl que vou executar demora um bom tempo até terminar a execução então pensei em colocar um label que avise o status da operação. Ex: Enquanto o script está sendo executado aparece uma mensagem “Executando…aguarde.” e depois de realizado todo o processo aparece “Realizado com sucesso…”
Aqui aparece o problema…
No primeiro teste que fiz, eu esqueci a parte do label e apenas uso System.out.println e funciona…quando eu aperto o botao ele escreve “Rodando”…e quando termina escreve “Feito”…ok . Segue o evento do botão no primeiro teste (usando System.out.println):
private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
System.out.println("Rodando...\n");
try {
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec("perl /home/felipe/for.pl");
InputStream stdin = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(stdin);
BufferedReader br = new BufferedReader(isr);
String line = null;
System.out.println("<OUTPUT>");
while ((line = br.readLine()) != null) {
System.out.println(line);
}
System.out.println("</OUTPUT>");
try {
int exitVal = proc.waitFor();
System.out.println("Process exitValue: " + exitVal);
} catch (InterruptedException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println("Rodou...");
} catch (IOException e) {
e.printStackTrace();
}
}
Como funcionou com o System.out.println, tentei fazer com que as mensagens aparecessem no label. Coloquei o nome “status” no label. Segue o código:
private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
status.setText("Rodando...");
try {
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec("perl /home/felipe/for.pl");
InputStream stdin = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(stdin);
BufferedReader br = new BufferedReader(isr);
String line = null;
System.out.println("<OUTPUT>");
while ((line = br.readLine()) != null) {
System.out.println(line);
}
System.out.println("</OUTPUT>");
try {
int exitVal = proc.waitFor();
System.out.println("Process exitValue: " + exitVal);
} catch (InterruptedException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
status.setText("Rodou...");
} catch (IOException e) {
e.printStackTrace();
}
}
Desse ultimo jeito não aparece a mensagem “Rodadando…”. Aparece a mensagem “Rodou” direto quando termina a execução.
Porque deu certo com System.out.println e com o status.setText("") não?
Obs: Estou usando o Netbeans 6.5 no Linux