Math.random和FileReader

时间:2014-02-25 17:24:11

标签: java file random

我正在尝试制作一个从文件中随机获取一行的程序,我已经完成了我的代码,但是我得到了奇怪的结果,例如,如果我得到第0行,则表示“null”与第6行相同,7 ,8,9 ...但是当我得到5号时,我得到最后一行(粉红色),当我得到4号时,我得到第7行(布朗),第2行第3行(海军)等等。我的文件“archivo.txt”有10行,如下所示:

  • 红色
  • 海军
  • 石灰
  • 绿色
  • 橄榄
  • 棕色
  • 黄色
  • 粉红色

这是我的代码:

    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);
 }

3 个答案:

答案 0 :(得分:2)

您正尝试按顺序从缓冲区读取两次。

 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
}

答案 1 :(得分:1)

你在循环中调用readLine()两次,有效地使你跳过的行数加倍。

答案 2 :(得分:1)

我假设您只想读取第n行,跳过以前的行。然后你应该更新这段代码:

    br = new BufferedReader(fr);

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

    }

进入这个:

    br = new BufferedReader(fr);

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

null为0时,您收到numeroRandom,因为linea未更新。其他奇怪的结果发生是因为你在每个循环中读了2行。有一个点getLine()只会因没有更多的行而返回null。