Eu tenho vários ouvintes de saída que estão implementando OutputStream. Pode ser um PrintStream gravando em stdout ou em um arquivo ou gravando na memória ou em qualquer outro destino de saída; portanto, especifiquei OutputStream como um argumento no método
Agora, eu recebi a String. Qual é a melhor maneira de gravar em fluxos aqui?
Devo apenas usar Writer.write (message.getBytes ())? Posso fornecer bytes, mas se o fluxo de destino for um fluxo de caracteres, ele será convertido automaticamente?
Preciso usar alguns fluxos de pontes aqui?
Respostas:
Os fluxos (
InputStream
eOutputStream
) transferem dados binários . Se você deseja gravar uma sequência em um fluxo, primeiro deve convertê-la em bytes ou, em outras palavras, codificá- la. Você pode fazer isso manualmente (como sugere) usando oString.getBytes(Charset)
método, mas evite oString.getBytes()
método, porque ele usa a codificação padrão da JVM, que não pode ser prevista com segurança de maneira portátil.A maneira usual de gravar dados de caracteres em um fluxo, no entanto, é agrupar o fluxo em um
Writer
(geralmente aPrintWriter
), que faz a conversão quando você chama o métodowrite(String)
(ouprint(String)
). O wrapper correspondente para InputStreams é um Reader .PrintStream
é umaOutputStream
implementação especial no sentido de que também contém métodos que codificam automaticamente seqüências de caracteres (ele usa um gravador internamente). Mas ainda é um riacho. Você pode agrupar seu fluxo com segurança com um gravador, independentemente de ser umaPrintStream
ou outra implementação de fluxo. Não há perigo de codificação dupla.Exemplo de PrintWriter com OutputStream:
fonte
PrintWriter
é como usarString.getBytes()
. Ele usa qualquer codificação aleatória que seja o padrão da JVM. Portanto, só funciona se você tiver sorte.OutputStream grava bytes, String fornece caracteres. Você precisa definir Charset para codificar a string em byte []:
Mude
UTF-8
para um conjunto de caracteres de sua escolha.fonte
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
Você pode criar um empacotamento PrintStream em torno do seu OutputStream e depois chamá-lo print (String):
fonte
Por design , deve ser feito desta maneira:
fonte
w.close()
fecharáout
também.Envolva seu OutputStream com um PrintWriter e use os métodos de impressão nessa classe. Eles pegam uma String e fazem o trabalho para você.
fonte
Você pode usar o Apache Commons IO :
fonte
IOUtils.write(String data, OutputStream output, Charset encoding)
é implementado comooutput.write(data.getBytes(Charsets.toCharset(encoding)))
, por isso pode se um string codificada pode não caber em um array de bytes