• 学习-Java输入输出之数组IO流之将给定整数转换为字符串


    任务描述

    本关任务:将给定整数通过 ByteArrayOutputStream 转换为字符串,并输出结果。

    相关知识

    字节数组流

    字节数组流是和内存中的数组相关的一个流,它可以将字节数组写到输出流中,也可以将字节数组从输入流中读出来,所有过程不涉及磁盘读写。 #####字节数组输入流(ByteArrayInputStream)

    ByteArrayInputStream 是 InputStream 的子类,该流可以把一个字节数组在内存中变成一个输入流,也就是说,它把一个字节数组 byte[] 包装了一下,使其具有流的属性,可顺序读下去。

    字节数组输入流构造方法

    下表是它的构造方法:

    构造方法说明
    ByteArrayInputStream(byte[] buf)通过一个字节数组创建一个字节数组输入流对象
    ByteArrayInputStream(byte[] buf, int offset, int length)通过一个字节数组的部分数据创建一个字节数组输入流对象,offset:数组偏移量,length:读取长度

    构造方法使用示例:

    1. public static void main(String[] args) throws IOException {
    2. // 创建字节数组
    3. byte[] bytes = {96,97,98,99};
    4. // 通过字节数组创建ByteArrayInputStream对象
    5. ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
    6. // 通过字节数组的部分数据创建ByteArrayInputStream对象
    7. ByteArrayInputStream byteArrayInputStream1 = new ByteArrayInputStream(bytes, 0, 3);
    8. }

    字节数组输入流常用方法

    下表是它的常用方法:

    方法名方法说明
    read()从输入流中读取下一个数据字节
    read(byte b[], int off, int len)将最多 len 个数据字节从此输入流读入字节数组。off:数组中的起始偏移量,len:写入的字节数
    skip(long n)从输入流中跳过 n 个输入字节
    available()返回剩余可读取的字节数

    read() 方法使用示例:

    1. public static void main(String[] args) throws IOException {
    2. // 创建字节数组
    3. byte[] bytes = {96,97,98,99};
    4. // 读取字节数组数据
    5. try(
    6. ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);) {
    7. int read;
    8. while((read=byteArrayInputStream.read())!=-1){
    9. System.out.println(read);
    10. }
    11. }

    执行结果:

    1. 96
    2. 97
    3. 98
    4. 99

    从以上代码中可以看到,ByteArrayInputStream 是从字节数组中读取数据,这是它的主要特征。 #####字节数组输出流(ByteArrayOutputStream)

    ByteArrayOutputStream 是 OutputStream 的子类,该流用于创建字节数组输出流,同时内存会为该输出流创建一个默认大小的字节数组,用于存储写入的字节内容。

    字节数组输入流构造方法

    下表是它的构造方法:

    构造方法说明
    ByteArrayOutputStream()创建一个 32 字节(默认大小)的缓冲区
    ByteArrayOutputStream(int size)创建一个大小为 size 字节的缓冲区

    构造方法使用示例:

    1. public static void main(String[] args) throws IOException {
    2. // 创建一个有默认大小字节的缓冲区的ByteArrayOutputStream对象
    3. ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    4. // 创建一个有64字节的缓冲区的ByteArrayOutputStream对象
    5. ByteArrayOutputStream byteArrayOutputStream1 = new ByteArrayOutputStream(64);
    6. }

    字节数组输出流常用方法

    方法说明
    reset()重置流,使流计数=0
    toByteArray()创建一个新分配的字节数组。数组的大小和当前输出流的大小,内容是当前输出流的拷贝
    toString()将缓冲区的内容转换为字符串,根据平台的默认字符编码将字节转换成字符
    write(int w)将指定的字节写入此字节数组输出流
    write(byte []b, int off, int len)将指定字节数组中从偏移量 off 开始的 len 个字节写入此字节数组输出流
    writeTo(OutputStream outSt)将此字节数组输出流的全部内容写入到指定的输出流参数中

    常用方法使用示例:

    1. public static void main(String[] args) throws IOException {
    2. try (
    3. // 创建ByteArrayOutputStream对象
    4. ByteArrayOutputStream bOutput = new ByteArrayOutputStream();) {
    5. // 向缓冲区写入数据
    6. for (int i = 97; i < 100; i++) {
    7. bOutput.write(i);
    8. }
    9. // 从流中取出数据
    10. byte b[] = bOutput.toByteArray();
    11. // 将数据转换为字符串
    12. System.out.print(new String(b));
    13. }
    14. }

    执行结果:

    1. abc

    从以上代码中可以看到,我们从 ByteArrayOutputStream 流中取出数据用的是 toByteArray 方法。

    1. import java.io.*;
    2. import java.util.Scanner;
    3. public class FileTest {
    4. public static void main(String[] args) throws IOException {
    5. // 请在此编写代码
    6. /********** Begin **********/
    7. try (
    8. // 创建ByteArrayOutputStream对象
    9. ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    10. ) {
    11. // 获取给定数据并写入ByteArrayOutputStream流中
    12. Scanner input = new Scanner(System.in);
    13. while (!input.hasNext("%")){
    14. byteArrayOutputStream.write(Integer.parseInt(input.next()));
    15. }
    16. // 从流中取出数据
    17. byte[] bytes = byteArrayOutputStream.toByteArray();
    18. // 将数据转换为字符串,并输出结果
    19. System.out.println(new String(bytes));
    20. }
    21. /********** End **********/
    22. }
    23. }

     

  • 相关阅读:
    LaTeX之一:macos上latex环境搭建(homebrew安装+vscode配置+ MacTex)和B站视频、网站、教程等相关资料推荐(Overleaf、公式预览网站)
    1015;计算并联电阻的阻值(信奥一本通 )
    1059 C语言竞赛
    基于JSP的民宿酒店预约管理系统【数据库设计、源码、开题报告】
    落单的数字
    【MySQL】库和表的操作
    软件测试面试题:您所熟悉的软件测试类型都有哪些?请试着分别比较这些不同的测试类型的区别与联系(如功能测试、性能测试……等等?)
    操作符知识你会了,那表达式求值呢?
    延迟任务多种实现姿势--中
    “传统”开发与AI开发的区别与联系(更新了GPT3.5的反馈)
  • 原文地址:https://blog.csdn.net/weixin_46075438/article/details/128130262