Java-随机行读取

Java-随机行读取,java,android,file-io,Java,Android,File Io,我正在编写一个Android应用程序,希望我的程序能够随机读取一行文件。我该怎么做呢?你想要的是一份工作 您可以使用方法setLineNumber()移动到文件中的随机位置 LineNumberReader rdr; int numLines; Random r = new Random(); rdr.setLineNumber(r.nextInt(numLines)); String theLine = rdr.readLine(); 要做到这一点,您需要固定长度的行(在这种情况下,实现细节

我正在编写一个Android应用程序,希望我的程序能够随机读取一行文件。我该怎么做呢?

你想要的是一份工作

您可以使用方法
setLineNumber()
移动到文件中的随机位置

LineNumberReader rdr;
int numLines;
Random r = new Random();
rdr.setLineNumber(r.nextInt(numLines));
String theLine = rdr.readLine();

要做到这一点,您需要固定长度的行(在这种情况下,实现细节应该很明显)或关于有多少行以及(可选地,为了更好的性能)它们在文件中开始的偏移量的信息(排序索引)

对于小文件,您可以在需要随机行时按需创建这样的索引。为了有效地处理大型文件,您需要保持索引的持久性,可能是在一个单独的文件中


如果行的长度大致相同,并且不需要完全的“随机性”,那么还可以在文件中选择一个随机字节偏移量,并扫描最近的换行符。

要获得随机数,可以使用util包中java的
random

Random rnd = new Random();
int nextRandomLineNumber = rnd.nextInt();
参见一个老式的答案: 如果返回null,只需调用该方法

BufferedReader br = new BufferedReader(file);
Random rng = new Random (8732467834324L);
String s = br.readLine();
for ( ; s != null ; s = br.readLine())
    if (rng.nextDouble() < 0.2)
        break;
br.close();
return s;
BufferedReader br=新的BufferedReader(文件);
随机rng=新随机(8732467834324L);
字符串s=br.readLine();
对于(;s!=null;s=br.readLine())
如果(rng.nextDouble()<0.2)
打破
br.close();
返回s;

+1。这是一个比我要给出的更好的答案。我不知道班级的存在。@McStretch,谢谢。该类对于此类操作非常有用。(但通常有更好的类使用)这肯定是有效的,但是你必须记住每一行读意味着读取文件的开头和那行之间的所有线。@ McStretch:你可能想首先考虑这个问题:“哪里和怎样计算数字?”这个代码应该是你所需要的。只要适当地设置numLines变量,有没有什么好方法可以询问文件有多少行?这实际上是我的计划。你能给我更多的信息,为什么这些线必须是固定长度的吗?我只需要一个
.txt
文件(或者.bin什么的)。@Walter:如果行的长度固定为N字节(注意编码问题!),并且文件的大小为S,然后是S/N行,行号X从字节偏移量X*N开始。在文件中跳转到给定的字节偏移量既简单又有效。@Michael:这是有道理的-尽管这似乎比它值得做的工作要多,如果您只是在启动时运行了一个函数(或者文件中的第一行包含行数)我看到的唯一问题是:没有为
Random()
设置边界。您可以使用另一个nextInt()方法nextInt(int n)设置边界:“返回一个伪随机的、均匀分布的int值,介于0(包括)和指定值(排除)之间,从这个随机数生成器的序列中提取。”是,我只是想给他看一个类,比如nextInt(intx),他会得到一个介于0和x之间的int。在我完成我的帖子时,第一个答案已经被更正(首先只有关于setLineNumber的评论,没有thr random object)