Scanner 클래스의 next () 및 nextLine () 메서드의 차이점은 무엇입니까?


답변:


86

나는 항상 입력을 읽고 nextLine()문자열을 파싱하는 것을 선호 합니다.

를 사용 next()하면 구분 기호 앞에 오는 것만 반환합니다 (기본값은 공백). nextLine()현재 라인을 반환 한 후 자동으로 스캐너를 아래로 이동합니다.

에서 분석 데이터에 대한 유용한 도구가 nextLine()될 것이다 str.split("\\s+").

String data = scanner.nextLine();
String[] pieces = data.split("\\s+");
// Parse the pieces

Scanner 클래스 또는 String 클래스에 대한 자세한 내용은 다음 링크를 참조하십시오.

스캐너 : http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html

문자열 : http://docs.oracle.com/javase/7/docs/api/java/lang/String.html


5
그렇다면 a BufferedReader를 사용하여 한 줄씩 읽지 않는 이유는 무엇입니까? 왜 Scanner그렇게 유행 하는지 이해가 안 돼요 .
David Conrad

7
@DavidConrad "Scanner 클래스의 next () 메서드와 nextLine () 메서드의 차이점은 무엇입니까?"
Tristan

4
네, 그게 OP가 요청한 것임을 압니다. 당신이 nextLine을 사용하는 것을 "항상 선호한다"고 말했기 때문에 그냥 궁금했습니다.
David Conrad

nextLine ()을 안전하게 수행 한 다음 해당 라인에 대한 새 스캐너를 만들 수 있습니다. Scanner 클래스는 문자열을 스캔 할 수 있습니다. new Scanner (new Scanner (System.in) .nextLine ()).
axell13

47

next()공간까지만 입력을 읽을 수 있습니다. 공백으로 구분 된 두 단어를 읽을 수 없습니다. 또한 next()입력을 읽은 후 커서를 같은 줄에 놓습니다.

nextLine()단어 사이의 공백을 포함하여 입력을 읽습니다 (즉, 줄 끝까지 읽음 \n). 입력을 읽으면 nextLine()커서를 다음 줄에 놓습니다.

전체 줄을 읽으려면 nextLine().


@LuiggiMendoza 당신은 형식적인 글이 아니라 형식을 의미합니까?
Det

next ()는 공백 까지만 입력을 읽을 수 있습니다 . 공백으로 구분 된 두 단어를 읽을 수 없습니다 . 공백 에는 공백, 탭 및 줄 바꿈이 포함됩니다.
Fred Hu

18

JavaDoc에서 :

  • A Scanner는 기본적으로 공백과 일치하는 구분 기호 패턴을 사용하여 입력을 토큰으로 나눕니다.
  • next():이 스캐너에서 다음 완전한 토큰을 찾아 반환합니다.
  • nextLine(): 현재 줄을 지나서이 스캐너를 진행하고 건너 뛴 입력을 반환합니다.

따라서의 경우 "small example<eol>text" next()"small" nextLine()을 반환하고 "small example"을 반환해야합니다.


1
반환 된 토큰에를 next()포함 하지 않는 이유는 무엇 \n입니까 ??
rimalonfire

1
이것은 Java API 디자이너에게 질문하거나 SO에 대한 질문을 게시하면 누군가가 그 이유를 알 수 있습니다.
Oleg Sklyar

10

next ()를 제외하고는 nextLine ()이 전체 라인을 스캔하는 공간까지만 스캔한다는 점 은 nextLine ()이 완전한 토큰을 기다리지 않고 '\ n'일 때 완전한 토큰을 얻을 때까지 대기 한다는 것입니다. (즉, Enter 키를 누르면) 스캐너 커서가 다음 줄로 이동하고 건너 뛴 이전 줄로 돌아갑니다. 완전한 입력을 제공했는지 여부를 확인하지 않습니다. 심지어 next ()가 빈 문자열을 사용하지 않는 빈 문자열을 사용합니다.

public class ScannerTest {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int cases = sc.nextInt();
        String []str = new String[cases];
        for(int i=0;i<cases;i++){
            str[i]=sc.next();
        }
     }

}

for 루프에서 next ()와 nextLine ()을 변경하여이 프로그램을 시도하고, 아무 입력없이 엔터 키 인 '\ n'을 계속 누르면 주어진 수의 경우를 누른 후 종료되는 nextLine () 메소드 를 사용할 수 있습니다 . 로 다음 () doesnot 종료 의 경우, 지정된 번호를 여기에 당신이 제공 전까지 입력합니다.


1
매우 흥미로운 예입니다. 코드를 실행하면 next()실제로 어떻게 작동 하는지 보았습니다 . Enter 키를 무시하고 nexLine()완전한 입력으로 받아들이고 캡처 된 값을 에코하면 콘솔에 복제합니다. 나는 방금 System.out.println(str[i]);아래에 새 줄로 추가 str[i]=sc.next();했거나str[i]=sc.nextLine();
Pablo Adames

