【发布时间】:2010-12-25 21:13:18
【问题描述】:
如果我从 java.io.InputStream 开始,将整个流读入字符串(假设为 utf-8)最简单的方法是什么?
这应该很容易,但我主要是 C# 人,谷歌在这方面让我失望。谢谢。
【问题讨论】:
-
doh,我没有搜索“输入流”(中间有空格)。
标签: java
如果我从 java.io.InputStream 开始,将整个流读入字符串(假设为 utf-8)最简单的方法是什么?
这应该很容易,但我主要是 C# 人,谷歌在这方面让我失望。谢谢。
【问题讨论】:
标签: java
根据您熟悉的许可证,它是带有 Jakarta-Commons IO 库的 one liner。
【讨论】:
做指定字符编码。 不要使用BufferedReader 浪费代码、引入错误和减慢执行速度。
这是一个例子。您可以使用缓冲区大小、编码等参数化它。
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();
}
【讨论】:
int n; while((n = r.read(buf)) >= 0) { s.append(buf, 0, n); }
使用 Commons-IO 可能是最佳选择。 为了您的兴趣,另一种方法是复制所有字节,然后将其转换为字符串。
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);
}
【讨论】:
在 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()
}
}
【讨论】:
我在 Java 8 中找到了一种带有流的好方法:
public static String readString(InputStream is) {
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String content = br.lines().reduce("", String::concat);
return content;
}
如上所述,您可以将 new InputStreamReader(is) 与 new InputStreamReader(is, "UTF-8") 交换,但我没有使用此构造函数的经验。
【讨论】:
br.lines().reduce("\n", String::concat)