Fehler bei PipedInputStream / PipedOutputStream

8

Ich habe zwei Antworten auf SO gesehen, die behaupten, dass die von Java bereitgestellten Klassen PipedInputStream und PipedOutputStream fehlerhaft sind. Aber sie erklärten nicht, was mit ihnen los war. Sind sie wirklich fehlerhaft, und wenn ja, auf welche Weise? Ich schreibe gerade einen Code, der sie benutzt, also würde ich gerne wissen, ob ich falsch abgebogen bin.

Eine Antwort sagte:

  

PipedInputStream und PipedOutputStream sind gebrochen (in Bezug auf Threading). Sie gehen davon aus, dass jede Instanz an einen bestimmten Thread gebunden ist. Das ist bizarr.

Für mich scheint das weder bizarr noch kaputt zu sein. Vielleicht hat der Autor auch einige andere Fehler im Sinn?

Eine andere Antwort sagte:

  

In der Praxis werden sie am besten vermieden. Ich habe sie einmal in 13 Jahren benutzt und ich wünschte ich hätte es nicht.

Aber dieser Autor konnte sich nicht erinnern, was das Problem war.

Wie bei allen Klassen und insbesondere bei Klassen, die in mehreren Threads verwendet werden, haben Sie Probleme, wenn Sie sie missbrauchen. Ich denke also nicht an die unvorhersehbare "schreibe end dead" IOException Das PipedInputStream kann einen Fehler verursachen (fehlgeschlagen in close() Der verbundene PipedOutputStream ist ein Fehler; siehe den Artikel Was ist das? IOException: Schreiben Sie tot tot , von Daniel Ferbers, für weitere Informationen). Welche anderen behaupteten Mängel gibt es?

    
Raedwald 28.02.2012, 14:35
quelle

4 Antworten

10

Sie sind nicht fehlerhaft.

Wie bei allen Klassen und insbesondere bei Klassen, die in mehreren Threads verwendet werden, haben Sie Probleme, wenn Sie sie missbrauchen. Das unberechenbare "Schreibende tot" IOException , das PipedInputStream werfen kann, ist kein Fehler (fehlgeschlagen in close() Der verbundene PipedOutputStream ist ein Fehler; siehe den Artikel Was ist das? IOException: Schreibe Ende tot , von Daniel Ferbers, für weitere Informationen ).

    
Raedwald 11.03.2012 15:49
quelle
3

Ich habe sie gut in meinem Projekt verwendet und sie sind von unschätzbarem Wert, um Streams im laufenden Betrieb zu modifizieren und sie herumzugeben. Der einzige Nachteil schien zu sein, dass PipedInputStream einen kurzen Puffer hatte (ungefähr 1024) und mein Ausgangsstrom pumpte ungefähr 8KBs hinein.

Es gibt keinen Defekt damit und es funktioniert perfekt.

-------- Beispiel in groovy

%Vor%

}

%Vor%

}

    
Ganesh Krishnan 17.04.2012 05:37
quelle
0

Die Fehler, die ich bei der JDK-Implementierung sehe, sind:

1) Keine Timeouts, Leser oder Schreiber können unendlich blockieren.

2) Suboptimale Kontrolle darüber, wann Daten übertragen werden (sollte nur mit Flush erfolgen, oder wenn der Ringpuffer voll ist)

Also habe ich meine eigene erstellt, um das obige zu adressieren (Timeout-Wert über ein ThreadLocal):

PipedOutputStream

Wie zu verwenden:

PiedOutputStreamTest

Ich hoffe, es hilft ...

    
user2179737 20.06.2015 14:10
quelle
-2

Aus meiner Sicht gibt es einen Fehler. Genauer gesagt besteht ein hohes Risiko eines Deadlocks, wenn der Thread, der Daten in den PipedOutputStream pumpen soll, vorzeitig stirbt, bevor er tatsächlich ein einzelnes Byte in den Stream schreibt. Das Problem in einer solchen Situation ist, dass die Pipeline-Pipeline nicht in der Lage ist, das unterbrochene Rohr zu erkennen. Folglich wird das Thread-Lesen von PipedInputStream für immer (d. H. Deadlock) beim ersten Aufruf von read () warten.

Die Erkennung defekter Pipes beruht tatsächlich auf dem ersten Aufruf von write (), da die Implementierung den Thread auf der schreibenden Seite initialisiert und erst ab diesem Zeitpunkt funktioniert die Erkennung unterbrochener Pipes.

Der folgende Code reproduziert die Situation:

%Vor%     
Christian K. 27.02.2014 15:30
quelle

Tags und Links