0

パイプストリームを理解しようとしています。パイプされたストリームの代わりに、他のストリームを使用して相互にパイプできないのはなぜですか? 以下のように:

final ByteArrayOutputStream pos = new ByteArrayOutputStream();

final ByteArrayInputStream pis = new ByteArrayInputStream(pos.toByteArray());

また、パイプ ストリームでデッドロックが発生するのはいつでしょうか。単一のメイン スレッドを使用して読み取りと書き込みを試みましたが、スムーズに実行されます。

4

2 に答える 2

0

パイプされたストリームにより、最小限の労力で効率的なバイト単位の処理が可能になります。

私は間違っている可能性が非常に高いですがtoByteArray()、あなたが思っていることをしないかもしれないと私は信じています. 将来のコンテンツではなく、現在のコンテンツをコピーするだけです。

したがって、ここでの唯一の本当の問題は、これの管理であり、これはもう少し難しいでしょう。出力ストリームを常にポーリングする必要があります。への呼び出しごとの配列のメモリ割り当ては言うまでもありませんtoByteArray(呼び出しごとに「新しく割り当てられたバイト配列を作成します」)。

単一のスレッドでデッドロックが発生する可能性があると私が推測する方法:

まだデータがない入力ストリームから (ブロッキング) 読み取りを試みた場合。データは、同じスレッドに書き込む必要がある出力ストリームからのみ取得できるため、データを取得することはできません。これは、座ってデータを待っている間は発生しません。

したがって、単一のスレッドでは、あまり注意しないと発生しますが、デッドロックなしで同じスレッドで正常に使用できるはずですが、なぜそうしたいのでしょうか? リンクリストや単純な循環配列など、別のデータ構造の方が適していると思います。

于 2013-04-17T14:01:27.847 に答える
0

ここでの問題は、パイプの一方の端への書き込みをもう一方の端での読み取りと一致させる必要があるため、プロセスを複数のスレッドで実装する必要があることです。

1 つのパイプの終わりでの到着を監視し、それらを別のパイプに押し戻すスレッドを作成することは確かに難しくありませんが、単一のスレッドでは実行できません。

この質問を見たことがありますか?

于 2013-04-17T13:52:05.047 に答える