Pergunta

Qual é a melhor maneira de canalizar a saída de um java.io.OutputStream para uma String em Java?

Say I tem o método:

  writeToStream(Object o, OutputStream out)

O que escreve determinados dados do objeto no fluxo de dados. No entanto, eu quero começar esta saída em uma String tão facilmente quanto possível.

Estou pensando em escrever uma classe como este (não testado):

class StringOutputStream extends OutputStream {

  StringBuilder mBuf;

  public void write(int byte) throws IOException {
    mBuf.append((char) byte);
  }

  public String getString() {
    return mBuf.toString();
  }
}

Mas há uma maneira melhor? Eu só quero executar um teste!

Foi útil?

Solução

Gostaria de usar um ByteArrayOutputStream. E no acabamento que você pode ligar no:

new String( baos.toByteArray(), codepage );

ou melhor

baos.toString( codepage );

Para o construtor de Cordas da codepage pode ser uma string ou uma instância de java.nio.charset.Charset . Um valor possível é java.nio.charset .StandardCharsets.UTF_8 .

O método toString aceitar apenas uma String como parâmetro codepage (stand Java 8).

Outras dicas

Eu gosto da biblioteca Apache Commons IO. Dê uma olhada em sua versão de ByteArrayOutputStream , que tem um método toString(String enc), bem como toByteArray(). Usando componentes existentes e confiáveis ??como o projeto Commons permite que o código ser menor e mais fácil de estender e repurpose.

Isso funcionou muito bem

    OutputStream output = new OutputStream()
    {
        private StringBuilder string = new StringBuilder();
        @Override
        public void write(int b) throws IOException {
            this.string.append((char) b );
        }

        //Netbeans IDE automatically overrides this toString()
        public String toString(){
            return this.string.toString();
        }
    };

chamada de método = >> marshaller.marshal( (Object) toWrite , (OutputStream) output);

, em seguida, imprimir o string ou obtê-lo apenas referenciar o "output" transmitir-se Como exemplo, para imprimir a string para console = >> System.out.println(output);

FYI: a minha chamada de método marshaller.marshal(Object,Outputstream) é para trabalhar com XML. É irrelevante a este tema.

Este é altamente dispendioso para uso productional, há uma maneira demasiados conversão e é um pouco solto. Este foi apenas codificado para provar a você que é totalmente possível criar um OuputStream personalizado e saída de uma corda. Mas basta ir Horcrux7 caminho e tudo é bom com apenas duas chamadas de método.

E a vida do mundo em outro dia ....

Aqui está o que eu acabei fazendo:

Obj.writeToStream(toWrite, os);
try {
    String out = new String(os.toByteArray(), "UTF-8");
    assertTrue(out.contains("testString"));
} catch (UnsupportedEncondingException e) {
    fail("Caught exception: " + e.getMessage());
}

Onde OS é um ByteArrayOutputStream.

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