1

我有一种方法让我的应用程序从文本文件中读取随机行并将其返回。我使用 randTxt() 从 txt 文件中读取并返回随机行。但它每次只显示同一行(第一行)。

public String randTxt(){

  // Read in the file into a list of strings
  InputStreamReader inputStream = new InputStreamReader(getResources().openRawResource(R.raw.randomstuff));
  //ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

  String theLine="";
  int i;
  try {
    i = inputStream.read();
    while (i != -1) {
      i = inputStream.read();
    }
  } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
  }

  LineNumberReader  rdr = new LineNumberReader(inputStream);
  int numLines = 30;
  Random r = new Random();
  rdr.setLineNumber(r.nextInt(numLines));

  try {
    theLine = rdr.readLine();
  } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
  }

  return theLine;
}

我该如何解决?有人可以解释我的代码有什么问题吗?

4

5 回答 5

3

这是使用 BufferedReader 完成所需工作的框架。在这种情况下,您不需要将值存储在临时数组中。

InputStreamReader inputStream = new InputStreamReader
  (getResources().openRawResource(R.raw.randomstuff));
BufferedReader br = new BufferedReader(inputStream);
int numLines = 30;
Random r = new Random();
int desiredLine = r.nextInt(numLines);

String theLine="";
int lineCtr = 0;
while ((theLine = br.readLine()) != null)   {
  if (lineCtr == desiredLine) {
    break;
  }
  lineCtr++;
 }
...
Log.d(TAG, "Magic line is: " +theLine);
于 2012-01-02T20:44:16.517 回答
3

您已经得到了如何修复代码的答案,但没有解释为什么我们的原始代码不起作用。

LineNumberReader.setLineNumber(int) 不会转到实际行,它只是更改您调用当前行的数字。

因此,假设您阅读了两行,getLineNumber()现在将返回 2(它从 0 开始,每次遇到换行时增加 1)。如果您现在setLineNumber(10)getLineNumber()将返回 10。读取另一行(您的第三行)将导致getLineNumber()返回 11。

这在Java Doc中有描述。

于 2012-01-02T22:11:47.900 回答
2

inputStream.read 不返回行号。它返回读取的字节。这不是您逐行阅读的方式。要逐行读取,您应该使用缓冲读取器的 readLine 方法。那时可能更容易将其全部读入本地数组并使用该数组随机获取一个条目,而不是使用行号阅读器。

于 2012-01-02T20:03:47.893 回答
0

我认为 Random() 函数返回一个介于 0 和 1 之间的值。因此,您可能必须将其乘以 100 才能得到一个整数值。甚至可以考虑一个MOD“你的上限”操作来保证你最终得到的索引在0和你的上限之间

在您的 setLineNumber() 方法中使用您计算的索引。

编辑:正如约翰所说,我们可以使用 Random() 对象获得整数。

于 2012-01-02T20:02:47.317 回答
0
public String getRandomLine(String fileLoc) throws IOException
{
    BufferedReader reader = new BufferedReader(new FileReader(fileLoc));
    ArrayList<String> lines = new ArrayList<String>();

    String line =null;
    while( (line = reader.readLine())!= null ) 
        lines.add(line);

    // Choose a random one from the list
    return lines.get(new Random().nextInt(lines.size()));
}
public String getRandomLineOpt(String fileLoc)throws IOException
{
    File f=new File(fileLoc);
    RandomAccessFile rcf=new RandomAccessFile(f, "r");
    long rand = (long)(new Random().nextDouble()*f.length());
    rcf.seek(rand);
    rcf.readLine();
    return rcf.readLine();
}
于 2013-02-13T15:19:09.907 回答