대답 당신이 그렇게 좋아하는 경우에 경우에 당신이 찬성 투표 할 수있는 경우 @PabloAdames는 감사
무랄리 Krish 수출

9

요점은 메서드가 중지되는 위치와 메서드를 호출 한 후 커서가있는 위치를 찾는 것입니다.

모든 메서드는 커서 위치와 다음 기본 구분 기호 (공백, 탭, \ n--Enter를 눌러 생성됨) 사이에 공백을 포함하지 않는 정보를 읽습니다. 커서 nextLine()는 커서 위치와 \ n 사이의 정보 (구분자에 의해 생성 된 공백 포함)를 읽는를 제외하고 구분자 앞에 멈추고 커서는 \ n 뒤에 멈 춥니 다.


예를 들어, 다음 그림을 고려하십시오.

|23_24_25_26_27\n

| -> 현재 커서 위치

_ -> 공백

스트림 -> 굵게 (호출 메서드에서 얻은 정보)

다음 메서드를 호출하면 어떻게되는지 확인하세요.

nextInt()    

23 읽기 | _24_25_26_27 \ n

nextDouble()

23_ 읽기 (24) _25_26_27 \ n을 |

next()

23_24_ 25 읽기 | _26_27 \ n

nextLine()

23_24_25 _26_27 읽기 \ n |


그런 다음 요구 사항에 따라 메서드를 호출해야합니다.


2
과소 평가 된 답변. 다른 모든 약간 오해의 소지가있다
csguy

3

간단히 말해서 길이 t의 문자열 배열을 입력하는 경우 Scanner # nextLine ()은 t 줄을 예상하고 문자열 배열의 각 항목은 Enter 키로 다른 항목과 구분되며 Scanner # next ()는 다음까지 입력을 계속받습니다. Enter 키를 누르면 공백으로 구분 된 배열 내부에 문자열 (단어)이 저장됩니다.

다음 코드 스 니펫을 살펴 보겠습니다.

    Scanner in = new Scanner(System.in);
    int t = in.nextInt();
    String[] s = new String[t];

    for (int i = 0; i < t; i++) {
        s[i] = in.next();
    }

IDE에서 코드 스 니펫 위를 실행할 때 (문자열 길이 2에 대해 말할 수 있음) 내 문자열을 다음과 같이 입력하는지 여부는 중요하지 않습니다.

입력 :-abcd abcd 또는

다음과 같이 입력하십시오.

abcd

abcd

출력은 abcd와 같습니다.

abcd

그러나 동일한 코드에서 next () 메서드를 nextLine ()으로 대체하면

    Scanner in = new Scanner(System.in);
    int t = in.nextInt();
    String[] s = new String[t];

    for (int i = 0; i < t; i++) {
        s[i] = in.nextLine();
    }

그런 다음 프롬프트에 다음과 같이 입력하면-abcd abcd

출력은 다음과 같습니다.

abcd abcd

프롬프트에 abcd로 입력을 입력하면 (그리고 Enter 키를 눌러 다른 줄에 다음 abcd를 입력하면 입력 프롬프트가 종료되고 출력이 표시됩니다)

출력은 다음과 같습니다.

abcd


2

에서 의 javadoc

next () 지정된 문자열에서 생성 된 패턴과 일치하면 다음 토큰을 반환합니다. nextLine () 현재 행을지나이 스캐너를 진행시키고 건너 뛴 입력을 리턴합니다.

당신이 선택하는 것은 당신의 필요에 가장 적합한 것이 무엇인지에 달려 있습니다. 내가 전체 파일을 읽는다면 모든 파일을 가질 때까지 nextLine으로 갈 것입니다.


1

스캐너 설명서에서 :

Scanner는 기본적으로 공백과 일치 하는 구분 기호 패턴을 사용하여 입력을 토큰으로 나눕니다 .

next ()에 대한 문서에서 :

완전한 토큰 앞에는 구분 기호 패턴과 일치하는 입력이옵니다.


1

next () 및 nextLine () 메서드는 Scanner와 연결되어 있으며 문자열 입력을 가져 오는 데 사용됩니다. 그들의 차이점은 ...

next ()는 공백까지만 입력을 읽을 수 있습니다. 공백으로 구분 된 두 단어를 읽을 수 없습니다. 또한 next ()는 입력을 읽은 후 같은 줄에 커서를 놓습니다.

nextLine ()은 단어 사이의 공백을 포함하여 입력을 읽습니다 (즉, 줄 끝까지 읽음 \ n). 입력이 읽 히면 nextLine ()은 커서를 다음 줄에 놓습니다.

import java.util.Scanner;

public class temp
{
    public static void main(String arg[])
    {
        Scanner sc=new Scanner(System.in);
        System.out.println("enter string for c");
        String c=sc.next();
        System.out.println("c is "+c);
        System.out.println("enter string for d");
        String d=sc.next();
        System.out.println("d is "+d);
    }
}

