0

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)

*/
halfer
  • 19,824
  • 17
  • 99
  • 186
0xe82de
  • 3
  • 2
  • 5
    Closing Scanner causes closing source of its data, here `System.in` (representing standard input) which prevents using it father. – Pshemo Aug 04 '21 at 16:44
  • [What does scanner.close() do?](https://stackoverflow.com/q/26245468) – Pshemo Aug 04 '21 at 16:47
  • These question might be a little bit rlated: 1.[Close Scanner without closing System.in](https://stackoverflow.com/questions/14962082/close-scanner-without-closing-system-in) 2. [Close a Scanner linked to System.in](https://stackoverflow.com/questions/14142853/close-a-scanner-linked-to-system-in) – OH GOD SPIDERS Aug 04 '21 at 16:49
  • In short: don't close what you didn't open. *Standard in* is 'wired' by the JVM, so let the JVM close it. – MC Emperor Aug 05 '21 at 23:10

1 Answers1

0
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 ;)