InputStreamReader并从.txt文件中读取随机行

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

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; } 

我该如何解决? 并且有人能解释我的代码中有什么问题吗?

这是使用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); 

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

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

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

这在Java Doc中有所描述。

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

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

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

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

 public String getRandomLine(String fileLoc) throws IOException { BufferedReader reader = new BufferedReader(new FileReader(fileLoc)); ArrayList lines = new ArrayList(); 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(); }