OVH Cloud OVH Cloud

PipedReader

2 réponses
Avatar
louis4u
Salut!
J'ai un problème pour faire parler 2 threads entre eux:
Je veux qu'ils s'échanges des String. J'utilise donc un PipedReader et
un PipedWriter connectés entre eux...
Par dessus un BufferedReader et un BufferedWriter pour utiliser des
String.
Seulement, je veux que chaque thread soit en permanence à l'écoute de
son BufferedReader.
J'ai donc mis le tout dans une boucle while car il me semblais que
BufferedReader.readLine() bloquait jusqu'à obtenir une ligne complète.
(Pour les tests j'utilise juste un seul thread.)
Mais j'obtiens:
java.io.IOException: Write end dead
at java.io.PipedReader.read(PipedReader.java:242)
at java.io.BufferedReader.fill(BufferedReader.java:136)
at java.io.BufferedReader.readLine(BufferedReader.java:299)
at java.io.BufferedReader.readLine(BufferedReader.java:362)
at Interpreter.run(Interpreter.java:29)

Voici mon source (je m'occuperai plus tard de la condition du while):
// Le thread:
public void run() {
input = new BufferedReader(reader);
output = new BufferedWriter(writer);
String str;
while (true) {
try {
str = input.readLine();
System.out.println("Ecrit");
output.write("repondu", 0, 7);
output.newLine();
output.flush();
} catch (IOException e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}



/// le main():
Interpreter i = new Interpreter();

try {
PipedReader istream;
PipedWriter ostream;
BufferedReader input;
BufferedWriter output;
istream = new PipedReader();
input = new BufferedReader(istream);
ostream = new PipedWriter();
output = new BufferedWriter(ostream);

/* un tas de trucs pour connecter les PipedReader et writer..*/

i.start();

String s = "coucou";
output.write(s, 0, s.length());
output.newLine();
output.flush();
System.out.println(input.readLine());
} catch (IOException e) {
System.out.println(e.getMessage());
}
}


//////////////
PS: J'ai dut mettre les flush() sinon ça ne transmettait rien

Question: Comment faire pour que ça marche, c'est à dire pour que
readLine() attende qu'elle lise une ligne complète avant de retourner

Merci par avance.
Tuxfighter

2 réponses

Avatar
JavaJug
Regarde la doc des PipedInput/OutputStream. Y'a rien dans celle des
PipedReader/Writer, mais il faut savoir qu'il ne faut pas créer un
Reader et un Writer connecté entre eux dans un même Thread, ça peut
créer un deadlock. J'espère que dans ton "un tas de trucs pour connecter
les PipedReader et writer", tu ne fais pas ça ?
Xav

tuxfighter wrote:

Salut!
J'ai un problème pour faire parler 2 threads entre eux:
Je veux qu'ils s'échanges des String. J'utilise donc un PipedReader et
un PipedWriter connectés entre eux...
Par dessus un BufferedReader et un BufferedWriter pour utiliser des
String.
Seulement, je veux que chaque thread soit en permanence à l'écoute de
son BufferedReader.
J'ai donc mis le tout dans une boucle while car il me semblais que
BufferedReader.readLine() bloquait jusqu'à obtenir une ligne complète.
(Pour les tests j'utilise juste un seul thread.)
Mais j'obtiens:
java.io.IOException: Write end dead
at java.io.PipedReader.read(PipedReader.java:242)
at java.io.BufferedReader.fill(BufferedReader.java:136)
at java.io.BufferedReader.readLine(BufferedReader.java:299)
at java.io.BufferedReader.readLine(BufferedReader.java:362)
at Interpreter.run(Interpreter.java:29)

Voici mon source (je m'occuperai plus tard de la condition du while):
// Le thread:
public void run() {
input = new BufferedReader(reader);
output = new BufferedWriter(writer);
String str;
while (true) {
try {
str = input.readLine();
System.out.println("Ecrit");
output.write("repondu", 0, 7);
output.newLine();
output.flush();
} catch (IOException e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}



/// le main():
Interpreter i = new Interpreter();

try {
PipedReader istream;
PipedWriter ostream;
BufferedReader input;
BufferedWriter output;
istream = new PipedReader();
input = new BufferedReader(istream);
ostream = new PipedWriter();
output = new BufferedWriter(ostream);

/* un tas de trucs pour connecter les PipedReader et writer..*/

i.start();

String s = "coucou";
output.write(s, 0, s.length());
output.newLine();
output.flush();
System.out.println(input.readLine());
} catch (IOException e) {
System.out.println(e.getMessage());
}
}


//////////////
PS: J'ai dut mettre les flush() sinon ça ne transmettait rien

Question: Comment faire pour que ça marche, c'est à dire pour que
readLine() attende qu'elle lise une ligne complète avant de retourner

Merci par avance.
Tuxfighter



--
"There is a theory which states that if ever anyone discovers exactly
what the Universe is for and why it is here, it will instantly disappear
and be replaced by something even more bizarre and inexplicable.
There is another theory which states that this has already happened."
-- Douglas Adams

Avatar
Terry
le "un tas de truc pour connecter..." doit normalement se résumer à un truc
du genre (flemme d'aller voir la javadoc):

istream.connect(ostream) ;

dont l'absence pourrait expliquer le dead end

D'autre part je confirme qu'il ne faut pas ce genre de truc ds le même
thread et puis il faut savoir que les pipe peuvent saturer...

sinon j'ai un code pas tres gros (genre cinq classes) qui utilise des
PipedInput/OutputStream avec serialisation des objets avt passage ds le pipe
et deserialisation a l'arriver pour faire communiquer un anneau de thread


"JavaJug" a écrit dans le message de news:
c7vjb5$35j$
Regarde la doc des PipedInput/OutputStream. Y'a rien dans celle des
PipedReader/Writer, mais il faut savoir qu'il ne faut pas créer un
Reader et un Writer connecté entre eux dans un même Thread, ça peut
créer un deadlock. J'espère que dans ton "un tas de trucs pour connecter
les PipedReader et writer", tu ne fais pas ça ?
Xav

tuxfighter wrote:

Salut!
J'ai un problème pour faire parler 2 threads entre eux:
Je veux qu'ils s'échanges des String. J'utilise donc un PipedReader et
un PipedWriter connectés entre eux...
Par dessus un BufferedReader et un BufferedWriter pour utiliser des
String.
Seulement, je veux que chaque thread soit en permanence à l'écoute de
son BufferedReader.
J'ai donc mis le tout dans une boucle while car il me semblais que
BufferedReader.readLine() bloquait jusqu'à obtenir une ligne complète.
(Pour les tests j'utilise juste un seul thread.)
Mais j'obtiens:
java.io.IOException: Write end dead
at java.io.PipedReader.read(PipedReader.java:242)
at java.io.BufferedReader.fill(BufferedReader.java:136)
at java.io.BufferedReader.readLine(BufferedReader.java:299)
at java.io.BufferedReader.readLine(BufferedReader.java:362)
at Interpreter.run(Interpreter.java:29)

Voici mon source (je m'occuperai plus tard de la condition du while):
// Le thread:
public void run() {
input = new BufferedReader(reader);
output = new BufferedWriter(writer);
String str;
while (true) {
try {
str = input.readLine();
System.out.println("Ecrit");
output.write("repondu", 0, 7);
output.newLine();
output.flush();
} catch (IOException e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}



/// le main():
Interpreter i = new Interpreter();

try {
PipedReader istream;
PipedWriter ostream;
BufferedReader input;
BufferedWriter output;
istream = new PipedReader();
input = new BufferedReader(istream);
ostream = new PipedWriter();
output = new BufferedWriter(ostream);

/* un tas de trucs pour connecter les PipedReader et writer..*/

i.start();

String s = "coucou";
output.write(s, 0, s.length());
output.newLine();
output.flush();
System.out.println(input.readLine());
} catch (IOException e) {
System.out.println(e.getMessage());
}
}


//////////////
PS: J'ai dut mettre les flush() sinon ça ne transmettait rien

Question: Comment faire pour que ça marche, c'est à dire pour que
readLine() attende qu'elle lise une ligne complète avant de retourner

Merci par avance.
Tuxfighter



--
"There is a theory which states that if ever anyone discovers exactly
what the Universe is for and why it is here, it will instantly disappear
and be replaced by something even more bizarre and inexplicable.
There is another theory which states that this has already happened."
-- Douglas Adams