Вопрос
Существует ли более краткая/стандартная идиома (например, метод 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
.
Решение
IOUtils из проекта Apache Commons имеет ряд служебные методы которые делают именно то, что вам нужно.
IOUtils.copy(in, out)
выполнит буферизованную копию всех входных данных на выход.Если в вашей кодовой базе есть более одного места, требующего Stream
или Reader
/Writer
обработки, использование IOUtils может быть хорошей идеей.
Другие советы
Взгляни на java.io.PipedInputStream и PipedOutputStream, или PipedReader/PipedWriter из того же пакета.
Из документации PipedInputStream:
Трубопроводный входной поток должен быть подключен к конвейерному выходному потоку;затем передаваемый по конвейеру входной поток предоставляет любые байты данных, записанные в передаваемый по конвейеру выходной поток.Обычно данные считываются из объекта PipedInputStream одним потоком, а данные записываются в соответствующий PipedOutputStream каким-либо другим потоком.Попытка использовать оба объекта из одного потока не рекомендуется, так как это может привести к взаимоблокировке потока.Переданный по конвейеру входной поток содержит буфер, отделяющий операции чтения от операций записи в определенных пределах.Говорят, что канал поврежден, если поток, который передавал байты данных в подключенный выходной поток, больше не активен.
Единственная доступная оптимизация — через FileChannels в NIO API: Читает, Пишет.JVM может оптимизировать этот вызов для перемещения данных из файла в целевой канал без необходимости предварительного перемещения данных в пространство ядра.Видеть Эта статья для получения подробной информации.