在 Java 中處理跨不同源的輸入資料時,我們有時會遇到必須透過將InputStream中的資料轉換為Stream<String>來處理資料的情況。
在本教程中,我們將瞭解實現此轉換的不同方法。
使用BufferedReader和lines()方法進行轉換
將InputStream轉換為Stream<String> 的一種有效方法是使用BufferedReader及其lines()方法。
首先,我們將定義一個包含文字行序列的位元組陣列bytes :
byte[] bytes = <font>"Hello\nWorld\nThis\nis\na\ntest".getBytes(StandardCharsets.UTF_8); |
在提供的程式碼塊中,我們建立一個名為bytes的位元組陣列來儲存所提供文字行的UTF-8編碼表示形式。然後,我們使用ByteArrayInputStream(bytes)從該位元組陣列建立一個名為inputStream 的輸入流。
此設定允許我們模擬包含指定文字的InputStream,該文字將在後續示例中用於轉換為Stream<String>。
現在,讓我們看看如何在測試場景中實現這種方法:
@Test |
在上面的示例中,我們使用InputStreamReader建立一個包裹在InputStream周圍的BufferedReader物件。這使我們能夠從InputStream中有效地讀取文字行。此外,BufferedReader的lines()方法返回一個包含從輸入讀取的行的Stream<String> 。最後,我們處理這個Stream ,使用reduce()操作將所有String元素連線成一個結果String,隨後我們使用斷言根據預期內容進行驗證。
請注意,我們利用try-with-resources來確保InputStreamReader和BufferedReader在try塊結束時自動關閉,從而釋放相關資源。
使用Scanner轉換
另一種方法涉及使用Scanner來標記InputStream。讓我們看一個簡單的實現:
@Test |
在此方法中,我們使用InputStream初始化Scanner物件,並將其配置為使用StandardCharsets.UTF_8進行 UTF-8 編碼。
然後,我們使用帶有正規表示式模式“ .+ ”的 findAll()方法來匹配一個或多個字元,有效地將InputStream的內容捕獲為一系列MatchResult。
然後,我們使用MatchResult::group將每個匹配結果對映到其匹配組,從而生成包含匹配字串的Stream<String> 。隨後,我們使用Collectors.joining()方法將Stream中的所有字串連線成一個名為result 的字串。