Я недавно обнаружил эту идиому, и мне интересно, есть ли что-то, что мне не хватает. Я никогда не видел, чтобы это использовалось. Почти весь 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-piping, чтобы предотвратить сохранение нескольких копий данных XML в памяти. Он использует поток вывода HTTP Post и API загрузки/сохранения DOM для сериализации XML-документа в качестве содержимого HTTP-запроса. Насколько я могу сказать, что это сводит к минимуму использование памяти с очень небольшим дополнительным кодом (всего в несколько строк для Runnable
, PipedInputStream
и PipedOutputStream
).
Итак, что не так с этой идиомой? Если в этой идиоме нет ничего плохого, почему я ее не видел?
EDIT: уточнить, PipedInputStream
и PipedOutputStream
заменить шаблонный буфер на буфере копию, которая показывает повсюду, и они также позволяют обрабатывать входящие данные одновременно с записью из обработанных данных. Они не используют каналы ОС.