私は最近、このイディオムを発見しました。何か足りないものはないかと考えています。使っているのを見たことがない。私が実際に扱ったほぼすべての Java コードは、次の例のようなものではなく、データを文字列またはバッファーに丸呑みすることを好みます (たとえば、HttpClient および XML API を使用)。
final LSOutput output; // XML stuff initialized elsewhere
final LSSerializer serializer;
final Document doc;
// ...
PostMethod post; // HttpClient post request
final PipedOutputStream source = new PipedOutputStream();
PipedInputStream sink = new PipedInputStream(source);
// ...
executor.execute(new Runnable() {
public void run() {
output.setByteStream(source);
serializer.write(doc, output);
try {
source.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}});
post.setRequestEntity(new InputStreamRequestEntity(sink));
int status = httpClient.executeMethod(post);
このコードは、Unix パイピング スタイルの手法を使用して、XML データの複数のコピーがメモリに保持されるのを防ぎます。HTTP Post 出力ストリームと DOM Load/Save API を使用して、XML ドキュメントを HTTP リクエストのコンテンツとしてシリアライズします。私が知る限り、余分なコードをほとんど使わずにメモリの使用を最小限に抑えます ( Runnable
、PipedInputStream
、およびの数行のみPipedOutputStream
)。
では、この慣用句の何が問題になっているのでしょうか。このイディオムに問題がなければ、なぜ私はそれを見なかったのですか?
編集:どこにでも表示されるボイラープレートのバッファーごとのコピーを明確にPipedInputStream
し、置き換えます。また、処理されたデータを書き出すと同時に受信データを処理することもできます。PipedOutputStream
OS パイプを使用しません。