我想知道使用我所谓的“字符串构造函数方法”将 InputStream
转换为字符串的反对意见是什么。
编辑:添加强调。特别是,我想知道为什么当这种方法看起来工作正常时我们必须搞乱流、缓冲区和扫描仪之类的东西。
private String readStream(InputStream in) {
byte[] buffer = new byte[1024];
try {
return new String(buffer, 0, in.read(buffer));
} catch (IOException e) {
Log.d(DEBUG_TAG, "Error reading input stream!");
return "";
}
}
我见过this other helpful post并尝试了我可以的方法:
- 方法 1(Apache commons)是不行的,因为我现在无法使用也不需要库。
- 方法 2(
Scanner
)看起来很有前途,但是您必须能够在流中设置分隔符,而这并不总是可行,对吗?例如。现在我正在使用来自 Web API 的 InputStream。 - 方法 3,即
slurp
函数中的InputStreamReader
,也不起作用 - 它给了我一堆数字,我在其中发送一个包含所有数字的字符串字符类型,所以我的编码可能会搞砸。
但是经过多次 Google 搜索,我终于找到了 String 构造函数方法,这是唯一适合我的方法。
从我链接的线程的评论中,我知道我正在使用的方法中存在编码问题。我已经编码有一段时间了,知道什么是编码以及它们为何存在。但我仍然不知道在哪里使用什么类型的编码,以及如何检测和处理它们。任何有关该主题的资源/帮助也将不胜感激!
最佳答案
这是一种仅使用标准库的方法:
- 使用
ByteArrayOutputStream
并复制您在其中收到的所有字节; - 将此
ByteArrayOutputStream
的字节包装到ByteBuffer
中; - 使用
CharsetDecoder
将ByteBuffer
解码为CharBuffer
; .toString()
倒带后的CharBuffer
。
代码(注意:不处理关闭输入):
// Step 1: read all the bytes
final ByteArrayOutputStream out = new ByteArrayOutputStream();
final byte[] buffer = new byte[8196];
int count;
while ((count = in.read(buffer)) != -1)
out.write(buf, 0, count);
// Step 2: wrap the array
final ByteBuffer byteBuffer = ByteBuffer.wrap(out.toByteArray());
// Step 3: decode
final CharsetDecoder decoder = StandardCharsets.UTF_8.newDecoder()
.onUnmappableCharacter(CodingErrorAction.REPORT)
.onMalformedInput(CodingErrorAction.REPORT);
final CharBuffer charBuffer = decoder.decode(byteBuffer);
charBuffer.flip();
return charBuffer.toString();
关于java - 使用 InputStream 的 String(bytes[]) 构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22919714/