Android / Java - Random Read行不变

时间:2011-01-26 01:48:42

标签: java android file-io

我的文本文件包含已知行数(文件的第一行是行数)。我想从文件中随机读取一行 - 为此我使用LineNumberReader。问题是,它不会生成新的字符串 - 随机数会改变,但是从LineNumberReader获得的字符串不会。

标题暗示这是一款Android应用。 textbox是输出区域,testbox用于调试(在此代码中显示随机数 - 以检查它是否已更改)并且rRandom

此示例代码是应用中唯一按钮的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 {}

我做错了什么?我尝试过关闭并重置brrdr,似乎无法让它发挥作用。

3 个答案:

答案 0 :(得分:3)

行号不会影响返回的内容,只会影响将为其报告的行号。

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

如果或者什么时候对您来说效率太低,那么您可以开始考虑将数据预先加载到某种类型的内存结构中。

答案 1 :(得分:2)

来自LineNumberReader的Javadoc:

  

但请注意,setLineNumber(int)实际上并不会更改流中的当前位置;它只会更改getLineNumber()返回的值。

此课程不会为您提供您想要的功能。听起来你需要自己处理 - 将文件内容读入某种结构(可能是行号内容的Map<Integer, String>行)并自行解析。

答案 2 :(得分:0)

读取文件中的行数。选择一个不大于此值的随机数n。阅读并放弃n-1行。返回您阅读的下一行。