簡體   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