大家好,我是北军。在本教程中,我们将介绍如何将InputStream转换为String。我们将从普通的Java开始,包括Java8+的解决方案,然后还会考虑使用Guava和ApacheCommonsIO库。在Java中转换-StringBuilder让我们看一个简单的低级方法,它使用纯Java、一个InputStream和一个简单的StringBuilder。@TestpublicvoidconvertingAnInputStreamToAString()抛出IOException{StringoriginalString=randomString(8);InputStreaminputStream=newByteArrayInputStream(originalString.getBytes());StringBuildertextBuilder=newStringBuilder();Readertry(ReaderStrinputreader=newBuffer,Charset.forName(StandardCharsets.UTF_8.name())))){intc=0;while((c=reader.read())!=-1){textBuilder.append((char)c);}}assertEquals(textBuilder.toString(),originalString);}使用Java8进行转换——BufferedReaderJava8为BufferedReader带来了一个新的lines()方法。让我们看看如何使用它将InputStream转换为字符串。@TestpublicvoidconvertingAnInputStreamToAString(){StringoriginalString=randomString(8);InputStreaminputStream=newByteArrayInputStream(originalString.getBytes());Stringtext=newBufferedReader(newInputStreamReader(inputStreams.StandardCharsets))(Collectors.joining("\n"));assertThat(text,equalTo(originalString));}值得一提的是lines()使用了readLine()方法。readLine()假定一行由换行符(“\n”)、回车符(“\r”)或回车符后立即换行符终止。换句话说,它支持所有常见的行结尾。另一方面,当我们使用Collectors.join()时,我们需要明确决定要为我们创建的字符串使用哪种类型的终止符。我们还可以使用Collectors.join(System.lineSeparator()),在这种情况下输出取决于系统设置。使用Java9+进行转换-InputStream.readAllBytes()如果我们使用的是Java9或更高版本,我们可以利用添加到InputStream的新readAllBytes方法。@TestpublicvoidconvertingAnInputStreamToAString()抛出IOException{StringoriginalString=randomString(8);InputStreaminputStream=newByteArrayInputStream(originalString.getBytes());Stringtext=newString(inputStream.readAllBytes().text_Chart8);,equalTo(originalString));}我们需要注意,这段简单的代码适用于那些可以方便地将所有字节读入字节数组的简单情况。我们不应该使用它来读取具有大量数据的输入流。使用Java扫描器进行转换接下来,让我们看一个使用标准文本扫描器的普通Java示例。@TestpublicvoidconvertingAnInputStreamToAString()抛出IOException{StringoriginalString=randomString(8);InputStreaminputStream=newByteArrayInputStream(originalString.getBytes());字符串文本=空;try(Scannerscanner=newScanner.())){text=scanner.useDelimiter("\\A").next();}}assertThat(text,equalTo(originalString));}请注意,InputStream将由关闭的Scanner关闭。同样值得澄清的是useDelimiter("\A")的作用。这里我们传入'\A',这是一个边界标记重复码,表示输入的开始。本质上,这意味着next()调用读取整个输入流。使用ByteArrayOutputStream进行转换最后,让我们看一下另一个简单的Java示例,这次使用ByteArrayOutputStream类。@TestpublicvoidconvertingAnInputStreamToString()抛出IOException{StringoriginalString=randomString(8);InputStreaminputStream=newByteArrayInputStream(originalString.getBytes());];while((nRead=inputStream.read(data,0,data.length))!=-1){buffer.write(data,0,nRead);}buffer.flush();byte[]byteArray=buffer.toByteArray();Stringtext=newString(byteArray,StandardCharsets.UTF_8);assertThat(text,equalTo(originalString));}在此示例中,通过读取和写入字节块将InputStream转换为ByteArrayOutputStream。然后将OutputStream转换为字节数组,用于创建字符串。使用java.nio进行转换另一种解决方案是将InputStream的内容复制到一个文件并将其转换为字符串。@TestpublicvoidconvertingAnInputStreamToAString()抛出IOException{StringoriginalString=randomString(8);InputStreaminputStream=newByteArrayInputStream(originalString.getBytes());路径tempFile=Files.createTempDirectory("").resolve(UUID.()+".tmp");Files.copy(inputStream,tempFile,StandardCopyOption.REPLACE_EXISTING);Stringresult=newString(Files.readAllBytes(tempFile));assertThat(result,equalTo(originalString));}这里我们使用java.nio.file.Files类创建一个临时文件,同时将InputStream的内容复制到文件中。然后使用相同的类通过readAllBytes()方法将文件内容转换为字符串。使用Guava进行转换让我们从一个使用ByteSource功能的Guava示例开始。@TestpublicvoidconvertingAnInputStreamToAString()抛出IOException{StringoriginalString=randomString(8);InputStreaminputStream=newByteArrayInputStream(originalString.getBytes());ByteSourcebyteSource=newByteSource(){@OverridepublicInputStreamopenStream()抛出IOException{returninputStream;}};Stringtext=byteSource.asCharSource(Charsets.UTF_8).read();assertThat(text,equalTo(originalString));}让我们来看看这些步骤:首先,我们将InputStream包装到ByteSource中。其次,我们将ByteSource视为具有UTF8字符集的CharSource。最后,我们使用CharSource将其作为字符串读取。一种更简单的转换方法是使用Guava,但需要显式关闭流,我们可以简单地使用try-with-resources语法来处理这个问题。@TestpublicvoidconvertingAnInputStreamToAString()抛出IOException{StringoriginalString=randomString(8);InputStreaminputStream=newByteArrayInputStream(originalString.getBytes());字符串文本=空;try(Readerreader=newInputStreamReader=Charrea){.toString(reader);}assertThat(text,equalTo(originalString));}使用ApacheCommonsIO进行转换现在让我们看看如何使用CommonsIO库执行此操作。重要的一点是,与Guava不同,这些示例都没有关闭InputStream。@TestpublicvoidconvertingAnInputStreamToAString()抛出IOException{StringoriginalString=randomString(8);InputStreaminputStream=newByteArrayInputStream(originalString.getBytes());Stringtext=IOUtils.toString(inputStream,Standard;Tassert(8assert.UTF_)text,equalTo(originalString));}我们也可以使用StringWriter来进行转换。钻一个字符串。我们从纯Java开始,然后探索如何使用Guava和ApacheCommonsIO库。@TestpublicvoidconvertingAnInputStreamToAString()抛出IOException{StringoriginalString=randomString(8);InputStreaminputStream=newByteArrayInputStream(originalString.getBytes());StringWriterwriter=newStringWriter();字符串编码=StandardCharsets.UTF_8.name();IOUtils.copy(inputStream,writer,encoding);assertThat(writer.toString(),equalTo(originalString));}
