如何在Java中使用BufferedReader读取空格分隔的独立输入
问题描述
原本使用Scanner类的nextInt()方法可以正常读取如5 3这类空格分隔的输入,为了实现更快的I/O切换到BufferedReader类后,使用readLine()无法将空格分隔的输入识别为独立整数。
代码示例
import java.util.*; import java.lang.*; import java.io.*; public class Main { public static void main (String[] args) throws java.lang.Exception { try{ InputStreamReader r=new InputStreamReader(System.in); BufferedReader br=new BufferedReader(r); int t= Integer.valueOf(br.readLine()); while(t-->0){ int mel=Integer.valueOf(br.readLine()); int ban=Integer.valueOf(br.readLine()); System.out.println(cho(mel,ban)); } }catch(Exception e){ return; } } public static int cho(int m,int b) { if(m==0 || b==0 || (m==b)) { return (m+b); } else { return m>b? cho((m-=b),b): cho(m,(b-=m)); } } }
输入输出情况
- 输入:
2 5 3 10 10 - 预期输出:
2 20 - 实际输出:
2 5 3 ...Program finished with exit code 0 Press ENTER to exit console.
解决方案
问题核心是readLine()会读取整行完整内容,不像nextInt()会自动跳过空白字符、读取单个整数。需要将读取到的内容按空格分割后,再逐个转换为整数,以下是两种实用修改方案:
方案1:一次性读取所有输入并处理
适合输入在同一行的场景,把所有输入读入后按空白字符分割成数组,再逐个取出整数使用:
import java.util.*; import java.lang.*; import java.io.*; public class Main { public static void main (String[] args) throws java.lang.Exception { try{ InputStreamReader r=new InputStreamReader(System.in); BufferedReader br=new BufferedReader(r); // 按任意数量空白字符分割输入 String[] inputParts = br.readLine().split("\\s+"); int ptr = 0; int t= Integer.parseInt(inputParts[ptr++]); while(t-->0){ int mel=Integer.parseInt(inputParts[ptr++]); int ban=Integer.parseInt(inputParts[ptr++]); System.out.println(cho(mel,ban)); } }catch(Exception e){ e.printStackTrace(); } } public static int cho(int m,int b) { if(m==0 || b==0 || (m==b)) { return (m+b); } else { return m>b? cho((m-=b),b): cho(m,(b-=m)); } } }
方案2:逐行读取并分割(兼容多行输入)
如果输入是每行包含多个整数的场景,用StringTokenizer逐行分割处理,性能更优:
import java.util.*; import java.lang.*; import java.io.*; public class Main { public static void main (String[] args) throws java.lang.Exception { try{ InputStreamReader r=new InputStreamReader(System.in); BufferedReader br=new BufferedReader(r); int t= Integer.parseInt(br.readLine()); StringTokenizer tokenizer; while(t-->0){ // 读取当前行并分割为单个数字token tokenizer = new StringTokenizer(br.readLine()); int mel=Integer.parseInt(tokenizer.nextToken()); int ban=Integer.parseInt(tokenizer.nextToken()); System.out.println(cho(mel,ban)); } }catch(Exception e){ e.printStackTrace(); } } public static int cho(int m,int b) { if(m==0 || b==0 || (m==b)) { return (m+b); } else { return m>b? cho((m-=b),b): cho(m,(b-=m)); } } }
关键细节说明
split("\\s+")会匹配任意数量的空白字符(空格、制表符等),避免多空格导致的分割错误。StringTokenizer是Java专门用于字符串分割的工具类,处理大量输入时性能比split更出色。- 替换
Integer.valueOf()为Integer.parseInt(),前者返回包装类型,后者直接返回基本类型int,更高效。
内容的提问来源于stack exchange,提问作者Dhyan Prasad
相关产品推荐
相关产品推荐

