java - 将InputStream转换为String

  显示原文与译文双语对照的内容

如果有 java.io.InputStream 对象,如何处理该对象并生成一个 String


假设我有一个包含文本数据的InputStream,我想将它转换为 String ( 例如我可以将流的内容写入日志文件) 。

获取 InputStream 并将它的转换为 String的最简单方法是什么?


public String convertStreamToString(InputStream is) { 
//???
}

时间:

一个不错的方法是使用 commons web IOUtilsInputStream 复制到 StringWriter 。。 类似


StringWriter writer = new StringWriter();
IOUtils.copy(inputStream, writer, encoding);
String theString = writer.toString();

甚至甚至


//NB: does not close inputStream, you can use IOUtils.closeQuietly for that
String theString = IOUtils.toString(inputStream, encoding); 

或者,如果你不想混合流和作者,你可以使用 ByteArrayOutputStream

下面是使用标准Java库( 注意流没有关闭,YMMV )的方法。


static String convertStreamToString(java.io.InputStream is) {
 java.util.Scanner s = new java.util.Scanner(is).useDelimiter("A");
 return s.hasNext()? s.next() :"";
}

我从 "愚蠢的扫描仪技巧"的一篇文章中学到了这个技巧。 之所以使用它是因为扫描仪遍历流中的令牌,在这种情况下,我们使用"输入边界的开始"( A ) 分隔令牌,从而为整个流的内容提供一个标记。

笔记,如果你需要特定的输入编码流,你可以提供 Scanner 构造函数的第二个参数表明用什么字符集(e。g。 "utf-8") 。

Hat也指向 。曾经指过我的文章。

编辑:谢谢帕特里克建议,使功能更加健壮在处理一个空的输入流。 一个编辑:做成 try/catch, 帕特里克更简洁的方法。

Apache Commons允许:


String myString = IOUtils.toString(myInputStream,"UTF-8");

当然,除了UTF-8之外,你还可以选择其他字符编码。

另请参阅:( 文档 )

考虑到文件应该首先得到一个 java.io.Reader 实例。 然后可以读取并添加到 StringBuilder ( 如果我们没有在多个线程中访问它,那么我们就不需要 StringBuffer,而且 StringBuilder 更快) 。 诀窍在于我们在块中工作,因此不需要其他缓冲流。 为run-time性能优化参数化块大小。


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();
}

这个怎么样?


InputStream in = /* your InputStream */;
InputStreamReader is = new InputStreamReader(in);
StringBuilder sb=new StringBuilder();
BufferedReader br = new BufferedReader(is);
String read = br.readLine();

while(read!= null) {
//System.out.println(read);
 sb.append(read);
 read =br.readLine();

}

return sb.toString();

如果使用 google-collections/Guava,可以执行以下操作:


InputStream stream =.. .
String content = CharStreams.toString(new InputStreamReader(stream, Charsets.UTF_8));
Closeables.closeQuietly(stream);

请注意第二个参数( 例如 。 数据集。utf_8 ) InputStreamReader 并不是必须的,但它通常是一个好主意来指定编码如果你知道它(你应该)!

这是我的纯 Java & Android解决方案,工作正常。。


public String readFully(InputStream inputStream, String encoding)
 throws IOException {
 return new String(readFully(inputStream), encoding);
} 

private byte[] readFully(InputStream inputStream)
 throws IOException {
 ByteArrayOutputStream baos = new ByteArrayOutputStream();
 byte[] buffer = new byte[1024];
 int length = 0;
 while ((length = inputStream.read(buffer))!= -1) {
 baos.write(buffer, 0, length);
 }
 return baos.toByteArray();
}

下面是我在一些实验之后提出的最优雅的pure-Java ( 没有库) 解决方案:


public static String fromStream(InputStream in) throws IOException
{
 BufferedReader reader = new BufferedReader(new InputStreamReader(in));
 StringBuilder out = new StringBuilder();
 String newLine = System.getProperty("line.separator");
 String line;
 while ((line = reader.readLine())!= null) {
 out.append(line);
 out.append(newLine);
 }
 return out.toString();
}

怎么办:


import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.IOException; 

public static String readInputStreamAsString(InputStream in) 
 throws IOException {

 BufferedInputStream bis = new BufferedInputStream(in);
 ByteArrayOutputStream buf = new ByteArrayOutputStream();
 int result = bis.read();
 while(result!= -1) {
 byte b = (byte)result;
 buf.write(b);
 result = bis.read();
 } 
 return buf.toString();
}

作为替代共享库,优秀的谷歌 guava-libraries让你这样做相当简洁,给定一个 inputStream inputStream命名:


import com.google.common.io.CharStreams;

CharStreams.toString( new InputStreamReader( inputStream ));

...