任务描述
本关任务:将给定整数通过 ByteArrayOutputStream 转换为字符串,并输出结果。
相关知识
字节数组流
字节数组流是和内存中的数组相关的一个流,它可以将字节数组写到输出流中,也可以将字节数组从输入流中读出来,所有过程不涉及磁盘读写。 #####字节数组输入流(ByteArrayInputStream)
ByteArrayInputStream 是 InputStream 的子类,该流可以把一个字节数组在内存中变成一个输入流,也就是说,它把一个字节数组 byte[] 包装了一下,使其具有流的属性,可顺序读下去。
字节数组输入流构造方法
下表是它的构造方法:
| 构造方法 | 说明 |
|---|---|
| ByteArrayInputStream(byte[] buf) | 通过一个字节数组创建一个字节数组输入流对象 |
| ByteArrayInputStream(byte[] buf, int offset, int length) | 通过一个字节数组的部分数据创建一个字节数组输入流对象,offset:数组偏移量,length:读取长度 |
构造方法使用示例:
public static void main(String[] args) throws IOException {// 创建字节数组byte[] bytes = {96,97,98,99};// 通过字节数组创建ByteArrayInputStream对象ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);// 通过字节数组的部分数据创建ByteArrayInputStream对象ByteArrayInputStream byteArrayInputStream1 = new ByteArrayInputStream(bytes, 0, 3);}字节数组输入流常用方法
下表是它的常用方法:
| 方法名 | 方法说明 |
|---|---|
| read() | 从输入流中读取下一个数据字节 |
| read(byte b[], int off, int len) | 将最多 len 个数据字节从此输入流读入字节数组。off:数组中的起始偏移量,len:写入的字节数 |
| skip(long n) | 从输入流中跳过 n 个输入字节 |
| available() | 返回剩余可读取的字节数 |
read() 方法使用示例:
public static void main(String[] args) throws IOException {// 创建字节数组byte[] bytes = {96,97,98,99};// 读取字节数组数据try(ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);) {int read;while((read=byteArrayInputStream.read())!=-1){System.out.println(read);}}执行结果:
96979899从以上代码中可以看到,ByteArrayInputStream 是从字节数组中读取数据,这是它的主要特征。 #####字节数组输出流(ByteArrayOutputStream)
ByteArrayOutputStream 是 OutputStream 的子类,该流用于创建字节数组输出流,同时内存会为该输出流创建一个默认大小的字节数组,用于存储写入的字节内容。
字节数组输入流构造方法
下表是它的构造方法:
| 构造方法 | 说明 |
|---|---|
| ByteArrayOutputStream() | 创建一个 32 字节(默认大小)的缓冲区 |
| ByteArrayOutputStream(int size) | 创建一个大小为 size 字节的缓冲区 |
构造方法使用示例:
public static void main(String[] args) throws IOException {// 创建一个有默认大小字节的缓冲区的ByteArrayOutputStream对象ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();// 创建一个有64字节的缓冲区的ByteArrayOutputStream对象ByteArrayOutputStream byteArrayOutputStream1 = new ByteArrayOutputStream(64);}字节数组输出流常用方法
| 方法 | 说明 |
|---|---|
| reset() | 重置流,使流计数=0 |
| toByteArray() | 创建一个新分配的字节数组。数组的大小和当前输出流的大小,内容是当前输出流的拷贝 |
| toString() | 将缓冲区的内容转换为字符串,根据平台的默认字符编码将字节转换成字符 |
| write(int w) | 将指定的字节写入此字节数组输出流 |
| write(byte []b, int off, int len) | 将指定字节数组中从偏移量 off 开始的 len 个字节写入此字节数组输出流 |
| writeTo(OutputStream outSt) | 将此字节数组输出流的全部内容写入到指定的输出流参数中 |
常用方法使用示例:
public static void main(String[] args) throws IOException {try (// 创建ByteArrayOutputStream对象ByteArrayOutputStream bOutput = new ByteArrayOutputStream();) {// 向缓冲区写入数据for (int i = 97; i < 100; i++) {bOutput.write(i);}// 从流中取出数据byte b[] = bOutput.toByteArray();// 将数据转换为字符串System.out.print(new String(b));}}执行结果:
abc从以上代码中可以看到,我们从 ByteArrayOutputStream 流中取出数据用的是 toByteArray 方法。
- import java.io.*;
- import java.util.Scanner;
-
- public class FileTest {
-
- public static void main(String[] args) throws IOException {
- // 请在此编写代码
- /********** Begin **********/
- try (
- // 创建ByteArrayOutputStream对象
- ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
- ) {
- // 获取给定数据并写入ByteArrayOutputStream流中
- Scanner input = new Scanner(System.in);
- while (!input.hasNext("%")){
- byteArrayOutputStream.write(Integer.parseInt(input.next()));
- }
- // 从流中取出数据
- byte[] bytes = byteArrayOutputStream.toByteArray();
- // 将数据转换为字符串,并输出结果
- System.out.println(new String(bytes));
- }
- /********** End **********/
- }
- }