成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Inputstream 轉換 String,你會了嗎?

開發 前端
我們將從使用普通的 Java 開始,包括 Java 8+ 的解決方案,然后也會研究使用 Guava 和 Apache Commons IO 庫。

大家好,我是指北君。

在本教程中,我們將講講如何將一個 InputStream 轉換為一個字符串。

我們將從使用普通的 Java 開始,包括 Java 8+ 的解決方案,然后也會研究使用 Guava 和 Apache Commons IO 庫。

用 Java 進行轉換 - StringBuilder

讓我們看看一個簡單的、低級別的方法,使用普通的 Java,一個 InputStream 和一個簡單的 StringBuilder。

@Test
public void convertingAnInputStreamToAString() throws IOException {
String originalString = randomString(8);
InputStream inputStream = new ByteArrayInputStream(originalString.getBytes());

StringBuilder textBuilder = new StringBuilder();
try (Reader reader = new BufferedReader(new InputStreamReader
(inputStream, Charset.forName(StandardCharsets.UTF_8.name())))) {
int c = 0;
while ((c = reader.read()) != -1) {
textBuilder.append((char) c);
}
}
assertEquals(textBuilder.toString(), originalString);
}

用 Java 8 進行轉換 -- BufferedReader

Java 8 給 BufferedReader 帶來了一個新的 lines() 方法。讓我們看看如何利用它將一個 InputStream 轉換為一個字符串。

@Test
public void convertingAnInputStreamToAString() {
String originalString = randomString(8);
InputStream inputStream = new ByteArrayInputStream(originalString.getBytes());

String text = new BufferedReader(
new InputStreamReader(inputStream, StandardCharsets.UTF_8))
.lines()
.collect(Collectors.joining("\n"));

assertThat(text, equalTo(originalString));
}

值得一提的是,lines() 使用的是 readLine() 方法。readLine() 假定一行是由換行("\n")、回車("\r")或回車后立即換行中的任何一種結束符。換句話說,它支持所有常見的行結束方式。

另一方面,當我們使用 Collectors.join() 時,我們需要明確決定我們要為創建的 String 使用哪種類型的結束符。

我們也可以使用 Collectors.join(System.lineSeparator()) ,在這種情況下,輸出結果取決于系統設置。

用 Java 9+ 進行轉換 - InputStream.readAllBytes()

如果我們在 Java 9 或以上版本,我們可以利用一個新的 readAllBytes 方法添加到 InputStream 中。

@Test
public void convertingAnInputStreamToAString() throws IOException {
String originalString = randomString(8);
InputStream inputStream = new ByteArrayInputStream(originalString.getBytes());

String text = new String(inputStream.readAllBytes(), StandardCharsets.UTF_8);

assertThat(text, equalTo(originalString));
}

我們需要注意的是,這段簡單的代碼是為那些方便將所有字節讀入字節數組的簡單情況準備的。我們不應該用它來讀取有大量數據的輸入流。

用 Java Scanner 進行轉換

接下來,讓我們看看一個使用標準文本掃描器的普通Java例子。

@Test
public void convertingAnInputStreamToAString() throws IOException {
String originalString = randomString(8);
InputStream inputStream = new ByteArrayInputStream(originalString.getBytes());

String text = null;
try (Scanner scanner = new Scanner(inputStream, StandardCharsets.UTF_8.name())) {
text = scanner.useDelimiter("\\A").next();
}

assertThat(text, equalTo(originalString));
}

請注意,InputStream 將被關閉的 Scanner 關閉。

同樣值得澄清的是 useDelimiter("\A") 的作用。這里我們傳遞了'\A',它是一個邊界標記重碼,表示輸入的開始。本質上,這意味著 next() 調用讀取了整個輸入流。

使用 ByteArrayOutputStream 進行轉換

最后,讓我們看看另一個普通的Java例子,這次是使用 ByteArrayOutputStream 類。

@Test
public void convertingAnInputStreamToString() throws IOException {
String originalString = randomString(8);
InputStream inputStream = new ByteArrayInputStream(originalString.getBytes());

ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int nRead;
byte[] data = new byte[1024];
while ((nRead = inputStream.read(data, 0, data.length)) != -1) {
buffer.write(data, 0, nRead);
}

buffer.flush();
byte[] byteArray = buffer.toByteArray();

String text = new String(byteArray, StandardCharsets.UTF_8);
assertThat(text, equalTo(originalString));
}

在這個例子中,InputStream 通過讀寫字節塊被轉換為 ByteArrayOutputStream。然后 OutputStream 被轉換為一個字節數組,用來創建一個字符串。

用java.nio進行轉換

另一個解決方案是將 InputStream 的內容復制到一個文件中,然后將其轉換為一個字符串。

@Test
public void convertingAnInputStreamToAString() throws IOException {
String originalString = randomString(8);
InputStream inputStream = new ByteArrayInputStream(originalString.getBytes());

Path tempFile =
Files.createTempDirectory("").resolve(UUID.randomUUID().toString() + ".tmp");
Files.copy(inputStream, tempFile, StandardCopyOption.REPLACE_EXISTING);
String result = new String(Files.readAllBytes(tempFile));

assertThat(result, equalTo(originalString));
}

