繁体   English   中英

如何将BufferedWriter转换为BufferedReader

[英]How to convert a BufferedWriter to a BufferedReader

我的理解是,这是一种常见的情况,但是Java尚没有内置的解决方案,而且我已经不停地搜索了一天以上。 我从Ostermiller库尝试了CircularCharBuffer,但是它使用某种读取器,该读取器不断等待新输入,因此我无法通过readline()来检测内容的结尾(它将挂起)。

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

这有点像问如何将猪变成大象... :-)

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

  • 您可以捕获写入缓冲写入器的数据,以便随后可以使用缓冲读取器读取数据。 基本上,您可以通过以下方式进行操作:

    1. 使用您的BufferedWriter写入StringWriter或CharArrayWriter,

    2. 关闭它,

    3. 从SW / CAW中提取生成的东西作为字符串,并且

    4. 将String包裹在StringReader中,

    5. 将StringReader包装在BufferedReader中。

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

两种方法都有缺点:

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

  • 第二个要求您在单独的线程中进行生产和使用...否则可能使管道永久阻塞。


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

您也许还可以找到使用灵活缓冲区的PipedReader / PipedWriter替换项,该缓冲区可以根据需要增长和收缩。 (至少...从概念上讲这是可能的。)

Ostermiller库中的CircularCharBuffer具有两个方法getWriter()getReader()来使读者了解作者的内容,反之亦然。 Reader挂在最后的readLine()上的原因是因为我写完后没有在writer上调用close() 因此,最终的readLine()正在等待写入器上永远不会到达的新内容。

奥斯特米勒图书馆可在此处找到。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM