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
>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
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 :)
> 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.
Zu 99,9 %, sonst hättte ich gleich die ByteArray-Streams genommen.
Aber spielt das denn ne Rolle?
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
Naja, man braucht sie selten, aber von komischem Grenzverhalten kann doch
keine Rede sein?
Gruss
Bernd