Eu tenho um String
que quero usar como um InputStream
. No Java 1.0, você poderia usar java.io.StringBufferInputStream
, mas tem sido @Deprecrated
(com um bom motivo - você não pode especificar a codificação do conjunto de caracteres):
Esta classe não converte corretamente caracteres em bytes. A partir do JDK 1.1, a maneira preferida de criar um fluxo de uma string é por meio da
StringReader
classe.
Você pode criar um java.io.Reader
com java.io.StringReader
, mas não há adaptadores para pegar um Reader
e criar um InputStream
.
Eu encontrei um bug antigo pedindo uma substituição adequada, mas tal coisa não existe - pelo que eu posso dizer.
A solução alternativa frequentemente sugerida é usar java.lang.String.getBytes()
como entrada para java.io.ByteArrayInputStream
:
public InputStream createInputStream(String s, String charset)
throws java.io.UnsupportedEncodingException {
return new ByteArrayInputStream(s.getBytes(charset));
}
mas isso significa materializar o todo String
na memória como um array de bytes, e anula o propósito de um stream. Na maioria dos casos, isso não é grande coisa, mas eu estava procurando por algo que preservasse a intenção de um stream - que o mínimo possível de dados seja (re) materializado na memória.
fonte
new ByteArrayInputStream(str.getBytes(StandardCharsets.UTF_8))
Se você não se importa com a dependência do pacote commons-io , pode usar o método IOUtils.toInputStream (String text) .
fonte
Há um adaptador do Apache Commons-IO que se adapta do Reader para o InputStream, que é denominado ReaderInputStream .
Código de exemplo:
Referência: https://stackoverflow.com/a/27909221/5658642
fonte
Em minha opinião, a maneira mais fácil de fazer isso é enviar os dados por meio de um Writer:
A implementação da JVM que estou usando por push de dados em blocos de 8K, mas você pode ter algum efeito no tamanho do buffer, reduzindo o número de caracteres gravados de uma vez e chamando flush.
Uma alternativa para escrever seu próprio invólucro CharsetEncoder para usar um gravador para codificar os dados, embora seja difícil fazer da maneira certa. Esta deve ser uma implementação confiável (se ineficiente):
fonte
Bem, uma maneira possível é:
PipedOutputStream
PipedInputStream
OutputStreamWriter
em torno daPipedOutputStream
(você pode especificar a codificação no construtor)OutputStreamWriter
pode ser lido noPipedInputStream
!Claro, essa parece uma maneira bastante hackeada de fazer isso, mas pelo menos é uma maneira.
fonte
Uma solução é lançar o seu próprio, criando uma
InputStream
implementação que provavelmente seria usadajava.nio.charset.CharsetEncoder
para codificar cada umchar
ou um pedaço dechar
s em um array de bytes para oInputStream
conforme necessário.fonte
Você pode obter ajuda da biblioteca org.hsqldb.lib.
fonte
Eu sei que esta é uma pergunta antiga, mas eu tive o mesmo problema hoje, e esta foi a minha solução:
fonte