Code bloque lorsqu'on ne ferme pas les flux

Fermé
lea.soineca - Modifié par lea.soineca le 9/04/2014 à 17:19
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 11 avril 2014 à 18:02
Bonjour,

J'ai les flux d'entrée et de sortie en globale d'un objet Process.
Ce Process attend une entrée, une chaine de caractère et lorsqu'il la reçoit, il renvoit la même chaine mais transformé ou pas. Ensuite, il attend encore une autre chaine de caractère.
Par exemple :
entrée -> sortie
"coucou" -> "coucou"
"stop" -> "stop commande received"
...

Donc, dans ma fonction writeStream(), je vais écrire le texte que je veux envoyer, par exemple "stop" et ma fonction readStream() va lire la réponse qui est "stop commande received" et ainsi de suite, writeStream(), readStream(), indéfiniment
C'est pour cela que je ne veux pas fermer mes flux, sinon je vais devoir à chaque fois les réinitialiser, ce qui est une perte de temps en exécution.

Mais, comme je ne ferme pas le writer dans writeStream(), dans readStream() le code bloque au moment de la lecture (dans le while)

Pourquoi?
Et comment corriger?


private Reader reader;
private Writer writer;

public String readStream() throws IOException {
StringBuilder sb = new StringBuilder();
char[] cbuf = new char[8192];
int len;
while ( (len=reader.read(cbuf)) > 0 ) {
sb.append(cbuf, 0, len);
}
// reader.close();
return sb.toString();
}

public void writeStream(String text) throws IOException {
writer.write(text);
// writer.flush();
// writer.close();
}
A voir également:

4 réponses

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
9 avril 2014 à 20:29
Bonsoir,

Première remarque, tu ne dois pas faire
(len=reader.read(cbuf)) > 0
mais
(len=reader.read(cbuf)) != -1
en effet il est tout à fait possible de recevoir 0 octet si le flux est un peu lent (sur un réseau par exemple) sans pour autant signifier qu'il n'y a plus rien à lire (seul -1 garantie cela)

Mais du coup si tu ne ferme jamais ton flux il n'y a pas de raison d'avoir -1, il y a toujours des données à venir plus tard. Ce que tu devrais faire c'est gérer ta lecture et ton écriture en parallèle avec des Thread ainsi tu ne devrais pas bloquer ton Process juste pour récupérer les Stream...
0
Meme avec les threads le code bloc ....
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
10 avril 2014 à 18:35
Il faudrait avoir ton code complet pour pouvoir tester ...
0


public static void setTextInput(final String linesToTurn) {
new Thread() {
public void run() {
try {
IOLex.writeStream(linesToTurn);
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}

public static String getTextOutput() throws Exception {
FutureTask<String> task = new FutureTask<String>(new Callable<String>() {
@Override
public String call() throws Exception {
return IOLex.readStream();
}
});
new Thread(task).start();
return task.get();
}

#########################IOLex################################
private Reader reader;
private Writer writer;

public String readStream() throws IOException {
StringBuilder sb = new StringBuilder();
char[] cbuf = new char[8192];
int len = 0;
while ( (len=reader.read(cbuf, 0, len)) > 0 ) {
sb.append(len);
}
// reader.close();
return sb.toString();
}

public void writeStream(String text) throws IOException {
writer.write(text);
writer.flush();
// writer.close();
}
0
je me suis trompée dans le code c'est bien evidemment :

public String readStream() throws IOException {
StringBuilder sb = new StringBuilder();
char[] cbuf = new char[8192];
int len = 0;
while ( (len=reader.read(cbuf)) > 0 ) {
sb.append(cbuf, 0, len);
}
// reader.close();
return sb.toString();
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
11 avril 2014 à 18:02
Bonjour,

Tes Thread ne sont pas bons, ils font une opération et s'arrêtent.
Ce qu'il faut c'est mettre tes boucles while dans les Thread pour qu'ils ne s'arrêtent jamais et soient toujours en attente de nouvelles données.
0