从bufferedreader获取null值

时间:2016-03-20 12:14:29

标签: java input inputstream bufferedreader system.in

我无法理解为什么我在下面的代码(第二行输出)中从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

2 个答案:

答案 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