使用System.in读取控制台输入并输出字节序列的代码错误排查
你的Java代码输出多余0的问题分析与修复方案
嗨,我来帮你拆解代码里的问题:你的输出之所以会多出一堆0,主要是两个关键逻辑处理错了:
问题1:没有利用实际读取的字节数
inputStream.read(bytes)方法会返回实际成功读取到的字节数量——比如你输入"abc"再按回车,实际读取到的是4个字节(a、b、c、换行符)。但你现在的循环是遍历整个bytes数组的长度(50次),数组中那些没被填充的位置默认值是0,这些0就被你打印出来了,这就是多余输出的来源。
问题2:终止循环的逻辑有漏洞
你用bytes[i] == 10(换行符)来break循环,但如果用户输入没有换行(比如直接输入后触发EOF),或者实际读取的字节数远小于数组长度,循环还是会继续跑完50次,照样打印后面的0。
修复后的代码
import java.io.InputStream; class Main { public static void main(String[] args) throws Exception { InputStream inputStream = System.in; byte[] bytes = new byte[50]; // 记录实际读取到的字节总数 int readCount = inputStream.read(bytes); // 只循环处理实际读取到的字节,避免碰数组里的默认0 for (int i = 0; i < readCount; i++) { byte currentByte = bytes[i]; // 跳过换行符(输入回车会产生这个字节,我们不需要打印它) if (currentByte == 10) { continue; } System.out.print(currentByte); } // 注意:System.in是JVM管理的标准输入流,不需要手动关闭 // 关闭后后续程序可能无法再读取标准输入,所以注释掉这行 // inputStream.close(); } }
修复说明
- 用
readCount控制循环范围:只处理真正读取到的字节,彻底避免打印数组中未填充的0; - 把break改成continue:换行符是输入时额外产生的,我们只需要跳过它不打印,而不是直接终止循环(如果需要只处理第一行输入,用break也可以,但这个场景下continue更合适);
- 移除手动关闭流的代码:
System.in是系统级的输入流,JVM会自动管理它的生命周期,手动关闭可能导致后续无法再读取标准输入,完全没必要这么做。
现在测试输入"abc",输出就是预期的979899啦。
内容的提问来源于stack exchange,提问作者Pajet
相关产品推荐
相关产品推荐

