Идиома Java для “передачи по каналу”

Существует ли более краткая/стандартная идиома (например, метод JDK) для "передачи по каналу" входа к выводу в Java, чем следующее?

public void pipe(Reader in, Writer out) {
    CharBuffer buf = CharBuffer.allocate(DEFAULT_BUFFER_SIZE);
    while (in.read(buf) >= 0 ) {
        out.append(buf.flip());
        buf.clear();
    }
}

[РЕДАКТИРОВАНИЕ] отметьте Reader и Writer даны. Корректный ответ продемонстрирует, как взять in и out и сформируйте канал (предпочтительно больше чем без 1 или 2 вызовов метода). Я приму ответы где in и out InputStream и OutputStream (предпочтительно с преобразованием из Reader/Writer). Я не приму ответы где также in или out подкласс Reader/InputStream или Writer/OutputStrem.

9
задан deHaar 1 September 2019 в 10:21
поделиться

3 ответа

IOUtils от Apache, проект палаты общин имеет много utilily методов, которые делают точно, в чем Вы нуждаетесь.

IOUtils.copy(in, out) выполнит буферизированную копию всего входа к выводу. Если существует больше чем одно место в Вашей кодовой базе, которая требует Stream или Reader/Writer обработка, использование IOUtils могли быть хорошей идеей.

10
ответ дан 3 November 2019 в 00:06
поделиться

Смотрите на java.io. PipedInputStream и PipedOutputStream или PipedReader/PipedWriter от того же пакета.

Из документации PipedInputStream:

Переданный по каналу входной поток должен быть подключен к переданному по каналу потоку вывода; переданный по каналу входной поток затем обеспечивает, любые байты данных записаны в переданный по каналу поток вывода. Как правило, данные считаны с объекта PipedInputStream одним потоком, и данные записаны в соответствующий PipedOutputStream некоторым другим потоком. Попытка использовать оба объекта от единственного потока не рекомендуется, поскольку она может завести в тупик поток. Переданный по каналу входной поток содержит буфер, отделяя операции чтения от операций записи, в определенных рамках. Канал, как говорят, повреждается, если поток, который предоставлял байты данных связанному переданному по каналу потоку вывода, больше не жив.

1
ответ дан 3 November 2019 в 00:06
поделиться

Единственной доступной оптимизацией является через FileChannels в NIO API: Чтения, Записи. JVM может оптимизировать этот вызов для перемещения данных с файла на целевой канал, сначала не имея необходимость переместить данные в пространство ядра. См. эту статью для деталей.

1
ответ дан 3 November 2019 в 00:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: