代码之家  ›  专栏  ›  技术社区  ›  RTF

如何将BufferedWriter转换为BufferedReader

  •  0
  • RTF  · 技术社区  · 11 年前

    我的理解是,这是一个常见的场景,但Java没有现成的解决方案,我已经断断续续地搜索了一天多。我已经尝试过Ostermiller库中的CircularCharBuffer,但它使用了某种不断等待新输入的读取器,因此我无法 readline() 检测内容的结尾(它会挂起)。

    那么,有人能告诉我如何进行转换吗?值得一提的是,我正在使用PDFBox库将多个(可能很多)PDF文件转换为原始文本。PDFBox API将内容放到 Writer ,之后我需要获取内容以进行进一步处理(因此 BufferedReader/Writer 实际上并不是必须的,而是某种 Reader/Writer ). 我知道使用 StringReader/Writer ,但我不确定这是否有效,加上我失去了 readline() 方法

    2 回复  |  直到 11 年前
        1
  •  2
  •   Stephen C    11 年前

    这有点像问如何把猪变成大象…:-)

    好的,有两种方法可以解决这个问题(使用Java库):

    • 您可以捕获写入缓冲写入器的数据,以便使用缓冲读取器读取数据。基本上,您可以通过以下方式实现:

      1. 使用BufferedWriter写入StringWriter或CharArrayWriter,

      2. 关闭它,

      3. 从SW/CAW中提取作为字符串的结果内容,以及

      4. 在StringReader中包装字符串,

      5. 将StringReader包装在BufferedReader中。

    • 您可以创建PipedReader/PipedWriter对,并分别用BufferedReader和BufferedWriter包装它们。

    这两种方法都有缺点:

    • 第一个要求您在构建读端之前完成写操作。这意味着需要空间来将整个流内容保存在内存中,并且不能并行地进行生产者端和消费者端处理。

    • 第二个要求您在单独的线程中生产和消费。。。或有永久性堵塞管道的风险。


    从概念上讲,Ostermiller库实际上是PipeReader/PipeWriter的重新实现。(他的重新实现的一些优点在Java 1.6中得到了讨论……它允许您指定管道的缓冲区大小。Mark支持很有趣,但我可以想象一些问题,这取决于您如何使用它。)

    您还可以找到PipedReader/PipedWriter替代品,该替代品使用灵活的缓冲区,可以根据需要增长和收缩。(至少……这在概念上是可能的。)

        2
  •  1
  •   RTF    11 年前

    这个 CircularCharBuffer 从Ostermiller库有两种方法 getWriter() getReader() 让读者了解作者的内容,反之亦然。《朗读者》在决赛中失利的原因 readLine() 是因为我没打电话 close() 在我写完之后,写了一篇关于作家的文章 readLine() 正在等待有关这位作家的新内容,而这些内容永远不会到来。

    可以找到Ostermiller库 here .