Java InputStream 與 InputStreamReader
1. 概述
在本文中,我們將討論InputStream
類別以及它如何處理來自各種來源的二進位資訊。我們也將討論[InputStreamReader](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/io/InputStreamReader.html)
類別及其與InputStream
相比的差異。
2.什麼是InputStream
InputStream is a class that
。因為它是一個抽象類,所以我們只能透過它的子類別FileInputStream
和ByteArrayInputStream,
來實例化它。
3.什麼是InputStreamReader
與InputStream
類別相比, InputStreamReader
直接處理字元或文字。它使用給定的InputStream
讀取字節,然後根據特定的**Charset**
將它們轉換為字元。我們可以明確設定Charset
,其中一些是 UTF-8、UTF-16 等,或依賴 JVM 的預設字元集:
@Test
public void givenAStringWrittenToAFile_whenReadByInputStreamReader_thenShouldMatchWhenRead(@TempDir Path tempDir) throws IOException {
String sampleTxt = "Good day. This is just a test. Good bye.";
Path sampleOut = tempDir.resolve("sample-out.txt");
List<String> lines = Arrays.asList(sampleTxt);
Files.write(sampleOut, lines);
String absolutePath = String.valueOf(sampleOut.toAbsolutePath());
try (InputStreamReader reader = new InputStreamReader(new FileInputStream(absolutePath), StandardCharsets.UTF_8)) {
boolean isMatched = false;
int b;
StringBuilder sb = new StringBuilder();
while ((b = reader.read()) != -1) {
sb.append((char) b);
if (sb.toString().contains(sampleTxt)) {
isMatched = true;
break;
}
}
assertThat(isMatched).isTrue();
}
}
上面的程式碼片段示範如何使用StandardCharsets.UTF_8
常數來明確設定InputStreamReader
的編碼。
我們的FileInputStream
是一種InputStream
,由一個InputStreamReader
包裝。因此,我們可以看到InputStreamReader
將InputStream
解釋為文字而不是原始位元組資訊。
InputStreamReader
與InputStream
InputStreamReader
是位元組流到字元流的橋樑。此類別採用InputStream
實例,讀取字節,並使用字元編碼將它們解碼為字元。它有一個讀取單一字元的read()
方法。此方法透過讀取底層InputStream
中目前位置前面的一個或多個位元組來將位元組轉換為字元。當到達流的末尾時,它返回-1。
相反, InputStream
是表示位元組輸入流的所有類別的超類別。此類別是InputStreamReader
的主要建構子參數,這表示InputStream
的任何子類別都是InputStreamReader
的有效位元組來源。
InputStream
類別也有一個讀取單一位元組的read()
方法。但是, InputStream.read()
方法不會將位元組解碼為字符,而InputStreamReader.read()
則可以。
5. 結論
在本文中,我們討論了InputStream
和InputStreamReader
。 InputStream
是一個抽象類,具有各種子類,這些子類傾向於特定形式的二進位數據,例如FileInputStream
和ByteArrayInputStream,
。相反, InputStreamReader
從InputStream
中讀取位元組並將其轉換為指定編碼的字元。
這兩個類別之間的區別很簡單。當我們需要處理二進位資料時,我們應該使用InputStream
。如果我們需要使用字元流,我們可能會受益於使用InputStreamReader
。
InputStream
是建立InputStreamReader
所需的主要建構子參數。
本文中使用的所有程式碼範例都可以在 GitHub 上取得。