Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Piped stream

3 views
Skip to first unread message

Chris Seidel

unread,
Dec 26, 2007, 11:41:13 AM12/26/07
to
Hallo,

ich versuche einen Outputstream auf einen Inputstream abzubilden:

public static void testPipe(final File f) throws Exception {
final PipedInputStream pis = new PipedInputStream();
final PipedOutputStream pos = new PipedOutputStream(pis);
Thread t = new Thread(
new Runnable(){
public void run(){
try {
copy(new FileInputStream(f), pos);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
});
t.start();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
copy(pis, bos);//PENG
}

public static void copy(InputStream is, OutputStream os) throws IOException
{
byte[] b = new byte[65536];
int r = -1;
while ((r = is.read(b)) != -1) {
os.write(b, 0, r);
}
}


Ich bekomme aber:

Exception in thread "main" java.io.IOException: Write end dead
at java.io.PipedInputStream.read(PipedInputStream.java:294)
at java.io.PipedInputStream.read(PipedInputStream.java:361)
at java.io.InputStream.read(InputStream.java:85)

Was mache ich falsch?

Danke


Ralf Ullrich

unread,
Dec 26, 2007, 1:18:27 PM12/26/07
to
Chris Seidel wrote:

>Exception in thread "main" java.io.IOException: Write end dead

"Write end dead" wird geworfen, wenn der Thread, welcher zuletzt in den
PipedOutputStream schrieb, endete ohne zuvor close() aufzurufen.

Du machst also folgendes falsch: dein copy-Hintergrund-Thread schließt
weder den FileInputStream nach dem Lesen, noch den PipeOutputStream nach
dem Schreiben. Ähnliches gilt natürlich auch für deinen main-Thread.

Das Ganze ist übrigens unter den Stichworten "broken pipe" in den JavaDocs
zu den Pipe-Streams dokumentiert, auch wenn ich zugeben muss, mehr im
Nebensatz und zwischen den Zeilen.

cu

Chris Seidel

unread,
Dec 26, 2007, 1:56:47 PM12/26/07
to
Ralf Ullrich wrote:
> Du machst also folgendes falsch: dein copy-Hintergrund-Thread schließt
> weder den FileInputStream nach dem Lesen, noch den
> PipeOutputStream nach dem Schreiben. Ähnliches gilt natürlich auch
> für deinen main-Thread.

Das Schließen des PipeOutputStream fehlte im Thread, sonst bekommt man
diesen Fehler.
Das Schließen der anderen Streams ist natürlich auch nötig, um "sauber" zu
bleiben, klar.

Danke, wie immer 1 a Hilfe von dir :)


Bernd Hohmann

unread,
Dec 26, 2007, 4:15:21 PM12/26/07
to
Chris Seidel wrote:

> ich versuche einen Outputstream auf einen Inputstream abzubilden:

> public static void copy(InputStream is, OutputStream os) throws IOException

> {
> byte[] b = new byte[65536];
>

> Exception in thread "main" java.io.IOException: Write end dead

Bist Du sicher, dass dein File mehr als 64k Daten enthält?

Bernd

--
Unsere Identität entnehmen Sie bitte dem beigefügten Auszug aus
den Personenstandsbüchern. Gegen die Assimilierung in unser
Kollektiv ist nach dem ABGB (§66.4) kein Rechtsmittel zulässig.

Chris Seidel

unread,
Dec 26, 2007, 5:52:59 PM12/26/07
to
Bernd Hohmann wrote:
>> byte[] b = new byte[65536];
> Bist Du sicher, dass dein File mehr als 64k Daten enthält?

Zu 99,9 %, sonst hättte ich gleich die ByteArray-Streams genommen.
Aber spielt das denn ne Rolle?


Bernd Hohmann

unread,
Dec 26, 2007, 6:07:21 PM12/26/07
to
Chris Seidel wrote:

Als ich das letzte Mal was mit den Piped-Dingern gemacht habe, hatte ich
einen ähnlichen Fehler der darauf zurückzuführen war, dass weniger Daten
da waren als benötigt - und das führte nicht zu einem EOF. Das lag
wahrscheinlich daran, dass ich das als OS-Pipe gesehen hatte :-)

Die Piped-Streams sind auch über die JDKs immer irgendwie anders im
Grenzverhalten sodass ich sie lange nicht mehr nehme.

Vielleicht findest Du hier was zu Deiner eigentlichen Problemlösung:
http://ostermiller.org/convert_java_outputstream_inputstream.html

Bernd Eckenfels

unread,
Dec 26, 2007, 6:33:23 PM12/26/07
to
Bernd Hohmann <trap20...@spamonly.net> wrote:
> Die Piped-Streams sind auch über die JDKs immer irgendwie anders im
> Grenzverhalten sodass ich sie lange nicht mehr nehme.

Naja, man braucht sie selten, aber von komischem Grenzverhalten kann doch
keine Rede sein?

Gruss
Bernd

0 new messages