2016-10-24 4 views
-3

System.in에서 무언가를 읽는 간단한 방법 readIn()을 만들려고합니다. Eclipse에서 실행할 때 System.console()이 null을 반환하기 때문에 Console을 사용할 수 없습니다. 아이디어는 여기에 readIn()의 가장 간단한 형태의이close() 입력 스트림을 영구적으로 닫습니다.

classs Foo{ 
    public static void(String[] arg){ 

     String first = readIn("First, please"); 
     System.out.println(first); 

     String second = readIn("Second, please"); 
     System.out.println(second); 
    } 
} 

처럼 필요에 따라 readIn를 호출하는 것입니다 : 나는 그것을 잘 작동 br.close() 문을 생략하면

static String readIn(String prompt){ 

    System.out.println(prompt + ": "); 
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
    String line = br.readLine(); 
    br.close(); // PROBLEM STATEMENT 
    return line; 

} 

- 나는 반복 readIn를 호출 할 수 있습니다. 그러나 내가 닫아야 만한다면 br, 그러면 첫 번째 호출 만 작동합니다. 두 번째 호출은 IOException: Stream closed을 던졌습니다. 예상대로 같은 일이 readIn에 시도 -과 - 자원 발생합니다

static String readIn(String prompt){ 

    System.out.println(prompt + ": "); 
    String line; 
    try(
     BufferedReader br = new BufferedReader(
     new InputStreamReader(System.in)) ) 
    { 
     line = br.readLine(); 
    } 

    return line; 
} 

같은 일이 Scanner(System.in) 대신 BufferedReader으로 발생합니다. 파일을 읽을 때 발생하지 않습니다.

readIn을 호출 할 때마다 BufferedReader 또는 Scanner이 새로 작성되면 어떤 스트림이 종료됩니까? 이것은 "close(에 관한 것입니까?)"기본 Read/Closeable "(System.in)을 닫고 있습니까? 다시 열 수 있습니까? 이해하려고 노력하고있어, 고마워.

+8

예, 기본 리소스를 닫습니다. 이것은 Javadoc에 분명히 명시되어 있습니다. 읽기마다 BufferedReader 또는 Scanner를 만들고 닫는 작업을해서는 안됩니다. 기본 리소스의 수명 동안 동일한 내용을 사용해야합니다. – EJP

+0

확인. 그리고 기본 System.in 리소스의 수명은 무엇입니까? JVM의 실행과 동일합니까? – user3501758

+0

그게 자발적으로 닫히지 않습니다. – EJP

답변

0

br.close();도 시스템 입력 스트림 System.in을 닫습니다. 따라서 JVM을 다시 시작하지 않는 한 사용할 수 없습니다.

System.out.println 
br.readLine(); 

그들은 서로 다른 스트림에 관련되어 있으므로 문제가 안 : 당신은 전화를 혼합하는 것이 부끄러워하지 말고 System.in

에서 필요한 모든 입력에 대해 같은 BufferedReader 인스턴스를 사용할 수 있습니다 .

관련 문제