【问题标题】:Java make a copy of a readerJava 复制阅读器
【发布时间】:2009-11-18 21:28:53
【问题描述】:

我有一个 BufferedReader 循环文件。当我遇到特定情况时,我想使用不同的阅读器实例继续循环,但从此时开始。

对推荐的解决方案有任何想法吗?创建单独的阅读器,使用标记功能等?

【问题讨论】:

    标签: java streamreader datareader


    【解决方案1】:

    在等待您对我的评论的答复时,我一直在做假设。

    如果它是您重视的逐行输入,您可能会像我一样惊喜地发现RandomAccessFile 现在(从 1.4 或 1.5 开始)支持readLine 方法。当然,RandomAccessFile 可以让您对位置进行细粒度控制。

    如果您想要缓冲 IO,您可以考虑将阅读器包裹在 CharacterBuffer 周围,或者将 ByteBuffer 包裹在使用 nio API 映射的文件周围。这使您能够将文件视为内存,并对读取指针进行精细控制。而且因为数据都在内存中,所以缓冲是免费的。

    【讨论】:

    • 是的,就是这样,RandomAccessFile :)
    【解决方案2】:

    你看过BufferedReadermark方法吗?与reset结合使用,可能会满足您的需求。

    【讨论】:

    • 标记很难使用,因为我不知道传入缓冲区的大小(或者我通过缓冲区的距离)
    • 为什么要使用 BufferedReader?是为了性能还是为了使用readLine()方法?
    • (相对于普通的 FileReader,我的意思是)
    【解决方案3】:

    如果您跟踪到目前为止已阅读的字符数,您可以创建一个新的 BufferedReader 并使用skip

    正如 Noel 所指出的,您需要避免使用 BufferedReader.readLine(),因为 readLine() 会丢弃换行符并使您的字符计数不准确。如果其他人必须维护您的代码,您可能不应该指望 readLine() 永远不会被调用。

    如果你决定使用skip,你应该编写自己的缓冲阅读器,它会给你一个偏移量来计算换行符。

    【讨论】:

    • 如果避免使用 BufferedReader.readLine() 则可行,这会丢弃换行数据,或者换行使用标准化。
    猜你喜欢
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 2020-11-17
    • 2013-12-09
    • 2010-09-09
    • 2021-01-16
    • 2014-07-11
    相关资源
    最近更新 更多