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

