我无法理解为什么我在下面的代码(第二行输出)中从bufferedreader获取null,而它在某些地方(第一行输出)工作正常。
我已经使用了几个system.out.println来进行调试。
虽然BufferedReader.readLine()仅在到达流的末尾时返回null,但是正在提供输入(如程序下面的输入所示)。请帮助我了解获取null的原因并建议解决方案。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
import java.lang.Integer;
import java.io.*;
class TestClass {
public static void main(String args[] ) throws Exception {
//* Read input from stdin and provide input before running
List a2=new ArrayList();
String[] a1=new String[2];
int count=0;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine();
/*for (String retval: line.split(" "))
a2.add(retval);*/
a1=line.split(" ");
//System.out.println("here 0"+a1[0]+" "+a1[1]);
/*int N = Integer.parseInt((a2.get(0)).toString());
int Q= Integer.parseInt((a2.get(1)).toString());*/
int N = Integer.parseInt(a1[0].toString());
int Q= Integer.parseInt(a1[1].toString());
System.out.println("here xxxxxxxx" + N +" " +Q);
String[] names=new String[N];
for(int i=0;i<N;i++){
//names[i] = (new BufferedReader(new InputStreamReader(System.in))).readLine();
BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in));
names[i] = br1.readLine();
/*Scanner sc=new Scanner(System.in);
names[i]=sc.nextLine();*/
}
System.out.println("here 111" + names[0]);
for(int i=0;i<Q;i++) {
br = new BufferedReader(new InputStreamReader(System.in));
String line1 = br.readLine();
try{
System.out.println("here 1" + line1);
int M = Integer.parseInt(line1);
System.out.println("here 2");
if(M<=20){
System.out.println("here 3");
count++;
}
}
catch(Exception e){
System.out.println("here 4");
if(!((Arrays.asList(names)).contains(line))){
System.out.println("here 5");
count++;
}
}
}
System.out.println(count);
}
}
输入
输入的第一行将包含两个空格分隔的整数,表示N和Q.
接下来N行将包含字符串
下一行Q行将包含一个整数或表示人名的字符串。必须实现不同的逻辑,具体取决于它是aString还是Integer。
enter code here
输入和输出如下:
Input:
2 4
pranjul
sachin
21
19
pranjul
vipul
Output:
here xxxxxxxx2 4
here 111null
here 1null
here 4
here 5
here 1null
here 4
here 5
here 1null
here 4
here 5
here 1null
here 4
here 5
4
答案 0 :(得分:1)
您正尝试在同一输入流上打开多个阅读器。
当您阅读第一个br.readLine()
中的内容时,会发生以下情况:
BufferedReader
有一个需要填充的内部缓冲区。它会从基础read
调用InputStreamReader
方法以填充它。InputStreamReader
为了将输入流中的字节转换为字符,使用StreamDecoder
。因此它调用了StreamDecoder
的{{1}}方法。在内部,它还有一个缓冲区,它从底层流中读取尽可能多的字节到该缓冲区。这意味着只要您阅读一行,您还会读取该行以外的多个字符。 read
字节缓冲区的默认大小为8K,因此如果它们可用,则从StreamDecoder
读取8K字节。
如果在交互模式下使用System.in
,则每个只读填充缓冲区的字节数与当时可用的字节数一样多。因此,它只填充一行直到用户按下System.in
,因此,当您打开其他Enter
个实例时,他们将获得用户输入的下一个输入。
但如果BufferedReader
从一个文件或其他流中重定向,而它在行尾没有阻塞,则会读取整个文件(假设文件小于8K)第一次打电话给System.in
。该数据在readLine
的缓冲区或基础BufferedReader
的缓冲区中等待。
因此,当您在StreamDecoder
上打开新的BufferedReader
时,该流中不再有数据 - 它已被第一个System.in
读取。这就是为什么不建议在单个流上打开多个阅读器的原因。
答案 1 :(得分:0)
首先,如果你使用io,你不需要前两行。*; 其次,为什么你使用这么多的流,如果1就够了
import java.util.*;
import java.lang.Integer;
import java.io.*;
class TestClass {
public static void main(String args[] ) throws Exception {
List a2=new ArrayList();
int count=0;
Scanner br = new Scanner(System.in);
String line = br.nextLine();
String[] a1=line.split(" ");
int N = Integer.parseInt(a1[0]);
int Q= Integer.parseInt(a1[1]);
System.out.println("here xxxxxxxx" + N +" " +Q);
String[] names=new String[N];
for(int i=0;i<N;i++){
names[i]=br.nextLine();
}
System.out.println("here 111" + names[0]);
for(int i=0;i<Q;i++) {
String line1 = br.nextLine();
try{
System.out.println("here 1" + line1);
int M = Integer.parseInt(line1);
System.out.println("here 2");
if(M<=20){
System.out.println("here 3");
count++;
}
}
catch(Exception e){
System.out.println("here 4");
if(!((Arrays.asList(names)).contains(line))){
System.out.println("here 5");
count++; } } }
System.out.println(count);
br.close();}}
我没有测试代码,但它应该工作 我是用扫描仪做的,但你也可以使用bufferedreader