문제

내가 아는 한, Java의 파일에서 문자 기반 데이터를 읽는 가장 일반적인 두 가지 방법은 Scanner 또는 BufferedReader. 나는 또한 그것을 알고있다 BufferedReader 물리적 디스크 작동을 피하기 위해 버퍼를 사용하여 파일을 효율적으로 읽으십시오. 내 질문은 다음과 같습니다.

  • 하다 Scanner 뿐만 아니라 성능 BufferedReader?
  • 왜 선택하겠습니까? Scanner ~ 위에 BufferedReader 혹은 그 반대로도?
도움이 되었습니까?

해결책

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

실제로 당신은 통과 할 수 있습니다 BufferedReader a scanner 문자의 원천으로.

다른 팁

현재 최신 JDK6 릴리스/빌드 (B27)에서 Scanner 더 작은 버퍼가 있습니다 (1024 숯)와 반대로 BufferedReader (8192 숯), 그러나 그것은 충분합니다.

선택에 관해서는 사용하십시오 Scanner 당신이 원한다면 구문 분석 파일, 사용 BufferedReader 당신이 원한다면 읽다 파일별로 파일. 또한 APIRINGING API 문서의 입문 텍스트도 참조하십시오.

  • 구문 분석 = 주어진 입력을 토큰 (부품)으로 해석합니다. int, 끈, 소수점 등으로 직접 특정 부품을 돌려 줄 수 있습니다. nextXxx() 방법 Scanner 수업.
  • 독서 = 멍청한 스트리밍. 그것은 당신에게 모든 캐릭터를 계속 돌려 주며, 당신은 당신이 유용한 것을 일치 시키거나 구성하고 싶는지 수동으로 검사해야합니다. 그러나 어쨌든 그렇게 할 필요가 없다면 읽기만으로도 충분합니다.

이것 좀 봐 링크, 다음은 다음에서 인용됩니다.

BufferedReader는 언더링 스트림에서 효율적으로 읽는 간단한 클래스입니다. 일반적으로 FilereAder와 같은 독자로 만든 각각의 읽기 요청은 해당 읽기 요청이 기본 스트림에 이루어집니다. read () 또는 readline ()의 각 호출로 인해 파일에서 바이트를 읽고 문자로 변환 한 다음 반환하여 매우 비효율적 일 수 있습니다. 독자가 완충 리더에서 뒤틀린 경우 효율성이 높아집니다.

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

반면에 스캐너에는 훨씬 더 많은 치즈가 내장되어 있습니다. 버퍼드 리더가 할 수있는 모든 일과 동일한 수준의 효율성을 수행 할 수 있습니다. 그러나 스캐너는 정규 표현식을 사용하여 원시 유형 및 문자열의 기본 스트림을 구문 분석 할 수 있습니다. 또한 선택한 구분 기와 함께 기본 스트림을 토큰화할 수 있습니다. 또한 구분기를 무시하는 기본 스트림의 전진 스캔을 수행 할 수 있습니다!

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

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

입력을 읽는 동안에도 사용자 입력을 라인별로 수락하고 파일에 추가하면 버퍼링 리더가 충분합니다. 반면에 여러 옵션이있는 명령으로 사용자 입력을 수락 한 다음 지정된 명령 및 옵션을 기반으로 다른 작업을 수행하려는 경우 스캐너가 더 적합합니다.

  1. BufferedReader 스캐너보다 더 큰 버퍼 메모리가 있습니다. 사용 BufferedReader 스트림에서 긴 줄을 얻고 싶다면 Scanner 스트림에서 특정 유형의 토큰을 구문 분석하려는 경우.

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

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

  4. Scanner ioexception을 숨 깁니다 BufferedReader 즉시 던졌습니다.

사용하는 것이 좋습니다 BufferedReader 읽기 텍스트. Scanner 가죽 IOException 동안 BufferedReader 즉시 던졌습니다.

