Tengo un Stringque quiero usar como InputStream. En Java 1.0, podría usar java.io.StringBufferInputStream, pero así ha sido @Deprecrated(con una buena razón, no puede especificar la codificación del juego de caracteres):
Esta clase no convierte correctamente los caracteres en bytes. A partir de JDK 1.1, la forma preferida de crear una secuencia a partir de una cadena es a través de la
StringReaderclase.
Puede crear un java.io.Readercon java.io.StringReader, pero no hay adaptadores para tomar un Readery crear un InputStream.
Encontré un error antiguo que solicitaba un reemplazo adecuado, pero no existe tal cosa, por lo que yo sé.
La solución alternativa sugerida con frecuencia es utilizarla 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));
}
pero eso significa materializar todo Stringen la memoria como una matriz de bytes, y anula el propósito de una secuencia. En la mayoría de los casos, esto no es gran cosa, pero estaba buscando algo que preservara la intención de un flujo: que la menor cantidad de datos posible se (re) materialice en la memoria.
fuente

new ByteArrayInputStream(str.getBytes(StandardCharsets.UTF_8))Si no le importa una dependencia del paquete commons-io , entonces puede usar el método IOUtils.toInputStream (String text) .
fuente
Hay un adaptador de Apache Commons-IO que se adapta de Reader a InputStream, que se llama ReaderInputStream .
Código de ejemplo:
Referencia: https://stackoverflow.com/a/27909221/5658642
fuente
En mi opinión, la forma más sencilla de hacerlo es enviando los datos a través de un editor:
La implementación de JVM que estoy usando empujó datos en fragmentos de 8K, pero podría tener algún efecto en el tamaño del búfer al reducir la cantidad de caracteres escritos a la vez y llamar a flush.
Una alternativa a escribir su propio contenedor CharsetEncoder para usar un Writer para codificar los datos, aunque es algo complicado hacerlo bien. Esta debería ser una implementación confiable (aunque ineficiente):
fuente
Bueno, una forma posible es:
PipedOutputStreamPipedInputStreamOutputStreamWriteralrededor dePipedOutputStream(puede especificar la codificación en el constructor)OutputStreamWriterse puede leer desde elPipedInputStream!Por supuesto, esta parece una forma bastante hackea de hacerlo, pero al menos es una forma.
fuente
Una solución es lanzar la suya propia, creando una
InputStreamimplementación que probablemente se usaríajava.nio.charset.CharsetEncoderpara codificar cada unocharo un fragmento dechars en una matriz de bytesInputStreamsegún sea necesario.fuente
Puede tomar la ayuda de la biblioteca org.hsqldb.lib.
fuente
Sé que esta es una pregunta antigua, pero hoy tuve el mismo problema y esta fue mi solución:
fuente