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
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
A voir également:
- Code bloque lorsqu'on ne ferme pas les flux
- Code puk bloqué - Guide
- Téléphone bloqué code verrouillage - Guide
- Comment savoir si on est bloqué sur messenger - Guide
- Code asci - Guide
- Rouvrir onglet fermé - Guide
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
9 avril 2014 à 20:29
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...
Meme avec les threads le code bloc ....
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
10 avril 2014 à 18:35
Il faudrait avoir ton code complet pour pouvoir tester ...
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();
}
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
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.
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.