編程基礎(chǔ)學(xué)習(xí):Java輸入流轉(zhuǎn)字符串

編程基礎(chǔ)學(xué)習(xí):Java輸入流轉(zhuǎn)字符串

長沙一度軟件培訓(xùn)      2022-04-21 05:14:01     16

編程基礎(chǔ)學(xué)習(xí):Java輸入流轉(zhuǎn)字符串,編程基礎(chǔ)學(xué)習(xí):Java輸入流轉(zhuǎn)字符串,在本教程中,我們將介紹如何使用Guava,Apache Commons IO庫和普通Java將InputStream轉(zhuǎn)換為S

課程價格 請咨詢

上課時段: 授課校區(qū):

詳細(xì)介紹

編程基礎(chǔ)學(xué)習(xí):Java輸入流轉(zhuǎn)字符串,在本教程中,我們將介紹如何使用Guava,Apache Commons IO庫和普通Java將InputStream轉(zhuǎn)換為String。

使用Guava轉(zhuǎn)換

讓我們從一個Guava示例開始——利用ByteSource功能:

@Testpublic?void?givenUsingGuava_whenConvertingAnInputStreamToAString_thenCorrect()??throws?IOException?{?String?originalString?=?randomAlphabetic(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——據(jù)我所知,這是最簡單的方法

然后-我們將ByteSource視為具有UTF8字符集的CharSource。

最后-我們使用CharSource將其作為String讀取。

使用zuava進(jìn)行轉(zhuǎn)換的一種更簡單的方法,但需要明確關(guān)閉流;幸運(yùn)的是,我們可以簡單地使用try-with-resources語法來處理這個問題:

@Testpublic?void?givenUsingGuavaAndJava7_whenConvertingAnInputStreamToAString_thenCorrect()??throws?IOException?{?String?originalString?=?randomAlphabetic(8);?InputStream?inputStream?=?new?ByteArrayInputStream(originalString.getBytes());??String?text?=?null;?try?(final?Reader?reader?=?new?InputStreamReader(inputStream))?{?text?=?CharStreams.toString(reader);?}??assertThat(text,?equalTo(originalString));}

使用Apache Commons IO進(jìn)行轉(zhuǎn)換

現(xiàn)在讓我們看看如何使用Commons IO庫執(zhí)行此操作。

這里有一個重要的警告——與Guava相反,這些例子都不會關(guān)閉InputStream——這就是我個人更喜歡Guava解決方案的原因。

@Testpublic?void?givenUsingCommonsIo_whenConvertingAnInputStreamToAString_thenCorrect()throws?IOException?{String?originalString?=?randomAlphabetic(8);InputStream?inputStream?=?new?ByteArrayInputStream(originalString.getBytes());String?text?=?IOUtils.toString(inputStream,?StandardCharsets.UTF_8.name());assertThat(text,?equalTo(originalString));}

我們也可以使用StringWriter進(jìn)行轉(zhuǎn)換:

@Testpublic?void?givenUsingCommonsIoWithCopy_whenConvertingAnInputStreamToAString_thenCorrect()??throws?IOException?{?String?originalString?=?randomAlphabetic(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轉(zhuǎn)換——InputStream

現(xiàn)在讓我們看一下使用普通Java的低級方法-一個InputStream和一個簡單的StringBuilder:

@Testpublic?void?givenUsingJava5_whenConvertingAnInputStreamToAString_thenCorrect()??throws?IOException?{?String?originalString?=?randomAlphabetic(DEFAULT_SIZE);?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和Scanner進(jìn)行轉(zhuǎn)換

接下來,讓我們看一個簡單的Java示例-使用標(biāo)準(zhǔn)文本Scanner:

@Testpublic?void?givenUsingJava7_whenConvertingAnInputStreamToAString_thenCorrect()throws?IOException?{String?originalString?=?randomAlphabetic(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));}

請注意,關(guān)閉Scanner將關(guān)閉InputStream。

這是使用Java 7示例的唯一原因(而不是Java 5示例)是使用try-with-resources語句 - 將其轉(zhuǎn)換為標(biāo)準(zhǔn)的try-finally塊,使用Java 5進(jìn)行編譯。

使用ByteArrayOutputStream進(jìn)行轉(zhuǎn)換

最后,讓我們看一下另一個普通的Java示例,這次使用ByteArrayOutputStream類:

@Testpublic?final?void?givenUsingPlainJava_whenConvertingAnInputStreamToString_thenCorrect()throws?IOException?{String?originalString?=?randomAlphabetic(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));}

在此示例中,首先通過讀取和寫入字節(jié)塊將InputStream轉(zhuǎn)換為ByteArrayOutputStream,然后將OutputStream轉(zhuǎn)換為字節(jié)數(shù)組,用于創(chuàng)建String。

使用java.nio進(jìn)行轉(zhuǎn)換

另一種解決方案是將InputStream的內(nèi)容復(fù)制到文件,然后將其轉(zhuǎn)換為String:

@Testpublic?final?void?givenUsingTempFile_whenConvertingAnInputStreamToAString_thenCorrect()throws?IOException?{String?originalString?=?randomAlphabetic(DEFAULT_SIZE);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類來創(chuàng)建臨時文件,以及將InputStream的內(nèi)容復(fù)制到文件中。然后,使用相同的類將文件內(nèi)容轉(zhuǎn)換為使用readAllBytes()方法的String。

以上就是長沙一度軟件培訓(xùn)java培訓(xùn)機(jī)構(gòu)的小編針對“編程基礎(chǔ)學(xué)習(xí):Java輸入流轉(zhuǎn)字符串”的內(nèi)容進(jìn)行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務(wù)。

培訓(xùn)啦提醒您:交易時請核實對方資質(zhì),對于過大宣傳或承諾需謹(jǐn)慎!任何要求預(yù)付定金、匯款等方式均存在風(fēng)險,謹(jǐn)防上當(dāng)。