Tengo un String
que 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
StringReader
clase.
Puede crear un java.io.Reader
con java.io.StringReader
, pero no hay adaptadores para tomar un Reader
y 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 String
en 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:
PipedOutputStream
PipedInputStream
OutputStreamWriter
alrededor dePipedOutputStream
(puede especificar la codificación en el constructor)OutputStreamWriter
se 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
InputStream
implementación que probablemente se usaríajava.nio.charset.CharsetEncoder
para codificar cada unochar
o un fragmento dechar
s en una matriz de bytesInputStream
segú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