2010-04-18 33 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超過任何字符。

如果你想想看,如果你希望一個ScannerhasNextLine()上一個空字符串,並在nextLine()返回一個空字符串,那麼這將導致一個無限循環:它會總是hasNextLine(),它會總是返回空字符串nextLine()永遠。這種行爲顯然是不切實際的。

+0

我已將整個方法添加到我的OP中。你能檢查它嗎? – ShrimpCrackers 2010-04-18 03:24:06

+0

方法對我來說很好。使用'wc -l'或十六進制編輯器等來查看文件真正包含的內容。做「如果我按右箭頭鍵它不會移動」測試是無用的,因爲它依賴於文本編輯器的行爲,而不是實際的文件包含。 – polygenelubricants 2010-04-18 03:30:01

+0

謝謝。我的猜測是它不是一個分隔符,而是一個空字符串。如果我的猜測是正確的,我將如何拾取一個空字符串?查看上面添加的代碼。 – ShrimpCrackers 2010-04-18 03:43:40

1

該代碼工作正常,我 - 你肯定有真正的最後一個空白行(如在文件結尾兩個換行符,而不是一個)?

+0

是的。那麼,如果你可以稱之爲空白線,我不會。它更像是一個空的字符串?沒有什麼。例如,如果在最後一行將光標設置爲它並按下右箭頭鍵,則它不會移動。 – ShrimpCrackers 2010-04-18 03:16:38

1

掃描儀不會拾取空字符串。沒有任何東西可以標記。掃描儀是一個標記器,默認根據Java 6 javadoc使用Character.isWhitespace。每次在令牌被作爲字符串返回之前遇到一切,但不包括該令牌。如果最後一項是令牌,它將被刪除,並且不會添加新行。您的ArrayList中可能會有空字符串,但它只是一個空字符串,因爲該標記已被刪除。沒有數據,也沒有令牌和掃描儀沒有看到一條線。你在編輯器中看到的不是空白的行。你的光標處於一個字符將被添加,如果你鍵入。如果你沒有輸入任何東西,那裏就沒有實際的線條。

+0

謝謝。這就說得通了。我想我可以放棄它。 – ShrimpCrackers 2010-04-18 18:41:57

0

我想指出的是,這兩個

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

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

還給正是利用@polygenelubricants代碼相同的結果是:

[Line1] 
[Line2] 
[] 
[Line4] 

因爲掃描儀沒有按不會放棄最後的「換行」角色。

所以,如果你想得到最後一個「空」的行,這是不正確的解決方案,你應該閱讀每個字節。