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

Java Stream遍历参数时CLI输入异常:首个参数需两次回车且值为空

解决第一个CLI参数输入需两次回车且值为空的问题

这个问题的根源在于你在每次循环迭代中都重复创建了InputStreamReader和BufferedReader实例,而System.in是全局共享的输入流,重复创建读取器会打乱流的读取位置,导致第一个输入的内容被后续读取器错误处理,最终第一个参数的值为空。

修正后的代码

把读取器的初始化移到循环外部,只创建一次即可解决问题:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class ConfigBuilderApplication {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("parameterOne");
        list.add("parameterTwo");
        list.add("parameterThree");
        promptForParameterInput(list);
    }

    public static HashMap<String, String> promptForParameterInput(List<String> parameters) {
        System.out.println("There are " + parameters.size() + " parameters to designate.");
        HashMap<String, String> map = new HashMap<>();
        
        // 仅初始化一次读取器,在整个循环中复用
        try (InputStreamReader reader = new InputStreamReader(System.in);
             BufferedReader bufferedReader = new BufferedReader(reader)) {
            
            for (String parameter : parameters) {
                System.out.println("provide a value for " + parameter + ": ");
                String input = bufferedReader.readLine();
                map.put(parameter, input);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        System.out.println(map);
        return map;
    }
}

问题原因说明

  • System.in是一个字节输入流,多次创建BufferedReader时,每个新读取器都会从流的当前位置开始读取。第一次输入的换行符可能被第一个读取器的缓冲机制残留,导致后续读取器错误地读取到空内容。
  • 复用同一个BufferedReader能保证所有输入按顺序被正确读取,每次readLine()都会准确捕获用户输入的一行内容(自动丢弃末尾的换行符),不会出现流位置混乱的情况。
  • 这里还使用了try-with-resources语法,确保读取器在使用后自动关闭,避免资源泄漏的同时让代码更简洁。

测试修正后的代码,你会发现第一个参数输入后只需按一次回车就能继续,且参数值会被正确捕获。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 19:43:11