[Java]

2017-11-17 1 views
1

파일의 행 쌍 목록 지정된 텍스트 파일을 한 줄씩 읽는 간단한 방법을 만들고 콘솔에 가능한 모든 쌍을 인쇄합니다. 나는 그것을하려고 노력하고 있었다. 그러나 그것은 이상한 결과를 보여준다. 내 코드는 다음과 같습니다.[Java]

public class MyList{ 
    List<String> elements = new LinkedList<>(); 

    public void createPairs() throws IOException { 
     Scanner scanner = new Scanner(new File("file.txt")); 
     scanner.useDelimeter("\n"); 
     while(scanner.hasNext()){ 
      elements.add(scanner.next()); 
     } 
     scanner.close(); 

     for(String i: elements){ 
      for (String j:elements){ 
       System.out.println(i+" "+j); 
      } 
     } 
    } 

어떤 이유로 인해 한 줄의 반복 된 루프가 표시되고 마지막 줄에는 제대로 쌍을 표시합니다. 즉 file.txt를이 포함됩니다 경우 :

1 
2 
3 

이 결과는 다음과 같습니다 목록에 파일을 읽기

1 
2 
3 
1 
2 
3 
... //it loops for some time 
3 1 
3 2 
3 3 

내가 목록을 단순히 "요소"를 인쇄하려고하면 때문에 아마 괜찮습니다 별도의 List 요소에 파일의 각 행을 올바르게 표시합니다. 내가 뭘 잘못하고 있는지 잘 모르겠다. 제발 도와주세요.

+0

단순히 "1", "2"및 "3"을 입력 파일 (입력 파일 무시)에 추가 할 때 재현 할 수 없습니다. 아마도 파일에는 생각하는 내용이 포함되어 있지 않을 수도 있습니다. – Eran

+0

코드 자체에 이상한 점이 없습니다. – Yash

+0

출력에서 ​​루프를 몇 번이나 반복 했습니까? – Sweeper

답변

3

당신은 Windows 컴퓨터를 사용하고 있습니까? 그렇습니다.

Windows에서 줄 바꿈 문자는 \n 대신 \r\n으로 표시됩니다. 따라서 파일을 만들 때 Enter 키를 누르면 실제로는 \r\n자를 생성합니다.

이 텍스트 파일이 코드에 다음과 같습니다 것을 의미한다 :

1\r\n2\r\n3 

지금, 당신은 구분 기호 \n 인과 함께 읽을 수있는 스캐너를 사용하려고합니다. 무슨 일이 다음 문자를 읽고 있다는 것입니다 : 이제

1\r 
2\r 
3 

, 당신이 일어날 것입니다 매우 다르게 \r 문자, 뭔가를 인쇄 할 때. \r은 캐리지 리턴입니다. 이것은 타자기 시대의 유산 중 하나입니다. 타자기에서 캐리지 리턴 키를 누르면 "커서"가 줄의 시작 부분으로 돌아갑니다. 새 줄 키를 눌러 새 줄을 시작해야합니다. 그러면 캐리지 리턴 키만 누르면 어떻게됩니까? 그것은 라인의 시작 부분에 원래 쓰여진 것을 덮어 씁니다! 그래서 아래 예제는 "World"만을 인쇄합니다.

System.out.println("Hello\rWorld"); 

그래서이 펑키 한 출력을 얻습니다.

이 문제를 해결하려면 구분 기호 사용을 중지하고 스캐너에 nextLine을 시도하십시오. OS에 관계없이 항상 전체 라인을 읽습니다.

+0

그래, 나는 Windows를 사용하고있다. 이제 그것은 매력처럼 작동합니다. 고마워 :) 나는 그것이 유명한 Windows "거꾸로 호환성"여기에 놀이에 있다고 가정합니다. 경로 가변 길이의 길이와 마찬가지로 :) – Arkadeusz91