這里我們使用 java.nio.file.Files 類來創建一個臨時文件,同時將 InputStream 的內容復制到文件中。然后用同一個類用 readAllBytes() 方法將文件內容轉換為一個字符串。

用Guava進行轉換

讓我們從一個利用 ByteSource 功能的 Guava 例子開始。

@Test
public void convertingAnInputStreamToAString()
throws IOException {
String originalString = randomString(8);
InputStream inputStream = new ByteArrayInputStream(originalString.getBytes());

ByteSource byteSource = new ByteSource() {
@Override
public InputStream openStream() throws IOException {
return inputStream;
}
};

String text = byteSource.asCharSource(Charsets.UTF_8).read();

assertThat(text, equalTo(originalString));
}

讓我們來看看這些步驟:

首先,我們把我們的 InputStream 包裝成一個 ByteSource.

其次,我們把 ByteSource 看作是一個具有 UTF8 字符集的 CharSource。

最后,我們使用 CharSource 將其作為一個字符串來讀取。

一個更簡單的轉換方法是使用 Guava,但需要明確地關閉流, 我們可以簡單地使用 try-with-resources 語法來處理這個問題。

@Test
public void convertingAnInputStreamToAString() throws IOException {
String originalString = randomString(8);
InputStream inputStream = new ByteArrayInputStream(originalString.getBytes());

String text = null;
try (Reader reader = new InputStreamReader(inputStream)) {
text = CharStreams.toString(reader);
}

assertThat(text, equalTo(originalString));
}

用 Apache Commons IO 進行轉換

現在讓我們來看看如何用 Commons IO 庫來做這個。

一個重要的注意事項是,與 Guava 不同的是,這些例子都不會關閉 InputStream。

@Test
public void convertingAnInputStreamToAString() throws IOException {
String originalString = randomString(8);
InputStream inputStream = new ByteArrayInputStream(originalString.getBytes());

String text = IOUtils.toString(inputStream, StandardCharsets.UTF_8.name());
assertThat(text, equalTo(originalString));
}

我們也可以用一個StringWriter來做轉換。

ream 轉換為一個字符串。我們從使用普通 Java 開始,然后探索了如何使用 Guava 和 Apache Commons IO 庫。

@Test
public void convertingAnInputStreamToAString() throws IOException {
String originalString = randomString(8);
InputStream inputStream = new ByteArrayInputStream(originalString.getBytes());

StringWriter writer = new StringWriter();
String encoding = StandardCharsets.UTF_8.name();
IOUtils.copy(inputStream, writer, encoding);

assertThat(writer.toString(), equalTo(originalString));
}
責任編輯:武曉燕 來源: Java技術指北
相關推薦

2024-01-19 08:25:38

死鎖Java通信

2024-02-04 00:00:00

Effect數據組件

2023-07-26 13:11:21

ChatGPT平臺工具

2023-01-10 08:43:15

定義DDD架構

2024-01-02 12:05:26

Java并發編程

2023-08-01 12:51:18

WebGPT機器學習模型

2023-10-10 11:04:11

Rust難點內存

2024-05-06 00:00:00

InnoDBView隔離

2023-01-30 09:01:54

圖表指南圖形化

2024-07-31 08:39:45

Git命令暫存區

2022-05-06 08:26:32

JavaSPI機制

2022-05-13 08:17:05

HTTPRESTful架構

2023-12-12 08:02:10

2022-07-08 09:27:48

CSSIFC模型

2021-10-31 20:07:49

Windows驅動開發

2024-08-06 09:47:57

2024-03-06 08:28:16

設計模式Java

2022-06-16 07:50:35

數據結構鏈表

2022-12-06 07:53:33

MySQL索引B+樹

2022-09-26 11:03:25

Java反射漏洞
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区免费视频 | 国内精品久久久久久影视8 最新黄色在线观看 | 日韩一区二区福利视频 | 午夜视频在线观看网址 | 国产精品高潮呻吟 | 国产资源在线播放 | 男女羞羞视频在线 | 精品欧美黑人一区二区三区 | 午夜影院视频 | 欧美一级www片免费观看 | 久久男女视频 | 亚洲 欧美 在线 一区 | 久久国产综合 | 欧美激情精品久久久久 | 国产午夜亚洲精品不卡 | 色综合久久天天综合网 | 亚洲第一成人av | 色婷婷综合久久久中文字幕 | 国产成人精品一区二区三区视频 | 一级在线毛片 | 久久国产精品-国产精品 | 国产精品久久久久久久久图文区 | 性一交一乱一伦视频免费观看 | 伊人精品在线 | 亚洲精品久久久久久宅男 | 国产精品99久久久久久久久久久久 | av中文字幕在线 | 成人免费一区二区三区视频网站 | 一区二区精品 | 成人免费在线 | 欧美日韩国产精品一区 | 久久天天躁狠狠躁夜夜躁2014 | 久久久久久国产精品mv | 99精品视频在线观看 | 国产蜜臀97一区二区三区 | 国产精品成av人在线视午夜片 | 中文字幕精品视频 | 九色 在线 | 国产激情视频在线观看 | 天天拍天天操 | 国产成人精品免费视频 |