我有一个InputSteam
,需要简单地获取一个包含所有内容的单一字符串。
在Java中应该如何实现?
可能存在重复问题:
如何在Java中将InputStream转换为String?
在Java中,如何读取输入流并转换为字符串?
我有一个InputSteam
,需要简单地获取一个包含所有内容的单一字符串。
在Java中应该如何实现?
可能存在重复问题:
如何在Java中将InputStream转换为String?
在Java中,如何读取输入流并转换为字符串?
这是对Gopi答案的修改版本,它没有行尾问题,而且更有效,因为它不需要为每一行创建临时String对象,并避免了BufferedReader中的冗余复制和readLine()中的额外工作。
public static String convertStreamToString( InputStream is, String ecoding ) throws IOException
{
StringBuilder sb = new StringBuilder( Math.max( 16, is.available() ) );
char[] tmp = new char[ 4096 ];
try {
InputStreamReader reader = new InputStreamReader( is, ecoding );
for( int cnt; ( cnt = reader.read( tmp ) ) > 0; )
sb.append( tmp, 0, cnt );
} finally {
is.close();
}
return sb.toString();
}
InputStreamReader
来包装输入流,将二进制数据和文本之间进行转换。根据您的输入源指定适当的编码方式。InputStreamReader
,您可以创建一个BufferedReader
并逐行读取内容,或者只是逐个缓冲区读取并附加到StringBuilder
中,直到read()
调用返回-1。
Guava库使得第二部分变得容易 - 使用CharStreams.toString(inputStreamReader)
。以下是从这里改编的示例代码。
public String convertStreamToString(InputStream is) throws IOException {
/*
* To convert the InputStream to String we use the BufferedReader.readLine()
* method. We iterate until the BufferedReader return null which means
* there's no more data to read. Each line will appended to a StringBuilder
* and returned as String.
*/
if (is != null) {
StringBuilder sb = new StringBuilder();
String line;
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
while ((line = reader.readLine()) != null) {
sb.append(line).append("\n");
}
} finally {
is.close();
}
return sb.toString();
} else {
return "";
}
}
\r\n
(或\r
)都变成了\n
。 - Justin Ardini您还可以使用Apache Commons IO库
IOUtils
也提供了类似的方法。顺便说一句,Javadoc 的链接已经失效了... - siegi