編程基礎(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ù)。