专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 Java学习 编程基础学习:Java输入流转字符串

编程基础学习:Java输入流转字符串

更新时间:2020-07-14 16:30:43 来源:动力节点 浏览1926次

编程基础学习: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培训机构的小编针对“编程基础学习:Java输入流转字符串”的内容进行的回答,希望对大家有所帮助,如有疑问,请在线咨询,有专业老师随时为你服务。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>