Se você tem um objeto java.io.InputStream
, como você deve processar esse objeto e produzir um String
?
Suponha que eu tenha um InputStream
que contenha dados de texto, e eu quero convertê-lo para um String
, então por exemplo, eu posso escrever isso em um arquivo de log.
Qual é a maneira mais fácil de pegar o "InputStream" e convertê-lo para um "String"?
public String convertStreamToString(InputStream is) {
// ???
}
Uma boa maneira de fazer isso é usando Apache commons IOUtils
para copiar o InputStream
para um StringWriter
... algo como
StringWriter writer = new StringWriter();
IOUtils.copy(inputStream, writer, encoding);
String theString = writer.toString();
ou mesmo
// NB: does not close inputStream, you'll have to use try-with-resources for that
String theString = IOUtils.toString(inputStream, encoding);
Alternativamente, você poderia usar ByteArrayOutputStream
se você não quiser misturar seus Streams e Escritores
O Apache Commons permite:
String myString = IOUtils.toString(myInputStream, "UTF-8");
Claro, você poderia escolher outras codificações de caracteres além de UTF-8.
Veja também: (documentação)
Levando em conta o arquivo, deve-se primeiro obter uma instância java.io.Reader'. Isto pode então ser lido e adicionado a um
StringBuilder' (não precisamos do StringBuilder' se não estivermos acessando em vários threads, e
StringBuilder' é mais rápido). O truque aqui é que nós trabalhamos em blocos, e como tal não precisamos de outros fluxos de buffering. O tamanho do bloco é parametrizado para otimização da performance em tempo de execução.
public static String slurp(final InputStream is, final int bufferSize) {
final char[] buffer = new char[bufferSize];
final StringBuilder out = new StringBuilder();
try (Reader in = new InputStreamReader(is, "UTF-8")) {
for (;;) {
int rsz = in.read(buffer, 0, buffer.length);
if (rsz < 0)
break;
out.append(buffer, 0, rsz);
}
}
catch (UnsupportedEncodingException ex) {
/* ... */
}
catch (IOException ex) {
/* ... */
}
return out.toString();
}