我的文本文件包含已知行数(文件的第一行是行数)。我想从文件中随机读取一行 - 为此我使用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
,似乎无法让它发挥作用。
答案 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
行。返回您阅读的下一行。