지금까지 내가 아는 한, 자바 파일에서 문자 기반 데이터를 읽는 가장 일반적인 두 가지 방법을 사용 Scanner
하거나 BufferedReader
. 또한 BufferedReader
물리적 디스크 작업을 피하기 위해 버퍼를 사용하여 파일을 효율적으로 읽습니다.
내 질문은 :
Scanner
뿐만 아니라 수행 합니까BufferedReader
?- 왜 당신은 그
Scanner
이상 을 선택BufferedReader
합니까?
지금까지 내가 아는 한, 자바 파일에서 문자 기반 데이터를 읽는 가장 일반적인 두 가지 방법을 사용 Scanner
하거나 BufferedReader
. 또한 BufferedReader
물리적 디스크 작업을 피하기 위해 버퍼를 사용하여 파일을 효율적으로 읽습니다.
내 질문은 :
Scanner
뿐만 아니라 수행 합니까 BufferedReader
?Scanner
이상 을 선택 BufferedReader
합니까?답변:
현재 최신 JDK6 릴리스 / 빌드 (b27) 에서 ( 8192 문자 ) 와 비교하여 Scanner
더 작은 버퍼 ( 1024 문자 )를 가지고 있지만 충분합니다.BufferedReader
선택에 따라 파일 Scanner
을 구문 분석 하려면 BufferedReader
if를 사용 하고 파일을 한 행씩 읽으 려면 if를 사용하십시오 . 또한 앞서 언급 한 API 설명서의 소개 텍스트를 참조하십시오.
nextXxx()
메소드를 참조하십시오 Scanner
.readInt();
readFloat (); 이제 구문 분석의 의미가 무엇인지 확인했습니다. BalusC는 대화방에서 단 10 분만 시간을 내주실 수 있습니까? 버퍼링, 작동 방식에 대해 조금 묻고 싶습니다.
BufferedReader
스캐너 생성자에서 무엇을 포장 합니까? 이것이 좋은 생각입니까?
Scanner
패턴 일치에 필요한만큼 버퍼가 확장됩니다. 따라서 더 큰 버퍼를 원하면 예를 들어 버퍼를 호출 한 후에 만 findWithinHorizon("\\z", 8192)
용량이 8192
char (또는 그보다 작은 경우 전체 파일) 의 버퍼를 사용합니다 .
이 링크를 참조하십시오 .
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 와 스캐너의 차이점 은 다음과 같습니다.
콘솔에서 줄을 읽는 코드 :
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와 스캐너의 차이점입니다.
감사
주요 차이점 :
예
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(); `
BufferedReader :
문자 입력 스트림에서 문자를 버퍼링하여 문자, 배열 및 행을 효율적으로 읽을 수 있도록 문자를 버퍼링합니다.
버퍼 크기를 지정하거나 기본 크기를 사용할 수 있습니다. 대부분의 경우 기본값은 충분히 큽니다.
일반적으로 Reader로 작성된 각 읽기 요청은 해당 읽기 요청이 기본 문자 또는 바이트 스트림으로 이루어 지도록합니다. 따라서 FileReader 및 InputStreamReader와 같이 read () 작업에 비용이 많이 드는 모든 Reader 주위에 BufferedReader를 랩핑하는 것이 좋습니다. 예를 들어
BufferedReader in
= new BufferedReader(new FileReader("foo.in"));
지정된 파일의 입력을 버퍼링합니다. 버퍼링없이 read () 또는 readLine ()을 호출 할 때마다 파일에서 바이트를 읽고 문자로 변환 한 다음 리턴하여 매우 비효율적 일 수 있습니다. 텍스트 입력에 DataInputStream을 사용하는 프로그램은 각 DataInputStream을 적절한 BufferedReader로 대체하여 현지화 할 수 있습니다.
출처 : 링크
Java에서 입력을받는 방법은 여러 가지가 있습니다.
1) BufferedReader 2) 스캐너 3) 명령 줄 인수
BufferedReader 문자, 배열 및 행을 효율적으로 읽을 수 있도록 문자를 버퍼링하여 문자 입력 스트림에서 텍스트를 읽습니다.
여기서 스캐너는 정규식을 사용하여 기본 유형 및 문자열을 구문 분석 할 수있는 간단한 텍스트 스캐너입니다.
간단한 로그 리더를 작성하는 경우 버퍼 리더가 적합합니다. XML 파서를 작성하는 경우 스캐너가 더 자연스러운 선택입니다.
자세한 내용은 다음을 참조하십시오.
아래 답변 은 콘솔 에서 읽기에서 가져옵니다 . JAVA 스캐너 및 BufferedReader
콘솔에서 입력을 읽을 때 두 가지 옵션이 있습니다. 먼저을 사용 Scanner
하고 다른을 사용 BufferedReader
합니다. 둘 다 다른 특성을 가지고 있습니다. 사용 방법의 차이를 의미합니다.
스캐너는 주어진 입력을 토큰으로 처리했습니다. BufferedReader는 주어진 입력을 문자열로 한 줄씩 읽습니다. 스캐너 자체는 nextInt (), nextFloat ()와 같은 구문 분석 기능을 제공합니다.
그러나 다른 차이점은 무엇입니까?
스캐너는 JDK 버전 1.5 이상부터 제공됩니다.
언제 스캐너 또는 버퍼 리더를 사용해야합니까?
하나는 토큰 화를 사용하고 다른 하나는 유선을 사용하는 두 가지의 주요 차이점을 살펴보십시오. 구문 분석 기능이 필요한 경우 대신 스캐너를 사용하십시오. 그러나 BufferedReader에 더 익숙합니다. 파일에서 읽을 때는 파일을 읽을 때 버퍼를 사용하므로 BufferedReader를 사용하십시오. 또는 BufferedReader를 스캐너의 입력으로 사용할 수 있습니다.