2016-01-21 65 views
0

我只是想知道,我是否正確地解釋了代碼?有關從文件讀取時跳過備用行的說明?

文件Bharath.txt有以下內容:

Hello ! B . We created your file succesfully . We have updated you file , Sir ! Bharath Nikhil Friends Indeed 

考慮下面的代碼:

import java.util.Scanner; 
import java.io.*; 

class FilInpStr 
{ 
    public static void main(String arg[]) throws Exception 
    { 
     FileInputStream obj=new FileInputStream("Bharath.txt"); 
     Scanner input=new Scanner(obj); 

     String n=""; 
     while((n=input.nextLine())!=null) 
     { 
      System.out.println(n); 
     } 

    } 
} 

上面的代碼工作得很好這樣。但是當我不考慮將input.nextLine()存儲在String中時,它開始交替地跳過行。它是否將鍵盤上的輸入爲作爲輸入?

所以,當我按輸入,它也通過轉義序列作爲輸入,這就是爲什麼它跳過一個,並打印另一個?

還有一個疑問是關於while循環:Is是一行被浪費,而比較它是否爲null?

  1. 巴拉斯
  2. 尼基爾
  3. 朋友的確

所以,當我引用:

while((input.nextLine()) != null) 
{ 
System.out.println(input.nextLine()); 
} 

它會檢查是否Bharath == null或沒有,如果沒有,它只會打印Nikhil?並且後Nikhil,它將跳過下一行,因爲它需要輸入作爲轉義序列。

請糾正我!我可能混淆了兩種不同的方法。因此,初學者。

此外,請區分將input.nextLine()轉換爲String並作爲獨立代碼的區別。

回答

0

第二個片段中的問題不是存儲,而是您在每次迭代中調用nextLine()兩次的事實。首先,在while循環中調用它 - 該行被讀取,然後被忽略(即不保存在任何地方),但輸入流的內部光標前進到下一行。然後,在println行中,讀取另一行並將其返回到System.out.println,實際上所有奇數行都被忽略。

3

但是,當我不考慮在一個字符串中存儲「input.nextLine()」時,它開始跳過直線交替。是否,它甚至將鍵盤上的ENTER作爲輸入?

嗯不,它只是在你每次撥打input.nextLine()時閱讀下一行。這應該不會令人驚訝。忽略轉義序列等。爲了簡單起見,假定input.nextLine()只是從某個字符串列表中讀取......它有一個光標顯示它在列表中的位置。每次您撥打input.nextLine()時,它都會返回當前行並將光標向下移動。

如果您在每次迭代(曾經在while條件,一旦體內)調用input.nextLine()兩次,然後,如果你把它一次每次迭代(按你的原代碼,你會只執行一半多的迭代)。

+0

要增加更多,是否正確地說:它使用兩次:「一旦進入」而「一旦進入身體內部」就像兩個單獨的陳述?並不一樣。我的意思是,雖然是第一次,身體是第二次,再次是第三次,而第四次是身體再次? – 1ambharath

+0

@ 1ambharath:一旦進入*條件*並且一次進入*主體*。身體仍然在while語句中......這是while語句的主體*。 –

+0

好的。所以,當我用input.nextLine()初始化字符串時,我基本上是在同一個語句中傳遞同樣的語句。不同於前面的代碼,它會被執行兩次。因此,它工作得很好。對 ? – 1ambharath

1
input.nextLine() 

做了兩兩件事:

  1. 返回當前線路
  2. 推進光標執行當前行

Scanner.nextLine()

的價值

將此掃描儀推進到當前行,並返回跳過 的輸入。

所以,如果你不存儲input.nextLine()的結果,它將會丟失。

每次撥打input.nextLine()都會超過當前行,所以每次撥打電話時都會讀取不同的部分輸入。

相關問題