스캐너 대 버퍼 리더


284

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

내 질문은 :

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

1
나는 일반적으로 표준에서 읽을 때 스캐너를 사용합니다 ( '스캐너 입력 = 새로운 스캐너 (System.in)'은 훨씬 깨끗합니다). 그것이 실제로 덜 효율적인지 확실하지 않지만 std in에서 읽는 것이 차단되어 있기 때문에 스캐너의 효율성이 문제가 될 것이라고 상상할 수 없습니다.
dimo414

답변:


201

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

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


55
BufferedReader는 동기화되고 스캐너는 서로 다르므로 결정해야합니다.
Reuben

1
나는이 주제가 오래되었다는 것을 알고 있지만 Process에서 제공하는 스트림 (예 : 외부 명령의 출력 캡처)에서 콘텐츠를 훔치려 고 할 때 BufferedReader를 사용하는 운영 체제간에 결과가 혼합되어 있습니다. 별도의 답변 에서 언급했듯이 스캐너를 대신 사용하도록 코드를 변경하면 일관되고 예상대로 작동하기 시작했습니다.
ewh

@Reuben 그러나 Scanner궁극적으로 동기화 할 수있는 다른 입력에 의존합니다.
Lorne의 후작

189

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

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

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

1
좋은데 버퍼 팁 감사합니다. 네이티브 읽기가 매우 비싸기 때문에 모든 것을 찾고있었습니다.
Achow

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

@BalusC Ok 이미 사용한 readInt();readFloat (); 이제 구문 분석의 의미가 무엇인지 확인했습니다. BalusC는 대화방에서 단 10 분만 시간을 내주실 수 있습니까? 버퍼링, 작동 방식에 대해 조금 묻고 싶습니다.
Asif Mushtaq

BufferedReader스캐너 생성자에서 무엇을 포장 합니까? 이것이 좋은 생각입니까?
vivek

1
Scanner패턴 일치에 필요한만큼 버퍼가 확장됩니다. 따라서 더 큰 버퍼를 원하면 예를 들어 버퍼를 호출 한 후에 만 findWithinHorizon("\\z", 8192)용량이 8192char (또는 그보다 작은 경우 전체 파일) 의 버퍼를 사용합니다 .
Holger

77

링크를 참조하십시오 .

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

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

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

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

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

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


"반면에 스캐너에는 훨씬 더 많은 치즈가 내장되어 있습니다. BufferedReader가 할 수있는 모든 작업과 동일한 수준의 효율성에서도 수행 할 수 있습니다." 스캐너가 입력 데이터를 구문 분석하고 BufferedReader는 단순히 일련의 문자를 읽기 때문에 BufferedReader는 스캐너와 비교할 때 약간 빠릅니다.
Pratik

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

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

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

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


18

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


12

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

8

다음은 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 패키지에서 선택합니다.

감사


6

주요 차이점 :

  1. 스캐너

  • 정규식을 사용하여 기본 유형 및 문자열을 구문 분석 할 수있는 간단한 텍스트 스캐너입니다.
  • 스캐너는 기본적으로 공백과 일치하는 구분 기호 패턴을 사용하여 입력을 토큰으로 나눕니다. 결과 토큰은 다양한 다음 방법을 사용하여 다른 유형의 값으로 변환 될 수 있습니다.

 String input = "1 fish 2 fish red fish blue fish";
 Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*");
 System.out.println(s.nextInt());
 System.out.println(s.nextInt());
 System.out.println(s.next());
 System.out.println(s.next());
 s.close(); 

다음과 같은 출력을 인쇄합니다.

 1
 2
 red
 blue 

