J'ai jamais fait exactement ce que tu cherches à faire, mais je te mets le code d'une fonction qui recopie le contenu d'un stream vers un autre (ma log en l'occurence) au fur et à mesure :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| private void createStreamThread(final InputStream is, final OutputStream os) {
curThread = new Thread(new Runnable() {
public void run() {
BufferedInputStream bis = new BufferedInputStream(is);
BufferedOutputStream bos = null;
if(os != null)
{
bos = new BufferedOutputStream(os);
}
byte[] data = new byte[2048];
int nbRead = 0;
try
{
while(curThread.isAlive() &&(nbRead = bis.read(data)) > 0)
{
if(bos != null){
if(finished){
break;
}
bos.write(data, 0, nbRead);
bos.flush();
}
Thread.sleep(500);
}
//stopTimer();
} catch(IOException ioe) {
ioe.printStackTrace();
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
});
curThread.start();
} |
et je l'appellais comme ça :
createStreamThread(p.getInputStream(),logOutputStream);
Je pense que le pb vient du faite que tu raisonnes en lignes de charactères.
Or rien ne t'assure que le process ne cessera pas d'envoyer des charactères avant d'envoyer un retour à la ligne. Donc faire un appel à reader.readLine() va bloquer le thread en lecture et n'exectura jamais la suite.
C'est pour ça que je pense qu'il faut raisonner en terme de flux d'octet avec des BufferedInputStream.
Ensuite il faut reconstituer la chaine de charactère à l'aide des octets lus jusqu'ici pour la comparer avec la chaine d'annonce. Lorsque le test sera valide tu devrais pouvoir ecrire dans le outputstream du process le mot de passe.
Voila, bon courage.
Sinon pour ton erreur, il y a une coquille :
1 2 3 4 5
| while ((line = reader.readLine()) != null)
{
//maListe.add(reader.readLine()); tu lis la ligne suivante qui peut être null
maListe.add(line);
} |
Partager