为什么更多的Java代码不使用PipedInputStream /PipedOutputStream?
2022-08-31 15:41:27
我最近发现了这个成语,我想知道我是否错过了什么。我从未见过它被使用过。我使用过的几乎所有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