2014-02-25 37 views
0

我試圖做一個程序,從文件中隨機獲取一行,我已經完成了我的代碼,但我得到了奇怪的結果,例如,如果我得到行0它說「空」相同第6,第7,第8,第9 ......但當我得到第5號時,我得到最後一行(粉紅色),當我得到第4號時,我得到第7行(布朗),第2行第3行(海軍)等等。我的文件 「archivo.txt」 有10行是這樣的:Math.random和FileReader

  • 橙色
  • 海軍
  • 石灰
  • 綠色
  • 橄欖
  • 布朗
  • 黃色
  • 粉紅

這是我的代碼:

public static String getLinea(){ 
    File archivo = null; 
    FileReader fr = null; 
    BufferedReader br = null; 
    String linea = null; 
    int numeroRandom = (int)(Math.random() * 10); 
    System.out.println(numeroRandom); 
    try{ 
     archivo = new File("C:\\archivo.txt"); 
     fr = new FileReader (archivo); 
     br = new BufferedReader(fr); 

     for(int i = 0; i < numeroRandom; i++){ 
      br.readLine(); 
      linea = br.readLine(); 

     } 
    } 
    catch(Exception e){ 
     e.printStackTrace();  
    }finally{ 
     try{ 
      if(null != fr){ 
       fr.close(); 
      } 
     }catch(Exception e2){ 
      e2.printStackTrace(); 
     } 
    } 
    return linea; 

} 
public static void main(String[] args){ 
    String linea; 
    linea = getLinea(); 
    System.out.println(linea); 
} 

回答

2

你正試圖從緩衝區兩次READLINE順序。

for(int i = 0; i < numeroRandom; i++){ 
     br.readLine(); 
     linea = br.readLine(); 

    } 

改爲只讀一次。正確的方法:

for(int i = 0; i < numeroRandom; i++){ 
     linea = br.readLine(); 

    } 

您也應該檢查是否有BufferedReader中從緩存的讀取讀者離開之前任何更多的數據。這可以按如下方式完成:

while(((linea = br.readLine()) != null) && i < numeroRandom) 
{ 
    // do something 
} 
+0

嗯,我複製粘貼的代碼,我沒有意識到這一點,謝謝! –

+0

@ user3313820很高興爲您效勞。您可以將答案標記爲已接受並關閉該問題是否有效 – Kakarot

1

您在循環中調用readLine()兩次,實際上使您跳過的行數加倍。

1

我想你只想讀取第n行,跳過以前的行。

br = new BufferedReader(fr); 

    for(int i = 0; i < numeroRandom; i++){ 
     br.readLine(); 
    } 
    linea = br.readLine(); // move this line 

你都拿到nullnumeroRandom是0,因爲linea沒有被更新:那麼你應該更新這段代碼:

br = new BufferedReader(fr); 

    for(int i = 0; i < numeroRandom; i++){ 
     br.readLine(); 
     linea = br.readLine(); 

    } 

進入這個。其他奇怪的結果發生,因爲你在每個週期閱讀2行。將有一個點,getLine()將簡單地返回null從沒有更多的行讀取。