[java] 스캐너 대 버퍼 리더

지금까지 내가 아는 한, 자바 파일에서 문자 기반 데이터를 읽는 가장 일반적인 두 가지 방법을 사용 Scanner하거나 BufferedReader. 또한 BufferedReader물리적 디스크 작업을 피하기 위해 버퍼를 사용하여 파일을 효율적으로 읽습니다.

내 질문은 :

  • Scanner뿐만 아니라 수행 합니까 BufferedReader?
  • 왜 당신은 그 Scanner이상 을 선택 BufferedReader합니까?


답변

Scanner스트림의 내용에서 토큰을 구문 분석하는 데 사용되며 스트림을 BufferedReader읽고 특별한 구문 분석을 수행하지 않습니다.

실제로 구문 분석 할 문자의 소스로 a BufferedReader를 전달할 수 있습니다 scanner.


답변

현재 최신 JDK6 릴리스 / 빌드 (b27) 에서 ( 8192 문자 ) 와 비교하여 Scanner더 작은 버퍼 ( 1024 문자 )를 가지고 있지만 충분합니다.BufferedReader

선택에 따라 파일 Scanner구문 분석 하려면 BufferedReaderif를 사용 하고 파일을 한 행씩 읽으 려면 if를 사용하십시오 . 또한 앞서 언급 한 API 설명서의 소개 텍스트를 참조하십시오.

  • 파싱 = 주어진 입력을 토큰 (부품)으로 해석 특정 부분을 int, string, decimal 등으로 직접 되돌릴 수 있습니다 . 클래스의 모든 nextXxx()메소드를 참조하십시오 Scanner.
  • 읽기 = 멍청한 스트리밍. 그것은 당신에게 모든 문자를 계속 돌려 주므로, 당신이 유용한 것을 일치 시키거나 구성하고 싶은지 수동으로 검사해야합니다. 그러나 어쨌든 그렇게 할 필요가 없다면 독서로 충분합니다.

답변

링크를 참조하십시오 .

BufferedReader는 기본 스트림에서 효율적으로 읽을 수있는 간단한 클래스입니다. 일반적으로, FileReader와 같이 Reader로 작성된 각 읽기 요청은 해당 읽기 요청이 기본 스트림에 작성되도록합니다. read () 또는 readLine ()을 호출 할 때마다 파일에서 바이트를 읽고 문자로 변환 한 다음 리턴하여 매우 비효율적 일 수 있습니다. BufferedReader에서 Reader가 변형되면 효율성이 크게 향상됩니다.

BufferedReader는 동기화되므로 BufferedReader에 대한 읽기 작업을 여러 스레드에서 안전하게 수행 할 수 있습니다.

반면에 스캐너에는 더 많은 치즈가 내장되어 있습니다. BufferedReader가 할 수있는 모든 작업과 동일한 수준의 효율성을 수행 할 수 있습니다. 그러나 또한 스캐너는 정규식을 사용하여 기본 유형 및 문자열의 기본 스트림을 구문 분석 할 수 있습니다. 또한 선택한 구분 기호로 기본 스트림을 토큰화할 수 있습니다. 또한 구분 기호를 무시하고 기본 스트림의 순방향 스캐닝을 수행 할 수 있습니다!

그러나 스캐너는 스레드 안전하지 않으므로 외부에서 동기화해야합니다.

간단한 로그 리더를 작성하는 경우 BufferedReader 또는 스캐너 사용 선택은 작성중인 코드에 따라 다릅니다. 버퍼 리더가 적합합니다. 그러나 XML 파서를 작성하는 경우 스캐너가 더 자연스러운 선택입니다.

입력을 읽는 동안에도 한 줄씩 사용자 입력을 수락하고 파일에 추가한다고 말하면 BufferedReader가 충분합니다. 반면에 여러 옵션이있는 명령으로 사용자 입력을 수락하고 지정된 명령과 옵션에 따라 다른 작업을 수행하려는 경우 스캐너가 더 적합합니다.


답변

  1. BufferedReader스캐너보다 버퍼 메모리가 훨씬 큽니다. 사용 BufferedReader이 긴 스트림에서 문자열 및 사용을 얻으려면 Scanner당신이 스트림에서 토큰의 특정 유형을 구문 분석합니다.

  2. Scanner사용자 정의 구분 기호를 사용하여 토큰 화를 사용하고 스트림을 기본 유형의 데이터로 구문 분석하고 BufferedReader문자열을 읽고 저장할 수만 있습니다.

  3. BufferedReaderScanner아닌 동안 동기 입니다. BufferedReader여러 스레드로 작업하는 경우 사용하십시오 .

  4. ScannerIOException을 BufferedReader즉시 throw 하면서 숨 깁니다 .


답변

BufferedReader텍스트를 읽는 데 사용 하는 것이 좋습니다 . 던지는 동안 Scanner숨 깁니다 .IOExceptionBufferedReader


답변

BufferedReader스캐너의 차이점 은 다음과 같습니다.

  1. BufferedReader는 동기화 되었지만 스캐너는 동기화되지 않았습니다 .
  2. BufferedReader는 스레드로부터 안전 하지만 스캐너는 스레드로부터 안전하지 않습니다 .
  3. BufferedReader의 버퍼 메모리는 크지 만 스캐너의 버퍼 메모리는 작습니다 .
  4. BufferedReader는 빠르지 만 스캐너의 실행 속도느립니다 .
  5. 콘솔에서 줄을 읽는 코드 :

    BufferedReader :

     InputStreamReader isr=new InputStreamReader(System.in);
     BufferedReader br= new BufferedReader(isr);
     String st= br.readLine();

    스캐너 :

    Scanner sc= new Scanner(System.in);
    String st= sc.nextLine();

답변

다음은 BufferedReader와 스캐너의 차이점입니다.

  1. BufferedReader는 데이터를 읽지 만 스캐너는 데이터를 구문 분석합니다.
  2. BufferedReader를 사용하여 문자열을 읽을 수 있지만 스캐너를 사용하여 int, long 또는 float를 읽을 수 있습니다.
  3. BufferedReader는 스캐너에서 이전 버전이며 스캐너가 JDK 5 릴리스에 추가 된 동안 jdk 1.1에서 존재합니다.
  4. BufferedReader의 버퍼 크기는 1KB의 스캐너와 비교하여 8KB입니다.
  5. BufferedReader는 긴 문자열로 파일을 읽는 데 더 적합한 반면 스캐너는 명령 프롬프트에서 작은 사용자 입력을 읽는 데 더 적합합니다.
  6. BufferedReader가 동기화되었지만 스캐너가 일치하지 않으므로 여러 스레드간에 스캐너를 공유 할 수 없습니다.
  7. BufferedReader는 구문 분석에 시간을 소비하지 않기 때문에 스캐너보다 빠릅니다.
  8. BufferedReader는 스캐너에 비해 약간 빠릅니다.
  9. BufferedReader는 java.io 패키지에서, 스캐너는 java.util 패키지에서 선택합니다.

감사