2010-04-18 2 views
0
 while(inStream.hasNextLine()) 
     { 
       ... 

       lineList.add(inStream.nextLine()); 
     } 
     ... 

lineList는 ArrayList입니다. 코드는 마지막 줄을 잡아 내지 않는 것을 제외하고는 모든 것을 잘 읽고 있습니다. 텍스트 파일의 마지막 두 행은 다음과 같이 끝 : 나는 믿고있어Java - 스캐너를 사용하여 마지막 줄을 얻으려면 어떻게해야합니까?

"a sentence here..." 
<a blank line here. the blank line is the last line> 

이 hasNextLine()이 일 후에 다른 라인을 감지하지 않기 때문에 그것을 잡아되지 않습니다?

마지막 줄을 잡는 방법은 무엇입니까? 나는 그것이 EOF 일 때까지 읽은 다음 예외를 잡는 것이 효과가있을 것이라고 생각했지만 그럴 수있는 방법이없는 것 같습니다.

편집 : 더 많은 정보

public void readLines() 
{ 
    lineList = new ArrayList(); 

    try 
    { 
     inStream = new Scanner(new File(fileName)); 
    } 
    catch(FileNotFoundException e) 
    { 
     System.out.println("Error opening the file. Try again."); 
    } 


    if (inStream != null) 
    { 
     while(inStream.hasNextLine()) 
     { 
      ++originalLines; 

      lineList.add(inStream.nextLine()); 
     } 
     inStream.close(); 
    } 
} 

전체 방법이있다. 뭐가 잘못 됐니?

편집 : 더 많은 정보

public static void main(String[] args) 
{ 
    Scanner inStream = null; 
    String test = ""; 

    inStream = new Scanner(test); 

    while(inStream.hasNextLine()) 
    { 
     System.out.println(inStream.nextLine()); 
    } 
} 

그것은 빈 문자열을 선택하지 않습니다하지만이 공백 ""

답변

4

nextLine()은 공백 인 경우에도 마지막 줄을 반환하는 데는 문제가 없습니다. 네 문제가 다른 곳에 있다고 생각해.

String multilinetext = 
    "Line1\n" + 
    "Line2\n" + 
    "\n" + 
    "Line4\n" + 
    "\n"; 
Scanner sc = new Scanner(multilinetext); 
while (sc.hasNextLine()) { 
    System.out.println("[" + sc.nextLine() + "]"); 
} 
/* prints 
[Line1] 
[Line2] 
[] 
[Line4] 
[] 
*/ 


은 빈 문자열

이 디자인에 의해 올바른 동작입니다을 선택하지 않습니다. 입력이 빈 문자열 인 경우 ScannerhasNextLine()이라고 말하면서 nextLine()에 빈 문자열을 반환 할 수 없습니다. 특히 문자를 지나서 Scanner이 나오지 않으므로 입력하십시오. 그것은 것 항상hasNextLine()하고 을 것입니다 : 당신이 빈 문자열에 hasNextLine() 말을하고 nextLine()에 빈 문자열을 반환하는 Scanner를 기대하는 경우, 다음이 무한 루프가 발생할 것입니다, 그것에 대해 생각하는 경우

항상은 빈 문자열을 nextLine()에 영구히으로 반환합니다. 그러한 행동은 분명히 비실용적입니다.

+0

전체 방법을 내 OP에 추가했습니다. 확인해 주시겠습니까? – ShrimpCrackers

+0

방법이 저에게 잘 보입니다. 'wc -l' 또는 16 진수 편집기 등을 사용하여 파일에 실제로 무엇이 들어 있는지 확인하십시오. "오른쪽 화살표 키를 누르면 이동하지 않을 것"이라는 테스트는 쓸모가 없습니다. 실제 파일에 포함 된 것이 아니라 텍스트 편집기의 동작에 의존하기 때문입니다. – polygenelubricants

+0

감사합니다. 내 생각 엔 구분 기호가 아니라 빈 문자열이라는 것입니다. 내 추측이 맞다면 빈 문자열을 어떻게 가져 옵니까? 위의 추가 된 코드를 참조하십시오. – ShrimpCrackers

1

그 코드는 나를 위해 잘 작동을 선택할 것입니다 - 당신이 실제로 거기에 확신 끝에있는 공백 행 (파일이 단지 하나가 아닌 두 개의 개행으로 끝남)?

+0

예. 글쎄, 나는 빈 줄이라고 부를 수 없다. 빈 문자열과 더 비슷합니까? 거기에는 아무것도 없다. 예를 들어, 마지막 행에서 커서를 그것에 설정하고 오른쪽 화살표 키를 누르면 이동하지 않습니다. – ShrimpCrackers

1

스캐너는 빈 문자열을 선택하지 않습니다. 토큰화할 것이 없습니다. Scanner는 Java 6 javadoc에 따라 Character.isWhitespace를 사용하도록 기본값으로 설정된 토크 나이저입니다. 토큰을 만날 때마다 토큰을 포함하지 않고 문자열로 반환됩니다. 마지막 항목이 토큰이면 제거되고 새 줄이 추가되지 않습니다. ArrayList에 빈 문자열로 끝날 수도 있지만 토큰이 제거 되었기 때문에 빈 문자열 만됩니다. 데이터가없고 토큰도 없으며 스캐너에 선이 표시되지 않습니다. 에디터에서보고있는 내용은 빈 줄이 아닙니다. 입력 할 때 커서가 추가됩니다. 아무 것도 입력하지 않으면 거기에 실제 줄이 없습니다.

+0

감사합니다. 그건 의미가 있습니다. 나는 그것을 그냥 버릴 수 있다고 생각합니다. – ShrimpCrackers

0

내가 모두

String multilinetext = 
    "Line1\n" + 
    "Line2\n" + 
    "\n" + 
    "Line4\n"; 

String multilinetext = 
    "Line1\n" + 
    "Line2\n" + 
    "\n" + 
    "Line4"; 

는 @polygenelubricants 코드를 사용하여 정확히 같은 결과를 다시 제공한다는 점을 지적하고 싶습니다 :

[Line1] 
[Line2] 
[] 
[Line4] 

스캐너 아무튼 때문에 마지막 "개행"문자를 돌려주지 마라.

그래서 마지막 "빈"줄을 얻고 싶다면 이것이 올바른 해결책이 아니므로 모든 바이트를 읽어야합니다.

관련 문제