지금까지 내가 아는 한, 자바 파일에서 문자 기반 데이터를 읽는 가장 일반적인 두 가지 방법을 사용 Scanner
하거나 BufferedReader
. 또한 BufferedReader
물리적 디스크 작업을 피하기 위해 버퍼를 사용하여 파일을 효율적으로 읽습니다.
내 질문은 :
Scanner
뿐만 아니라 수행 합니까BufferedReader
?- 왜 당신은 그
Scanner
이상 을 선택BufferedReader
합니까?
답변
Scanner
스트림의 내용에서 토큰을 구문 분석하는 데 사용되며 스트림을 BufferedReader
읽고 특별한 구문 분석을 수행하지 않습니다.
실제로 구문 분석 할 문자의 소스로 a BufferedReader
를 전달할 수 있습니다 scanner
.
답변
현재 최신 JDK6 릴리스 / 빌드 (b27) 에서 ( 8192 문자 ) 와 비교하여 Scanner
더 작은 버퍼 ( 1024 문자 )를 가지고 있지만 충분합니다.BufferedReader
선택에 따라 파일 Scanner
을 구문 분석 하려면 BufferedReader
if를 사용 하고 파일을 한 행씩 읽으 려면 if를 사용하십시오 . 또한 앞서 언급 한 API 설명서의 소개 텍스트를 참조하십시오.
- 파싱 = 주어진 입력을 토큰 (부품)으로 해석 특정 부분을 int, string, decimal 등으로 직접 되돌릴 수 있습니다 . 클래스의 모든
nextXxx()
메소드를 참조하십시오Scanner
. - 읽기 = 멍청한 스트리밍. 그것은 당신에게 모든 문자를 계속 돌려 주므로, 당신이 유용한 것을 일치 시키거나 구성하고 싶은지 수동으로 검사해야합니다. 그러나 어쨌든 그렇게 할 필요가 없다면 독서로 충분합니다.
답변
이 링크를 참조하십시오 .
BufferedReader는 기본 스트림에서 효율적으로 읽을 수있는 간단한 클래스입니다. 일반적으로, FileReader와 같이 Reader로 작성된 각 읽기 요청은 해당 읽기 요청이 기본 스트림에 작성되도록합니다. read () 또는 readLine ()을 호출 할 때마다 파일에서 바이트를 읽고 문자로 변환 한 다음 리턴하여 매우 비효율적 일 수 있습니다. BufferedReader에서 Reader가 변형되면 효율성이 크게 향상됩니다.
BufferedReader는 동기화되므로 BufferedReader에 대한 읽기 작업을 여러 스레드에서 안전하게 수행 할 수 있습니다.
반면에 스캐너에는 더 많은 치즈가 내장되어 있습니다. BufferedReader가 할 수있는 모든 작업과 동일한 수준의 효율성을 수행 할 수 있습니다. 그러나 또한 스캐너는 정규식을 사용하여 기본 유형 및 문자열의 기본 스트림을 구문 분석 할 수 있습니다. 또한 선택한 구분 기호로 기본 스트림을 토큰화할 수 있습니다. 또한 구분 기호를 무시하고 기본 스트림의 순방향 스캐닝을 수행 할 수 있습니다!
그러나 스캐너는 스레드 안전하지 않으므로 외부에서 동기화해야합니다.
간단한 로그 리더를 작성하는 경우 BufferedReader 또는 스캐너 사용 선택은 작성중인 코드에 따라 다릅니다. 버퍼 리더가 적합합니다. 그러나 XML 파서를 작성하는 경우 스캐너가 더 자연스러운 선택입니다.
입력을 읽는 동안에도 한 줄씩 사용자 입력을 수락하고 파일에 추가한다고 말하면 BufferedReader가 충분합니다. 반면에 여러 옵션이있는 명령으로 사용자 입력을 수락하고 지정된 명령과 옵션에 따라 다른 작업을 수행하려는 경우 스캐너가 더 적합합니다.
답변
-
BufferedReader
스캐너보다 버퍼 메모리가 훨씬 큽니다. 사용BufferedReader
이 긴 스트림에서 문자열 및 사용을 얻으려면Scanner
당신이 스트림에서 토큰의 특정 유형을 구문 분석합니다. -
Scanner
사용자 정의 구분 기호를 사용하여 토큰 화를 사용하고 스트림을 기본 유형의 데이터로 구문 분석하고BufferedReader
문자열을 읽고 저장할 수만 있습니다. -
BufferedReader
Scanner
아닌 동안 동기 입니다.BufferedReader
여러 스레드로 작업하는 경우 사용하십시오 . -
Scanner
IOException을BufferedReader
즉시 throw 하면서 숨 깁니다 .
답변
BufferedReader
텍스트를 읽는 데 사용 하는 것이 좋습니다 . 던지는 동안 Scanner
숨 깁니다 .IOException
BufferedReader
답변
BufferedReader 와 스캐너의 차이점 은 다음과 같습니다.
- BufferedReader는 동기화 되었지만 스캐너는 동기화되지 않았습니다 .
- BufferedReader는 스레드로부터 안전 하지만 스캐너는 스레드로부터 안전하지 않습니다 .
- BufferedReader의 버퍼 메모리는 크지 만 스캐너의 버퍼 메모리는 작습니다 .
- BufferedReader는 빠르지 만 스캐너의 실행 속도 는 느립니다 .
-
콘솔에서 줄을 읽는 코드 :
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와 스캐너의 차이점입니다.
- BufferedReader는 데이터를 읽지 만 스캐너는 데이터를 구문 분석합니다.
- BufferedReader를 사용하여 문자열을 읽을 수 있지만 스캐너를 사용하여 int, long 또는 float를 읽을 수 있습니다.
- BufferedReader는 스캐너에서 이전 버전이며 스캐너가 JDK 5 릴리스에 추가 된 동안 jdk 1.1에서 존재합니다.
- BufferedReader의 버퍼 크기는 1KB의 스캐너와 비교하여 8KB입니다.
- BufferedReader는 긴 문자열로 파일을 읽는 데 더 적합한 반면 스캐너는 명령 프롬프트에서 작은 사용자 입력을 읽는 데 더 적합합니다.
- BufferedReader가 동기화되었지만 스캐너가 일치하지 않으므로 여러 스레드간에 스캐너를 공유 할 수 없습니다.
- BufferedReader는 구문 분석에 시간을 소비하지 않기 때문에 스캐너보다 빠릅니다.
- BufferedReader는 스캐너에 비해 약간 빠릅니다.
- BufferedReader는 java.io 패키지에서, 스캐너는 java.util 패키지에서 선택합니다.
감사