Вот пример использования. Предположим, у вас есть сторонняя библиотека, такая как xslt mapper или crypto lib, которая имеет такой интерфейс: doSomething (inputStream, outputStream). И вы не хотите буферизовать результат перед отправкой по проводам. Apache и другие клиенты запрещают прямой доступ к потоковому выходному потоку. Самое близкое, что вы можете получить, - это получить выходной поток - со смещением после записи заголовков - в объекте объекта запроса. Но так как это скрыто, недостаточно передать входной поток и выходной поток сторонней библиотеке. Трубы являются хорошим решением этой проблемы.
авно обнаружил эту идиому, и мне интересно, есть ли что-то, что мне не хватает. Я никогда не видел, чтобы это использовалось. Почти весь 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
замените шаблонную буферную копию, которая появляется везде, и они также позволяют обрабатывать входящие данные одновременно с записью обработанных данных. Они не используют каналы ОС.