如果你有一个java.io.InputStream
对象,你应该如何处理该对象并产生一个String
?
假设我有一个包含文本数据的InputStream',我想把它转换成
String',例如我可以把它写到一个日志文件中。
有什么最简单的方法可以把 "InputStream "转换为 "String"?
public String convertStreamToString(InputStream is) {
// ???
}
一个很好的方法是使用Apache commons IOUtils
来复制InputStream
到一个StringWriter
...类似的方法
StringWriter writer = new StringWriter();
IOUtils.copy(inputStream, writer, encoding);
String theString = writer.toString();
或甚至
// NB: does not close inputStream, you'll have to use try-with-resources for that
String theString = IOUtils.toString(inputStream, encoding);
另外,如果你不想混合你的流和写程序,你可以使用ByteArrayOutputStream
。
Apache Commons允许。
String myString = IOUtils.toString(myInputStream, "UTF-8");
当然,除了UTF-8,你还可以选择其他字符编码。
也请看。(文档)
考虑到文件,首先应该得到一个java.io.Reader
实例。然后可以读取并添加到一个StringBuilder
中(如果我们不在多线程中访问它,就不需要StringBuffer
,而且StringBuilder
更快)。这里的诀窍是我们在块中工作,因此不需要其他缓冲流。块的大小是参数化的,用于运行时的性能优化。
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();
}