读取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
相关产品推荐
相关产品推荐

