Qual é a melhor maneira de canalizar a saída de um java.io.OutputStream para uma String em Java?
Digamos que eu tenho o método:
writeToStream(Object o, OutputStream out)
Que grava certos dados do objeto no fluxo especificado. No entanto, quero obter essa saída em uma String o mais facilmente possível.
Estou pensando em escrever uma classe como esta (não testada):
class StringOutputStream extends OutputStream {
StringBuilder mBuf;
public void write(int byte) throws IOException {
mBuf.append((char) byte);
}
public String getString() {
return mBuf.toString();
}
}
Mas existe uma maneira melhor? Eu só quero fazer um teste!
Respostas:
Eu usaria um
ByteArrayOutputStream
. E, no final, você pode ligar para:ou melhor:
Para o
String
construtor,codepage
pode ser umaString
ou uma instância de java.nio.charset.Charset . Um valor possível é java.nio.charset.StandardCharsets.UTF_8 .O método
toString()
aceita apenas aString
comocodepage
parâmetro (suporte Java 8).fonte
defaultCharset
você precisa descobrir o que é antes de usar - não melhor do que ignorar o charset completo étoString
StandardCharsets.UTF_8
é umCharset
, não umString
. Além disso, o parâmetro é chamadocharsetName
, nãocodepage
.Gosto da biblioteca Apache Commons IO. Dê uma olhada em sua versão do ByteArrayOutputStream , que também possui um
toString(String enc)
métodotoByteArray()
. O uso de componentes existentes e confiáveis, como o projeto Commons, permite que seu código seja menor e mais fácil de estender e redefinir.fonte
Isso funcionou bem
chamada de método = >>
marshaller.marshal( (Object) toWrite , (OutputStream) output);
em seguida, para imprimir a string ou obtê-la, faça referência ao próprio fluxo "output". Como exemplo, para imprimir a string no console = >>
System.out.println(output);
FYI: minha chamada de método
marshaller.marshal(Object,Outputstream)
é para trabalhar com XML. É irrelevante para este tópico.Isso é um grande desperdício para uso produtivo, há uma conversão demais e é um pouco solto. Isso foi codificado apenas para provar a você que é totalmente possível criar um OuputStream personalizado e gerar uma string. Mas basta seguir o caminho do Horcrux7 e tudo fica bem com apenas duas chamadas de método.
E o mundo vive em outro dia ....
fonte
Aqui está o que eu acabei fazendo:
Onde os é a
ByteArrayOutputStream
.fonte
"UTF-8"
porStandardCharsets.UTF_8
.Java 14 - https://docs.oracle.com/
fonte