이 코드를 사용하여 동일한 출력을 생성 할 수 있습니다. 정규식을 사용하여 4 개의 토큰을 모두 한 번에 구문 분석합니다.

 String input = "1 fish 2 fish red fish blue fish";

 Scanner s = new Scanner(input);
 s.findInLine("(\\d+) fish (\\d+) fish (\\w+) fish (\\w+)");
 MatchResult result = s.match();
 for (int i=1; i<=result.groupCount(); i++)
     System.out.println(result.group(i));
 s.close(); `


  1. BufferedReader :

    • 문자 입력 스트림에서 문자를 버퍼링하여 문자, 배열 및 행을 효율적으로 읽을 수 있도록 문자를 버퍼링합니다.

    • 버퍼 크기를 지정하거나 기본 크기를 사용할 수 있습니다. 대부분의 경우 기본값은 충분히 큽니다.

일반적으로 Reader로 작성된 각 읽기 요청은 해당 읽기 요청이 기본 문자 또는 바이트 스트림으로 이루어 지도록합니다. 따라서 FileReader 및 InputStreamReader와 같이 read () 작업에 비용이 많이 드는 모든 Reader 주위에 BufferedReader를 랩핑하는 것이 좋습니다. 예를 들어

BufferedReader in
   = new BufferedReader(new FileReader("foo.in"));

지정된 파일의 입력을 버퍼링합니다. 버퍼링없이 read () 또는 readLine ()을 호출 할 때마다 파일에서 바이트를 읽고 문자로 변환 한 다음 리턴하여 매우 비효율적 일 수 있습니다. 텍스트 입력에 DataInputStream을 사용하는 프로그램은 각 DataInputStream을 적절한 BufferedReader로 대체하여 현지화 할 수 있습니다.

출처 : 링크


3

Java에서 입력을받는 방법은 여러 가지가 있습니다.

1) BufferedReader 2) 스캐너 3) 명령 줄 인수

BufferedReader 문자, 배열 및 행을 효율적으로 읽을 수 있도록 문자를 버퍼링하여 문자 입력 스트림에서 텍스트를 읽습니다.

여기서 스캐너는 정규식을 사용하여 기본 유형 및 문자열을 구문 분석 할 수있는 간단한 텍스트 스캐너입니다.

간단한 로그 리더를 작성하는 경우 버퍼 리더가 적합합니다. XML 파서를 작성하는 경우 스캐너가 더 자연스러운 선택입니다.

자세한 내용은 다음을 참조하십시오.

http://java.meritcampus.com/t/240/Bufferedreader?tc=mm69


1

아래 답변 은 콘솔 에서 읽기에서 가져옵니다 . JAVA 스캐너 및 BufferedReader

콘솔에서 입력을 읽을 때 두 가지 옵션이 있습니다. 먼저을 사용 Scanner하고 다른을 사용 BufferedReader합니다. 둘 다 다른 특성을 가지고 있습니다. 사용 방법의 차이를 의미합니다.

스캐너는 주어진 입력을 토큰으로 처리했습니다. BufferedReader는 주어진 입력을 문자열로 한 줄씩 읽습니다. 스캐너 자체는 nextInt (), nextFloat ()와 같은 구문 분석 기능을 제공합니다.

그러나 다른 차이점은 무엇입니까?

  • 스캐너는 주어진 입력을 토큰으로 처리했습니다. 스트림 라인 / 문자열로서의 BufferedReader
  • 정규식을 사용하여 주어진 입력으로 스캐너 토큰 화. BufferedReader를 사용하면 추가 코드를 작성해야합니다.
  • 스캐너보다 빠른 BufferedReader * 포인트 번호. 2
  • 스캐너가 동기화되지 않았으며 BufferedReader가 동기화되었습니다.

스캐너는 JDK 버전 1.5 이상부터 제공됩니다.

언제 스캐너 또는 버퍼 리더를 사용해야합니까?

하나는 토큰 화를 사용하고 다른 하나는 유선을 사용하는 두 가지의 주요 차이점을 살펴보십시오. 구문 분석 기능이 필요한 경우 대신 스캐너를 사용하십시오. 그러나 BufferedReader에 더 익숙합니다. 파일에서 읽을 때는 파일을 읽을 때 버퍼를 사용하므로 BufferedReader를 사용하십시오. 또는 BufferedReader를 스캐너의 입력으로 사용할 수 있습니다.


0
  1. BufferedReader는 아마도 스캐너가 InputStreamReader를 기반으로하기 때문에 소스를 보이므로 더 나은 성능을 제공 할 것입니다. 파일에서 읽기 위해 nio를 사용합니다. 큰 파일의 BufferedReader 성능과 비교하여 nio 성능을 테스트했을 때 nio가 약간 더 나은 성능을 보여줍니다.
  2. 파일에서 읽으려면 Apache Commons IO를 시도하십시오.

0

Scanner확인 된 예외를 발생시키지 않기 때문에 사용이 더 간소화 된 코드를 선호 하기 때문에 선호 합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.