Java, BufferedReader] Integer.parseInt(br.readline()) 和 br.read()-'0' 的区别

Java, BufferedReader] Difference between Integer.parseInt(br.readline()) and br.read()-'0'

我正在尝试使用 BufferedReader 计算 a+b。我尝试了两个代码,每个代码都使用 read()readLine(),但我不明白为什么第一个代码有效而第二个代码无效。 Integer.parseInt(br.readline())br.read()-'0'有区别吗?他们不都是 return primitive int 吗? 这是第一个代码。它工作正常。

package level3;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.IOException;
import java.util.StringTokenizer;

public class ABPlusFast {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;
        int t = Integer.parseInt(br.readLine());
        
        for (int i=0; i<t; i++) {
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            bw.write(a+b+"\n");
        }
        bw.flush();
        bw.close();
    }
}

这是第二个不起作用的代码。如果我给出一个数字作为输入,那么它 returns a NoSuchElementException() in StringTokenizer.class.

package level3;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.IOException;
import java.util.StringTokenizer;

public class ABPlusFast {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;
        int t = br.read();
        
        for (int i=0; i<(t-'0'); i++) {
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            bw.write(a+b+"\n");
        }
        bw.flush();
        bw.close();
    }
}

不可能告诉您为什么一个版本“有效”而另一个版本“无效”...除非您清楚:

  1. 在此上下文中,您所说的“有效”和“无效”是什么意思,以及

  2. 正是您提供的输入。


但是,这两个版本之间存在明显差异。

第一个版本读取标准输入的整个第一行并尝试将其解析为整数。

第二个版本读取标准输入的第一个字符并尝试将其解释为一个数字。这意味着:

  • 如果第一行的数字中有两位或更多位,它将忽略除第一位以外的所有数字。

  • 如果第一个字符不是数字,就会发生不好的事情1.

  • 如果标准输入流是空的,read()会return-1并且会发生不好的事情1.

  • 这不会消耗第一行的其余部分。因此,当您随后在第一个循环迭代中调用 nextLine() 时,它将 return 第一行的其余部分 。当您随后尝试标记化和解析 that 时,可能会发生坏事 1

我敢说第二个版本不正确


1 - 我不打算详细说明......因为“坏事”将取决于实际输入。