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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 05:20:43