Pergunta
Existe uma forma mais concisa / idioma padrão (por exemplo, um método JDK) para "tubulação" uma entrada para uma saída em Java do que o seguinte?
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(); } }
[EDIT] Por favor, note o Reader
e Writer
são dada . A resposta correcta vai demonstrar como tirar in
e out
e formar um tubo (de preferência com não mais do que 1 ou 2 Método de chamadas). Aceitarei respostas onde in
e out
são um InputStream
e um OutputStream
(de preferência, com uma conversão de / para Reader
/ Writer
). Eu não vou aceitar respostas onde quer in
ou out
é uma subclasse de Reader
/ InputStream
ou Writer
/ OutputStrem
.
Solução
IOUtils do projeto Apache Commons tem um número de métodos utilily que fazer exatamente o que você precisa.
IOUtils.copy(in, out)
irá executar uma cópia tamponada de todas as entradas para a saída. Se houver mais de um ponto em sua base de código que requer Stream
ou Reader
/ manuseio Writer
, usando IOUtils poderia ser uma boa idéia.
Outras dicas
Dê uma olhada java.io.PipedInputStream e PipedOutputStream , ou PipedReader / PipedWriter do mesmo pacote
A partir da documentação de PipedInputStream:
A canalizada fluxo de entrada deve ser conectado a um fluxo de saída canalizada; o fluxo de entrada canalizado fornece então tudo o que os bytes de dados são escritas para o fluxo de saída canalizada. Tipicamente, os dados são lidos a partir de um objecto PipedInputStream por um fio e de dados é escrito para a PipedOutputStream correspondente por algum outro segmento. A tentativa de usar os dois objetos a partir de um único segmento não é recomendado, pois pode impasse da rosca. O fluxo de entrada canalizado contém um tampão, dissociando as operações de leitura a partir de operações de escrita, dentro de certos limites. Um tubo é dito para ser quebrado se um segmento que estava fornecendo bytes de dados para o fluxo de saída canalizada conectado não está mais vivo.
A única otimização disponíveis é através FileChannels na API NIO: Lê , Grava . A JVM pode otimizar esta chamada para mover os dados de um arquivo para um destino Canal sem primeiro ter que mover os dados para o espaço do kernel. Consulte este artigo para mais detalhes.