Вопрос

Существует ли более краткая/стандартная идиома (например, метод 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 может оптимизировать этот вызов для перемещения данных из файла в целевой канал без необходимости предварительного перемещения данных в пространство ядра.Видеть Эта статья для получения подробной информации.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top