更新时间:2020-07-14 16:30:43 来源:极悦 浏览2091次
编程基础学习:Java输入流转字符串,在本教程中,我们将介绍如何使用Guava,Apache Commons IO库和普通Java将InputStream转换为String。
使用Guava转换
让我们从一个Guava示例开始——利用ByteSource功能:
@Test
public 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——据我所知,这是最简单的方法
然后-我们将ByteSource视为具有UTF8字符集的CharSource。
最后-我们使用CharSource将其作为String读取。
使用zuava进行转换的一种更简单的方法,但需要明确关闭流;幸运的是,我们可以简单地使用try-with-resources语法来处理这个问题:
@Test
public 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进行转换
现在让我们看看如何使用Commons IO库执行此操作。
这里有一个重要的警告——与Guava相反,这些例子都不会关闭InputStream——这就是我个人更喜欢Guava解决方案的原因。
@Test
public 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进行转换:
@Test
public 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转换——InputStream
现在让我们看一下使用普通Java的低级方法-一个InputStream和一个简单的StringBuilder:
@Test
public 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进行转换
接下来,让我们看一个简单的Java示例-使用标准文本Scanner:
@Test
public 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));
}
请注意,关闭Scanner将关闭InputStream。
这是使用Java 7示例的唯一原因(而不是Java 5示例)是使用try-with-resources语句 - 将其转换为标准的try-finally块,使用Java 5进行编译。
使用ByteArrayOutputStream进行转换
最后,让我们看一下另一个普通的Java示例,这次使用ByteArrayOutputStream类:
@Test
public 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));
}
在此示例中,首先通过读取和写入字节块将InputStream转换为ByteArrayOutputStream,然后将OutputStream转换为字节数组,用于创建String。
使用java.nio进行转换
另一种解决方案是将InputStream的内容复制到文件,然后将其转换为String:
@Test
public 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类来创建临时文件,以及将InputStream的内容复制到文件中。然后,使用相同的类将文件内容转换为使用readAllBytes()方法的String。
以上就是极悦java培训机构的小编针对“编程基础学习:Java输入流转字符串”的内容进行的回答,希望对大家有所帮助,如有疑问,请在线咨询,有专业老师随时为你服务。
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习