我最近发现了这个成语,我想知道我是否遗漏了一些东西。我从未见过它被使用过。我在野外使用过的几乎所有 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
, and PipedOutputStream
).
那么,这个习语有什么问题呢?如果这个成语没有什么问题的话,为什么我没见过呢?
编辑:为了澄清,PipedInputStream
and PipedOutputStream
替换随处可见的样板缓冲区副本,它们还允许您在写出已处理数据的同时处理传入数据。他们不使用操作系统管道。
来自Javadocs http://docs.oracle.com/javase/7/docs/api/java/io/PipedInputStream.html:
通常,一个线程从 PipedInputStream 对象读取数据,并由另一线程将数据写入相应的 PipedOutputStream。不建议尝试在单个线程中使用这两个对象,因为这可能会导致线程死锁。
这可以部分解释为什么它没有更常用。
我认为另一个原因是许多开发人员不了解其目的/好处。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)