【问题标题】:How can i reset the position of the BufferedReader?如何重置 BufferedReader 的位置?
【发布时间】:2012-06-03 12:00:17
【问题描述】:

iam 使用 BufferedReader 从文件中读取行。当我从文件中读取所有行时,我想从头开始重新读取文件,我该怎么做? BufferedReader.mark()BufferedReader.reset() 无法正常工作。这是我的代码

FileReader fR = new FileReader(this.sTargetPath);
            final BufferedReader vcfBuffer = new BufferedReader(fR);
        //  vcfBuffer.mark(0);
                Boolean nextLine = true;
                while (nextLine) {
                    try {
                        String line = vcfBuffer.readLine();
                        }
                    } catch (IOException e) {
                        nextLine = false;
                    }
                }
            }

            vcfBuffer.reset();

如何重置 BufferedREader 位置?感谢您的帮助

【问题讨论】:

  • 再次创建一个新的缓冲读取器对象。或者使用RandomAccesFileseek(0)方法。
  • 除了创建另一个阅读器之外别无他法?我不认为这是个好主意,它有效但效率不高,对吧?
  • 我认为您可以在阅读第一行之前创建一个标记,然后您可以稍后使用 reset() 方法返回该点,不过我之前没有尝试过。
  • 如果您读取的内容超出内部缓冲区的容量,则 BufferedReader 的“标记”无效。将文件的内容读取并存储为 char[] 数组并使用 CharArrayReader 而不是 FileReader 作为 BufferedReader 的输入 - 或增加缓冲区的大小。
  • 使用 BufferedReader 总是很快,但占用的内存很少。只要它有效,它就可以。我不知道如何设置启动 InputStream。

标签: java android bufferedreader


【解决方案1】:

javadoc of mark() 说:(强调我的):

参数:

readAheadLimit - 限制在保留标记的同时可以读取的字符数。尝试重置流 读取超过此限制或超过此限制的字符后可能会失败。 限制 大于输入缓冲区大小的值将导致新的缓冲区 要分配的大小不小于限制。因此大 值应谨慎使用。

如果您使用 0 作为参数调用它,只要您从阅读器读取一个字节,就可能无法重置。

解决方法是调用mark方法,以文件长度为参数。但当然,这将导致读取内存缓冲区中的整个文件。如果您不想这样,请关闭您的阅读器并重新打开一个新的 BufferedReader。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多