You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

读取InputStream部分内容转Byte列表时输出全为-1的问题求助

问题根因
  • 最核心错误:同时通过BufferedReader和原始InputStream读取同一个流数据。BufferedReader自带缓冲区,调用reader.read()时会一次性预读默认8K字节到内部缓冲区,后续直接调用in.read()/in.readNBytes()读取的是已经被BufferedReader消费过的剩余流内容,自然大部分返回-1。
  • 逻辑错误:第一个循环中每次读取一个字符后额外调用in.readNBytes(2)跳过2字节、第二个循环中读取字符后又从原始流读2字节的逻辑完全不符合需求,属于流读取逻辑混乱。
  • 隐含问题:InputStreamReader未指定字符编码,会依赖运行环境的默认编码,可能出现字符解析错误。
修正后的实现

直接通过BufferedReader读取字符定位引号区间,拿到目标字符串后再转字节列表即可,示例代码如下:

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.nio.charset.StandardCharsets;

public static List<Byte> getQuoted(InputStream in) throws IOException {
    try (BufferedReader reader = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8))) {
        StringBuilder content = new StringBuilder();
        boolean inQuote = false;
        int c;
        while ((c = reader.read()) != -1) {
            char ch = (char) c;
            if (ch == '"') {
                if (inQuote) {
                    // 遇到第二个引号,结束读取
                    break;
                } else {
                    // 遇到第一个引号,开始记录内容
                    inQuote = true;
                }
                continue;
            }
            if (inQuote) {
                content.append(ch);
            }
        }
        if (content.length() == 0) {
            return null;
        }
        // 将字符串转为UTF-8编码的字节列表,可按需更换编码
        byte[] bytes = content.toString().getBytes(StandardCharsets.UTF_8);
        List<Byte> byteList = new ArrayList<>();
        for (byte b : bytes) {
            byteList.add(b);
        }
        return byteList;
    } catch (IOException e) {
        throw new IOException("读取流失败", e);
    }
}

上述代码运行后即可得到你预期的输出,对应字符串为return this substring的UTF-8字节序列。

内容的提问来源于stack exchange,提问作者RONOLULU

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 03:36:01