[英]Convert Java Socket, BufferedReader, BufferedWriter to C#?
[英]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库):
您可以捕获写入缓冲写入器的数据,以便随后可以使用缓冲读取器读取数据。 基本上,您可以通过以下方式进行操作:
使用您的BufferedWriter写入StringWriter或CharArrayWriter,
关闭它,
从SW / CAW中提取生成的东西作为字符串,并且
将String包裹在StringReader中,
将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.