차이 버퍼링 리더 그리고 스캐너 다음과 같이

  1. BufferedReader입니다 동기화 그러나 스캐너는입니다 동기화되지 않습니다.
  2. BufferedReader입니다 스레드 안전합니다 그러나 스캐너는입니다 스레드 안전하지 않습니다.
  3. 버퍼링 리더 더 큰 버퍼 메모리가 있습니다 하지만 스캐너 버퍼 메모리가 더 작습니다.
  4. BufferedReader입니다 더 빠르게 그러나 스캐너는입니다 실행 속도가 느립니다.
  5. 콘솔에서 라인을 읽는 코드 :

    버퍼링 리더:

     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를 사용하여 String을 읽을 수 있지만 Scanner를 사용하여 int, Long 또는 Float를 읽을 수 있습니다.
  3. BufferedReader는 스캐너에서 오래된 것이며 JDK 1.1에서 존재하는 반면 스캐너는 JDK 5 릴리스에 추가되었습니다.
  4. 버퍼 드 리더의 버퍼 크기는 1KB의 스캐너와 비교하여 큰 (8KB)입니다.
  5. BufferedReader는 긴 문자열을 가진 파일을 읽는 데 더 적합한 반면 스캐너는 명령 프롬프트에서 작은 사용자 입력을 읽는 데 더 적합합니다.
  6. BufferedReader는 동기화되었지만 스캐너는 그렇지 않으므로 여러 스레드에서 스캐너를 공유 할 수 없습니다.
  7. BufferedReader는 파싱에 시간을 소비하지 않기 때문에 스캐너보다 빠릅니다.
  8. BufferedReader는 스캐너에 비해 약간 빠릅니다
  9. BufferedReader는 java.io 패키지에서 왔으며 스캐너는 선택을 선택할 수있는 포인트를 기준으로 java.util 패키지의 스캐너입니다.

감사

주요 차이점 :

  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 :

    • 문자, 배열 및 선을 효율적으로 읽을 수 있도록 문자 입력 스트림, 버퍼링 문자의 텍스트를 읽습니다.

    • 버퍼 크기가 지정 될 수 있거나 기본 크기가 사용될 수 있습니다. 기본값은 대부분의 목적으로 충분히 큽니다.

일반적으로, 독자로 만든 각각의 읽기 요청은 해당 읽기 요청이 기본 문자 또는 바이트 스트림으로 만들어집니다. 따라서 Filereaders 및 InputStreamReaders와 같이 READ () 작업이 비용이 많이 드는 판독기 주위에 버퍼드 리더를 랩핑하는 것이 좋습니다. 예를 들어,

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

지정된 파일에서 입력을 버퍼링합니다. 버퍼링이 없으면 read () 또는 readline ()의 각 호출로 인해 파일에서 바이트를 읽고 문자로 변환 한 다음 반환하여 매우 비효율적 일 수 있습니다. 텍스트 입력에 DatainputStream을 사용하는 프로그램은 각 DatainputStream을 적절한 버퍼드 리더로 교체하여 로컬로 현지화 할 수 있습니다.

원천:링크

Java와 같은 다양한 방법이 있습니다.

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

BufferedReader 문자 입력 스트림에서 텍스트를 읽고 버퍼링 문자를 읽어 문자, 배열 및 라인의 효율적인 판독 값을 제공합니다.

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

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

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

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

아래 답변은 가져 왔습니다 콘솔에서 읽기 : Java 스캐너 대 BufferedReader

콘솔에서 입력을 읽으면이를 달성하기위한 두 가지 옵션이 있습니다. 먼저 사용합니다 Scanner, 또 다른 사용 BufferedReader. 둘 다 특성이 다릅니다. 그것은 그것을 사용하는 방법을 의미합니다.

스캐너는 입력을 토큰으로 처리했습니다. bufferedReader는 입력이 문자열로 주어진 줄별로 줄을 읽습니다. 스캐너 자체가 NextInt (), NextFloat ()와 같은 구문 분석 기능을 제공합니다.

그러나 다른 사람들의 차이점은 무엇입니까?

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

스캐너는 JDK 버전 1.5 이후로 제공됩니다.

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

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

  1. BufferedReader는 아마도 더 나은 성능을 제공 할 것입니다 (스캐너는 inputStreamReader, Look 소스를 기반으로하기 때문에). UPS, 파일을 읽기 위해 Nio를 사용합니다. 큰 파일의 BufferedReader 성능에 대해 NIO 성능을 테스트하면 NIO는 약간 더 나은 성능을 보여줍니다.
  2. 파일에서 읽으려면 Apache Commons IO를 사용해보십시오.

나는 선호한다 Scanner 확인 된 예외를 던지지 않으므로 사용량이 더 간소화 된 코드가 발생하기 때문입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top