![](/img/trans.png)
[英]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.