산출:

c abc에 대한 문자열을 입력하십시오. def
c는 abc입니다.

d에 대한 문자열 입력

d는 def

next () 대신 nextLine ()을 사용하면

산출:

c에 대한 문자열 입력

ABC DEF
c는 ABC DEF
d에 대한 문자열 입력

GHI
d는 GHI입니다.


1
  • Scanner.next () 및 nextLine ()의 또 다른 예는 다음과 같습니다. nextLine ()은 사용자가 입력을 허용하지 않는 반면 next ()는 Scanner가 입력을 대기하고 읽도록합니다.

     Scanner sc = new Scanner(System.in);
    
     do {
        System.out.println("The values on dice are :");
        for(int i = 0; i < n; i++) {
            System.out.println(ran.nextInt(6) + 1);
        }
        System.out.println("Continue : yes or no");
     } while(sc.next().equals("yes"));
    // while(sc.nextLine().equals("yes"));
    

1

스캐너 는 기본적으로 Whitespaces로 알려진 구분 기호 패턴을 사용하여 입력을 토큰으로 나눕니다 .

Next () 는 한 단어를 읽는 데 사용하고 공백이 생기면 읽기를 중지하고 커서를 원래 위치로 되돌립니다. NextLine () 이것은 공백을 만나도 전체 단어를 읽는 동안 커서는 읽기가 끝나면 멈추고 커서는 줄의 끝으로 돌아갑니다 . 유는 사용할 필요가 없습니다 분리 문자를 사용하면 sentence.you 그냥 꽵를 사용할 필요로 전체 단어를 읽을하고자 할 때 ().

 public static void main(String[] args) {
            // TODO code application logic here
           String str;
            Scanner input = new Scanner( System.in );
            str=input.nextLine();
            System.out.println(str);
       }

1

두 기능 모두 다음 스캐너 토큰으로 이동하는 데 사용됩니다.

차이점은 스캐너 토큰이 생성되는 방식에 있습니다.

next ()는 구분 기호를 공백 으로 사용하여 스캐너 토큰을 생성합니다.

nextLine ()은 구분 기호를 '\ n' 으로 사용하여 스캐너 토큰을 생성합니다 (예 : Enter 키 누름).


0

구분자에 관한 문제도 있습니다. 질문은 모든 입력에 관한 것이었다

  1. 당신의 이름을 입력.
  2. 나이를 입력하세요.
  3. 이메일을 입력하십시오.
  4. 주소를 입력하십시오.

문제

  1. 이름, 나이, 이메일로 성공적으로 마쳤습니다.
  2. 공백 (Harnet street) 이있는 두 단어의 주소를 생각해 냈을 때 방금 첫 번째 "harnet"을 얻었습니다.

해결책

스캐너에 구분자를 사용했고 성공적으로 나갔습니다.

 public static void main (String args[]){
     //Initialize the Scanner this way so that it delimits input using a new line character.
    Scanner s = new Scanner(System.in).useDelimiter("\n");
    System.out.println("Enter Your Name: ");
    String name = s.next();
    System.out.println("Enter Your Age: ");
    int age = s.nextInt();
    System.out.println("Enter Your E-mail: ");
    String email = s.next();
    System.out.println("Enter Your Address: ");
    String address = s.next();

    System.out.println("Name: "+name);
    System.out.println("Age: "+age);
    System.out.println("E-mail: "+email);
    System.out.println("Address: "+address);
}

0

기본적인 차이점은 next ()는 구분 기호 (기본적으로 공백이지만 변경할 수 있음)까지 입력을 가져오고 입력 한 토큰을 반환하는 데 사용되며 커서는 같은 줄에 남아 있습니다. nextLine ()에서는 Enter 버튼을 누를 때까지 입력을 스캔하고 전체를 반환하고 커서를 다음 줄에 놓습니다. **

        Scanner sc=new Scanner(System.in);
        String s[]=new String[2];
        for(int i=0;i<2;i++){
            s[i]=sc.next();
        }
        for(int j=0;j<2;j++)
        {
            System.out.println("The string at position "+j+ " is "+s[j]);
        }

**

입력을 "Hello World"로 지정하여이 코드를 실행 해보십시오. 스캐너는 'o'까지 입력을 읽은 다음 구분 기호가 발생합니다. 따라서 s [0]은 "Hello"가되고 커서는 delimiter () 다음 위치를 가리 킵니다. s [1]을 읽으면 "World"를 스캔하고 다음 완전한 토큰으로 s [1]에 반환합니다 (Scanner 정의에 따라). nextLine ()을 사용하면 대신 엔터 버튼을 누르고 s [0]에 저장할 때까지 "Hello World"를 완전히 읽습니다. nextLine ()을 사용하여 다른 문자열을 줄 수도 있습니다. 이 예제 등을 사용하여 설명을 요청하는 것이 좋습니다.

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