Stream closed and not reopened - Java

后端 未结 2 855
一个人的身影
一个人的身影 2021-01-24 02:50

I have an easy \'homework\' to do, but I have found a little problem with the closure of the input stream. To put it simply, I have to make a contact \'list\' application in Jav

相关标签:
2条回答
  • 2021-01-24 03:38

    You could still use try-with-resources if you wrap System.in with a CloseShieldInputStream.

    I would also recommend using a Scanner instead of the InputStreamReader and BufferedReader, because of it's simplicity:

    import java.util.Scanner;
    import org.apache.commons.io.input.CloseShieldInputStream;
    
    public class Contact {
    
        protected String name;
        protected String surname;
        protected String email;
    
        public void modify() throws IOException {
            System.out.println("Previously name: " + name);
            System.out.println("Insert new name");
            try (Scanner sc = new Scanner(new CloseShieldInputStream(System.in))) {
                name = sc.nextLine();
                System.out.println("You've changed the name to: " + name);
                System.out.println("Previously surname: " + surname);
                System.out.println("Insert new surname");
                surname = sc.nextLine();
                System.out.println("You've changed the surname to: " + surname);
                System.out.println("Previously e-mail: " + email);
                System.out.println("Insert new e-mail");
                email = sc.nextLine();
                System.out.println("You've changed the e-mail to: " + email);
            }
        }
    }
    
    public class Private extends Contact {
    
        private String cell;
        private String skype;
    
        @Override
        public void modify() throws IOException {
            super.modify();
            System.out.println("Numero di cellulare precedente: " + cell);
            System.out.println("Inserire nuovo numero");
            try (Scanner sc = new Scanner(new CloseShieldInputStream(System.in))) {
                cell = sc.nextLine();
                System.out.println("Hai cambiato il numero in: " + cell);
                System.out.println("Contatto skype precedente: " + skype);
                System.out.println("Inserire nuovo contatto");
                skype = sc.nextLine();
                System.out.println("Hai cambiato il contatto in: " + skype);
            }
        }
    }
    

    See also: Closing BufferedReader and System.in

    0 讨论(0)
  • 2021-01-24 03:40

    Your problem is indeed due to the try-with-resource statement that closes new InputStreamReader(System.in) which behind the scene closes also the underlying input stream that is System.in (in is a public static field of System) such that in your modify method System.in is already closed and then cannot be read anymore this is why you get this exception.

    0 讨论(0)
提交回复
热议问题