Code bloque lorsqu'on ne ferme pas les flux
lea.soineca
-
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
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?
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:
- Code bloque lorsqu'on ne ferme pas les flux
- Code puk bloqué - Guide
- Code ascii - Guide
- Téléphone bloqué code verrouillage - Guide
- Pavé tactile bloqué - Guide
- Code activation windows 10 - Guide
4 réponses
Bonsoir,
Première remarque, tu ne dois pas faire
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...
Première remarque, tu ne dois pas faire
(len=reader.read(cbuf)) > 0mais
(len=reader.read(cbuf)) != -1en 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...
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();
}