java - 使用 InputStream 的 String(bytes[]) 构造函数

标签 java android

我想知道使用我所谓的“字符串构造函数方法”将 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 中;
  • 使用 CharsetDecoderByteBuffer 解码为 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/

相关文章:

Android ListView 中的虚线分隔线

java - jUnit if/else 语句 java

java - HTTPS POST 请求(java)到网站(php),如何处理来自它的数据?

android - 作业调度程序 : controlling delay from constraints being met to job being run

Android:GoogleAnalytics 与 EasyTracker

android - LinearLayout 中的 ConstraintLayout 不起作用

java - 是否有一个 Eclipse 插件可以让您在多个 Subversion 修订版中区分单个 Java 方法?

java - 通过 Java 解析输出

java - 如何使用 JSON 数组制作 ExpandableListView

android - FirebaseMessagingService 11.6.0 处理 Intent