Inserir comando em InputStream - Possível?

1 resposta
S

Hail a todos.

Estou trabalhando com Java/CouchDB e tenho a seguinte situação:

  • Com o evento de um JButton quero dar start no servidor executando um .bat, a princípio criei um método para execução do mesmo, compilando a aplicação na hora em que eu clicava no botão minha aplicação travava, ou seja, o runtime ficava encima da execução do .bat, dessa forma nunca iria conseguir manipular o restante da aplicação.
    Como solução criei uma tread na qual fica responsável pela execução do meu .bat, tudo funcionou perfeitamente do jeito que eu queria.

Agora entra a questão da minha dúvida, da mesma forma que tenho uma JButton para start do server, preciso de um JButton para parar o .bat, ja tentei dar interrupt na thread mas mesmo assim o processo não para, foi então que tive em mente a seguinte ideia:

  • É possível no InputStream do meu processo eu inserir o comando Ctrl+C, a letra S e depois ENTER para que assim o .bat pare de executar?

Segue codificação da minha thread:

package com.fourspaces.couchdb.util;

import java.io.IOException;
import java.io.InputStream;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author samuel.silveira
 */
public class MyThread extends Thread {

    private Process p = null;
    private Runtime r = null;
    private String path = "C:\\Program Files (x86)\\Apache Software Foundation\\CouchDB\\bin\\couchdb.bat";
    
    public void stopProcess(){
        byte[] b = new byte[] {3};
        try {
            p.getInputStream().read(b);
        } catch (IOException ex) {
            Logger.getLogger(MyThread.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    public MyThread() {}
    
    @Override
    public void run(){
        try{                       
            p = r.getRuntime().exec(path);
            while(!Thread.interrupted()) {                
                InputStream in = p.getInputStream();
                int ch;
                while ((ch = in.read()) != -1) {
                    System.out.print((char)ch);
                }
            }
                        
        } catch (IOException ex) {
            Logger.getLogger(MyThread.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

Desde já agradeço.

1 Resposta

S

Resolvido.

Achei o comando, entretanto o Java não estava reconhecendo como input Ctrl + C, então eu simplesmente fechei a Stream dando .close(). Dessa forma meu .bat para de funcionar.

Criado 4 de outubro de 2012
Ultima resposta 5 de out. de 2012
Respostas 1
Participantes 1