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.

Foi útil?

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: , 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top