Leer texto de InputStream

Si empiezo con un java.io.InputStream, ¿cuál es la forma más fácil de leer todo el flujo en una cadena (asumiendo que es utf-8)?

Esto debería ser bastante fácil, pero en su mayoría soy una persona C # y Google me está fallando en esto. Gracias.

Dependiendo de las licencias con las que se sienta cómodo, se trata de una sola línea con la biblioteca IO de Jakarta-Commons.

Especifique la encoding de caracteres. No desperdicie código, introduzca errores y BufferedReader lentamente con un BufferedReader .

Aquí hay un ejemplo. Podría parametrizarlo con un tamaño de búfer, encoding, etc.

 static String readString(InputStream is) throws IOException { char[] buf = new char[2048]; Reader r = new InputStreamReader(is, "UTF-8"); StringBuilder s = new StringBuilder(); while (true) { int n = r.read(buf); if (n < 0) break; s.append(buf, 0, n); } return s.toString(); } 

Usar Commons-IO es probablemente la mejor opción. Para su interés, otro enfoque es copiar todos los bytes y luego convertirlos en una Cadena.

 public static String readText(InputStream is, String charset) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] bytes = new byte[4096]; for(int len;(len = is.read(bytes))>0;) baos.write(bytes, 0, len); return new String(baos.toByteArray(), charset); } 

Leer / escribir desde streams es notablemente doloroso en Java.

 public static String getStreamContents(InputStream stream) throws IOException { StringBuilder content = new StringBuilder() Reader reader = new BufferedReader(new InputStreamReader(stream, "UTF-8")) String lineSeparator = System.getProperty("line.separator"); try { String line while ((line = reader.readLine()) != null) { content.append(line + lineSeparator) } return content.toString() } finally { reader.close() } } 

He encontrado una buena forma en Java 8 con streams:

 public static String readString(InputStream is) { BufferedReader br = new BufferedReader(new InputStreamReader(is)); String content = br.lines().reduce("", String::concat); return content; } 

Como se indicó anteriormente, puede intercambiar el nuevo InputStreamReader (is) con el nuevo InputStreamReader (es, “UTF-8”), pero no tengo experiencia con este constructor.