Java 中將 InputStream 轉換為 Stream

banq發表於2024-05-13

在 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);
InputStream inputStream = new ByteArrayInputStream(bytes);

在提供的程式碼塊中,我們建立一個名為bytes的位元組陣列來儲存所提供文字行的UTF-8編碼表示形式。然後,我們使用ByteArrayInputStream(bytes)從該位元組陣列建立一個名為inputStream 的輸入流。

此設定允許我們模擬包含指定文字的InputStream,該文字將在後續示例中用於轉換為Stream<String>。

現在,讓我們看看如何在測試場景中實現這種方法:

@Test
void givenInputStream_whenConvertingWithBufferedReader_thenConvertInputStreamToStringStream() throws IOException {
    try (InputStreamReader isr = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
      BufferedReader reader = new BufferedReader(isr)) {
        Stream<String> stringStream = reader.lines();
        String result = stringStream.reduce(<font>"", (s1, s2) -> s1 + s2);
        assertEquals(
"HelloWorldThisisatest", result);
    }
}

在上面的示例中,我們使用InputStreamReader建立一個包裹在InputStream周圍的BufferedReader物件。這使我們能夠從InputStream中有效地讀取文字行。此外,BufferedReader的lines()方法返回一個包含從輸入讀取的行的Stream<String> 。最後,我們處理這個Stream ,使用reduce()操作將所有String元素連線成一個結果String,隨後我們使用斷言根據預期內容進行驗證。

請注意,我們利用try-with-resources來確保InputStreamReader和BufferedReader在try塊結束時自動關閉,從而釋放相關資源。

使用Scanner轉換
另一種方法涉及使用Scanner來標記InputStream。讓我們看一個簡單的實現:

@Test
void givenInputStream_whenConvertingWithScannerFindAll_thenConvertInputStreamToStringStream() {
    try (Scanner scanner = new Scanner(inputStream, StandardCharsets.UTF_8)) {
        Stream<String> stringStream = scanner.findAll(<font>".+")
          .map(MatchResult::group);
        String result = stringStream.collect(Collectors.joining());
        assertEquals(
"HelloWorldThisisatest", result);
    }
}

在此方法中,我們使用InputStream初始化Scanner物件,並將其配置為使用StandardCharsets.UTF_8進行 UTF-8 編碼。

然後,我們使用帶有正規表示式模式“ .+ ”的 findAll()方法來匹配一個或多個字元,有效地將InputStream的內容捕獲為一系列MatchResult。

然後,我們使用MatchResult::group將每個匹配結果對映到其匹配組,從而生成包含匹配字串的Stream<String> 。隨後,我們使用Collectors.joining()方法將Stream中的所有字串連線成一個名為result 的字串。

 

相關文章