2012年7月24日火曜日

PipedInputStreamとPipedOutputStream

XSLT変換するとき、Transformerクラスってのを使います。
このクラスが持つtransformメソッドは、引数にStreamのInputとOutputを入力するようになっています。
でも、OutputStreamに何かを書き出してから、それをSourceとしてtransformしたい場合、Sourceの型はInputStreamになっているので、一旦ファイルに落として再読み込みしなければならない。。。

と思っていたのですが、PipedOutputStreamを使って、PipedInputStreamにconnectしてあげれば、OutputStreamをInputStreamに変換(?)、という事が可能です。


で、PipedOutputStreamをBufferedOutputStreamでWrapしてあげて、これに沢山のデータを突っ込んでいると、あるタイミングでflushが走ります。そうすると、PipedInputStreamが確保しているBuffer領域にデータが流し込まれます。
確保するBuffer領域は、デフォルトで1024bytesです。

また、このPipedInput/OutputStreamは、マルチスレッドで使用しないと、デッドロックが発生する可能性があります。

また、このPipedInput/OutputStreamを使用する時に注意すべき事があるのですが、OutputStream側が書き出しをしているのに、InputStream側がcloseしてしまうと、Exceptionを(確か)吐きます。
なので、closeするタイミングも気にしながら実装すると、バグを埋め込まないで実装できると思います。


0 件のコメント:

コメントを投稿