Java идиома для "трубопровода" - PullRequest
9 голосов
/ 24 сентября 2008

Существует ли более краткая / стандартная идиома (например, метод 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.

Ответы [ 3 ]

10 голосов
/ 01 декабря 2008

IOUtils из проекта Apache Commons имеет ряд утилитарных методов , которые делают именно то, что вам нужно.

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

1 голос
/ 24 сентября 2008

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

1 голос
/ 24 сентября 2008

Взгляните на java.io.PipedInputStream и PipedOutputStream или PipedReader / PipedWriter из того же пакета.

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

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

...