接着上节课的内容
,我们继续讲解
,IO流里边的这些具体的资源类
,那么上次课我们把IO流这个资源类体系当中的
,与文件有关的
,文件流
,给大家做了一个讲解
,那么这个我们继续
,继续讲解我们这边十个小模块当中的第2个
,访问数组有关的数组流
,那么这个模块里边涉及到的也是4个类
,那么分别是ByteArrayInputStream
,ByteArrayOutputStream
,CharArrayReader跟CharArrayWriter
,那么前面两个是我们字节流
,后面两个是字符流
,从我们第1部分文件流当中
,我们的这个代码演示当中你已经看到了
,字符流和字节流它们的使用上面几乎一致
,所以说在这部分当中我只在前面两个类
,它的具体用法给大家讲解到位
,那么后面两个类使用方法几乎一样
,我这边就不啰嗦了
,所以说这边具体我们接下来就说数组流里边东西
,学习数组流跟学习文件流
,实质上步骤都差不多
,第1步我们必须要把数组流的特性
,以及什么场景下面使用数组流
,这边搞清楚
,完了以后呢
,我们再来把我们这些特性以及使用数组流的方法
,把它落定到代码
,所以说这边是这样的一个步骤
,那么接下来我们就具体来看它的特性
,那么数组流的这个特性它跟文件流有一点不一样的地方
,我们的这个前面说的文件流
,它和我的硬盘是有关系的
,我们程序运行起来以后
,在内存当中的程序
,我们从磁盘当中把数据读进来是输入流
,然后我们在程序当中把数据写回硬盘
,这个叫输出流
,但是 我们数组流这块
,
它不涉及到硬盘
,数组流
,它的这个里边的这个不管是输入输出
,实质上都是在内存当中都是在程序内部
,只不过说这边是数组的形式
,然后这边是输入流或者输出流 流的形式
,那么在内存当中我可以把数组
,把它这个数据弄到这个输入流里边
,也可以把这个数组的里边的内容把它弄到这个输出流
,实质上呢 数组流你不要把它理解为
,使不同设备之间的这种数据的传输
,你可以把它更实质的去把它理解为
,是数组和流 两组数据形式之间的相互转换
,这样子呢
,更贴近于这个数组流的本质一些
,所以说我说数组流
,它是这个有别于前面我们讲的文件流
,它们之间有不一样的地方
,那么这个地方应该是最大的这个不同点
,那么你把这个本质性的东西把它搞清楚了
,来 接下来我们具体来说数组流
,那么数组流实质上它是跟内存当中数组相关的流
,我们可以把数组里边的数据把它弄到这个输出流里边
,也可以把数组里边的数据把它弄成一个输入流
,那么所以说在这里边
,我们可以把这个数组流把它看作是
,数组这种数据形式和流这种形式之间的一种转换
,所以说你这样子去理解
,我觉得更加贴近这个本质
,那么具体呢
,什么时候我们会用到数组流这个是
,理解数组流的关键
,什么时候会用到数组流呢
,我们假设这样的一个应用场景
,我们就会用到数组流
,
怎么什么样的一个应用场景呢
,这样的一个应用场景
,我这里边是我们自己的程序
,来 这里边
,我们在这里边有一个自己的程序
,这是我们自己的程序
,来 这是我们自己的程序
,那么这里边另外这边有别人写的工具类
,来 这边是别人写的工具类
,工具类
,我们自己的程序
,需要去调用别人的工具类
,那么我们使用工具类
,实质上就是调用工具类当中的函数
,那么工具类中的方法
,实际上我们就是调用工具类当中的方法
,而工具类当中的方法是什么样的一个情况呢
,是这样的一个情况
,比如说 f 它里边有参数需要传入
,那么这个参数是什么东西呢
,是输入流
,输入流
,或者是输出流
,输出流
,也就是说它里边要求传入的是InputStream
,InputStream
,或者是OutputStream
,put Stream
,它里边要求传入的是InputStream
,或者是OutputStream
,是这样的一个东西
,这个时候我们自己的程序里边
,我们要处理的数据是什么呢
,我们自己程序里边要处理的数据
,形式是什么 是数组
,是数组
,是数组
,那么什么样的数组呢
,这里边当然可以是Byte数组
,也可以是
,可以是Byte数组
,也可以是Char数组
,是这样的一个景况
,
那么在这种应用场景下边
,我们要调用对方的f 这个方法
,那么这方法要求传入的是输入流
,或者是传入输出流
,但我们手头上的这个数据是数组
,那这个时候我们是不是就需要
,把数组把它变成我们的流呢
,这个时候我们就需要把数组变成流
,来 这个时候
,这个时候就需要把这个数组变成流
,那么如果对方要求的是输出流
,我就把数组变成输出流
,如果对方要求的是输入流我就把数组变成输入流
,所以说这个时候我们就需要用到数组流
,所以说什么时候用到数组流
,在这种应用场景下面我们就必须要用到数组流
,所以说这里边
,你把这个场景把它理解到
,那么我们就能够帮助我们进一步去掌握数组流
,为什么使用数组流
,什么时候用数组流
,OK 那么这个东西搞定了以后
,那么我们就具体来看
,我们数组流里边的这四个类
,当然我只讲两个类另外两个类大同小异
,我就不具体去落定的代码
,好吧 那么这里边 第1个类是我们的输入流
,数组输入流
,那么数组输入流呢
,它实质上我们创建一个数组输入流
,这个数组输入流会在内存当中创建一个缓冲区
,我们数组里边的这个数据
,原本数组里面数据就会封装到这个缓冲区里边
,我们原本数组里面数据就会被封装到这个缓冲区里边
,然后呢 我们就可以把这个输入流把它传出去
,这边这是输入流
,那么创建输入流的方式
,
就是我们new 直接new这个数组输入流的这个类
,拿到它的实例对象
,那么我们要封装成流的数组怎么办呢
,就直接从构造参数中传进去就ok
,就是这样子来进行封装的
,很简单一句话
,当然这里边不仅可以将整个数组把它封装成流
,也可以将数组当中一部分把它封装成输入流
,如果说一部分的话你就加上off 和len
,这个是你起始的 数组起始下标
,从起始下标开始的这个数组元素长度
,就是说这边有关于数组输入流这块
,那么怎么样创建两个构造器创建
,具体还有一个东西就是
,输入数组输入流里边有一个特别的方法
,这个方法是直接定义在数组输入流里边的
,是数组输入流自己特有的方法
,叫做available
,那么这个方法它的作用就是
,显示我这个输入流当中剩余的这个字节数
,除了这个输入流当中被夺走的这个数据
,以外的剩下的这个字节的数量 那么这个方法会发挥
,就说这里边是第1个输入流的这个类
,所以说这里边涉及到的知识点有这么些
,那么第2个数组的输出流这个类呢
,同样道理
,它和输入流是一样的一个概念
,我实例化出这个输入流
,输出流
,实例化这个输出流
,它同样会在内存当中创建一个缓冲区
,我们往这个输出流写数据就是说用Write的方法
,Write
,用Write方法往这个输入流写数据
,那么这些数据就会保存到这个缓冲区里边
,所以说这里边是这样的一个情况
,同样道理数组的输出流也有两个创建方式
,
一个是直接实例化对象
,然后呢没有参数
,另外一个可以传一个参数进去
,而这个参数呢 实质上是我们这个
,输出流在数组当中创建的缓冲区的大小
,实质上这个缓冲区里边它的本质也是用数组来保存
,