javajava.util.scannerbufferedreadersystem.in

Can I use bufferedreader after using scanner?


I am testing Scanner and Bufferedreader. I tried to use BufferedReader after using Scanner.

However, if I close the scanner, an error occurs. Why is there an error?

I tried googling, but I don't understand.

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

public class ScannerAndBufferedReaderTest2 {

    public static void main(String[] args) throws IOException {
        
        // Scanner
        Scanner sc = new Scanner(System.in);
        
        System.out.print("Enter number : ");
        int in1 = sc.nextInt();
        sc.close(); // <-- If I erase this part, there will be no error.
        
        System.out.println("Your number : " + in1);
        
        // BufferedReader
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        bw.write("Enter number: ");
        bw.flush();
        int in2 = Integer.parseInt(br.readLine());
        br.close();
        
        bw.write("Your number : " + String.valueOf(in2));
        bw.flush();
        bw.close();
        
    }

}

/* Error

Exception in thread "main" java.io.IOException: Stream closed
    at java.base/java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:176)
    at java.base/java.io.BufferedInputStream.read(BufferedInputStream.java:342)
    at java.base/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
    at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
    at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
    at java.base/java.io.InputStreamReader.read(InputStreamReader.java:181)
    at java.base/java.io.BufferedReader.fill(BufferedReader.java:161)
    at java.base/java.io.BufferedReader.readLine(BufferedReader.java:326)
    at java.base/java.io.BufferedReader.readLine(BufferedReader.java:392)
    at test.Test2.main(Test2.java:27)

*/

Solution

  • Scanner sc = new Scanner(System.in);  //" 1st time "
        
        System.out.print("Enter number : ");
        int in1 = sc.nextInt();
        sc.close(); // <-- If I erase this part, there will be no error.
        
        System.out.println("Your number : " + in1);
        
        // BufferedReader
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  //"2nd time"
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        bw.write("Enter number: ");
        bw.flush();
        int in2 = Integer.parseInt(br.readLine());
        br.close();
        
        bw.write("Your number : " + String.valueOf(in2));
        bw.flush();
        bw.close();
        sc.close(); // **"close your scanner over here"**
    

    you are taking two time input from user using keyboard that is provided by(System.in) while you are closing Scanner, This means that you are closing whole System.in. if you still wanted to close your scanner write at the end of the program. Good Luck ;)