Вот пример использования. Предположим, у вас есть сторонняя библиотека, такая как 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 замените шаблонную буферную копию, которая появляется везде, и они также позволяют обрабатывать входящие данные одновременно с записью обработанных данных. Они не используют каналы ОС.

Ответы на вопрос(8)

Ваш ответ на вопрос