Android / Java - 随机读取行不变

我的文本文件包含已知行数(文件的第一行是行数)。我想从文件中随机读取一行 - 为此我使用
LineNumberReader
。问题是,它不会生成一个新的字符串 - 随机数会改变,但它从
LineNumberReader
获得的字符串不会。 正如标题暗示这是一个Android应用程序。
textbox
是输出区域,
testbox
用于调试(在此代码中显示随机数 - 检查它是否已更改)和
r
Random
此示例代码是应用程序中唯一按钮的
onClick
           String fileName = "\sdcard\Q's.txt";
   try {
       BufferedReader br = new BufferedReader(
               new InputStreamReader(
                       new DataInputStream(
                               new FileInputStream(fileName))));

       // Get the number of lines in the text file
       numLines = Integer.parseInt(br.readLine().toString().trim());

       // get a random number and write it to the test text box
       int rnd = r.nextInt(numLines);
       String tmp = Integer.toString(rnd);
       testBox.setText(tmp);

       // get random number - go to line - save in String "text"
       LineNumberReader rdr = new LineNumberReader(br);
       rdr.setLineNumber(r.nextInt(numLines));
       textBox.setText(rdr.readLine());

    } catch (FileNotFoundException e) {
        textBox.setText("FileNotFound");
        e.printStackTrace();
    } catch (IOException e) {
        textBox.setText("IOException");
        e.printStackTrace();
    } catch (NumberFormatException nfe){
        textBox.setText("Number Formated Wrong");
    } finally {}
我究竟做错了什么?我试过关闭并重新设置
br
rdr
并且似乎无法让它工作。     
已邀请:
行号不会影响返回的行,只会影响为其报告的行号。
LineNumberReader
的重点不在于自动寻找特定的线,而是在不必担心的情况下跟踪当前的线号。 换句话说,你只需打开阅读器并开始阅读。当您找到感兴趣的线路时,您可以拨打
getLineNumber()
以查找它是什么线路。 为此,
setLineNumber()
只是更改当前行的报告行号。它不会将文件指针移动到文件中的该行。 要获得特定的线
rnd
,最简单的解决方案就是在循环中读取
rnd
线。最后一个读取是你想要的。在伪代码中:
open bufferedreader br
get limit from first line of br
set rnd to number from 1 to limit
while limit > 0:
    set line to next line of br
    decrement limit
use line
如果或者什么时候对您来说效率太低,那么您可以开始考虑将数据预加载到某种类型的内存结构中。     
从Javadoc for LineNumberReader:   但请注意,setLineNumber(int)实际上并不会更改流中的当前位置。它只会更改getLineNumber()返回的值。 此类不会为您提供所需的功能。听起来你需要自己处理这个问题 - 将文件内容读入某种结构(可能是行号内容的
Map<Integer, String>
)并自行解析。     
读取文件中的行数。选择一个不大于此的随机数
n
。读取并丢弃
n-1
行。返回您阅读的下一行。     

要回复问题请先登录注册