Я недавно обнаружил эту идиому, и мне интересно, есть ли что-то, что я пропускаю. Я никогда не видел, чтобы это использовалось. Почти весь 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
).
Итак, что не так с этой идиомой? Если в этой идиоме нет ничего плохого, почему я ее не видел?
РЕДАКТИРОВАТЬ: чтобы уточнить, PipedInputStream
и PipedOutputStream
заменяют шаблонную буферную копию, которая появляется везде, и они также позволяют обрабатывать входящие данные одновременно с записью обработанных данных. Они не используют каналы ОС.