流对象操作实例讲解

作者:创世魂

 

● 流对象说明

 

流对象的概念和作用:

流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称。

即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。

流对象的分类:

根据处理数据类型的不同分为:字符流和数据流。

1、在火山中“XX写出流”“XX读入流”都属于字符流。

2、“XX输入流”“XX输出流”都属于数据流。

流对象的作用:

在程序实际开发过程中,对应不同的数据需要用不同的流来进行操作。

1、操作文件,可能会用到“文件输入/出流”

2、操作字节数组,可能要用“字节数组输入/出流”

总之要根据当前程序情况,选择合适的流对象。

 

下面将列举一些实例,来讲解流对象应该如何使用。

 

 

一、写出流

 

● 写出流说明:

 

如果要创建本对象,请用当前类中的创建方法进行。

注意:如果不使用本对象后一定要记着关闭。

注意2:在火山中XX写出流,都是本类的子类。

 

● 创建文件写出流
● 添加文本
● 关闭

 

“创建文件写出流”帮助文档:

顾名思义,通过本方法可创建一个文件写出流,文件路径由“参数1”决定。

如果文件不存在会自动创建,如果文件存在,可通过“参数2”来决定是否追加内容。

创建后返回“写出流”对象,创建失败返回空对象。

 

“添加文本”帮助文档:

顾名思义,给当前“写出流”对象添加指定文本。

添加成功返回真,否则返回假。

 

“关闭”帮助文档:

顾名思义,通过本方法可关闭当前流对象。

注意:如果不使用当前对象后,务必调用本方法进行关闭,且关闭后无法进行任何其他行为的操作。

 

代码编写如下图:

1、定义类型为“写出流”的变量并勾选参考。

2、调用“创建文件写出流()”方法创建当前流对象,并赋值给定义的变量。

3、调用“添加文本()”方法进行文本数据添加。

4、不使用当前对象后进行关闭操作。

 

运行结果如下图(GIF):

“按钮1”被点击后会提示“添加文本成功”

此时打开文件管理器,会在存储卡根目录内看到当前创建的文件。

由此可见,本例程等同于调用了“写出文本文件()”方法,只不过本例程是通过流对象创建的。

 

● 写出字符

 

帮助文档如下图:

通过本方法可写出一个字符到“写出流”对象中。

写出成功返回真,失败返回假。

注意:每个字母,汉字,数字均代表一个字符。

 

代码编写如下图:

本实例的重点是学习“文本到字符串().取字符(0)”方法的应用,通过此方法可将“文本”转换成“字符”

注意:不使用流对象后,务必要调用“关闭()”方法。

 

运行结果如下图(GIF):

“按钮1”被点击后会提示“写出字符成功”

从文件管理器打开“1.txt”文件,文件内就会看到写出的字符内容。

 

● 写出字符数组
● 写出字符数组1

 

以上两个方法的作用都是用来写出字符数组到流对象中,此处举例“写出字符数组()”方法。

 

帮助文档如下图:

通过本方法可写出字符数组到“写出流”对象中。

写出成功返回真,失败返回假。

 

代码编写如下图:

通过“文本到字符数组()”方法可将“文本”转换成“字符数组”

随后调用“写出字符数组()”方法即可将其写出。

 

运行结果如下图(GIF):

“按钮1”被点击后会提示“写出字符数组成功”

从文件管理器打开“1.txt”文件,文件内就会看到写出的字符内容。

 

● 写出文本
● 写出文本1

 

以上两个方法的用法和添加文本()方法一致,参考添加文本方法即可。

 

 

 

二、字符数组写出流

 

● 本类说明

 

本类继承了“写出流”可使用写出流的所有方法。

本类的主要作用:针对字符数组进行写出流操作。

 

● 创建
● 到字符数组

 

“创建”帮助文档:

顾名思义,通过本方法可创建一个“字符数组写出流”对象。

本方法只有一个参数,用来设置缓冲区尺寸,如对尺寸无特殊要求,留空即可。

 

“到字符数组”帮助文档:

通过本方法可将当前流对象内存储的内容转换成字符数组。

 

代码编写如下图:

1、定义类型为“字符数组写出流”的变量,并调用“创建()”方法赋值给此变量。

2、通过“写出流”对象中的“添加文本()”方法可对当前流对象写入内容。

3、调用“到字符数组()”方法转换成字符数组,可通过“字符数组到文本()”方法重新将其转换为文本。

 

运行结果如下图:

“按钮1”被点击后,代码中输入的文本内容会出现在编辑框中。

 

● 写到流

 

帮助文档如下图:

简单来说,本方法可以将当前流对象的内容放到指定流对象中,类似于复制。

参数1:填写要操作的“字符数组写出流”对象,如果是通过变量调用本方法,则本参数忽略。

参数2:填写目标“写出流”对象,只要是继承了“写出流”的类,都可以填在本参数中。例如:字符数组写出流。

参数3:如果不想判断写出状态,本参数为空即可。

 

代码编写如下图:

1、创建“字符数组写出流”对象,起名“流对象1”,并添加一段文本数据。

2、再次创建一个“字符数组写出流”对象,起名“流对象2”

3、通过“流对象1”调用“写出流()”方法,将其内容写入到“流对象2”中。

4、最后从“流对象2”中读取内容。

 

运行结果如下图:

“按钮1”被点击后,代码中输入的文本内容会出现在编辑框中。

 

● 取缓冲区尺寸

 

帮助文档如下图:

顾名思义,通过本方法可取出当前缓冲区的尺寸。

但是取出的尺寸并非创建流对象时的尺寸,而是流对象内容的尺寸。

 

代码编写如下图:

1、创建“字符数组写出流”对象,起名“流对象”,设置缓冲区尺寸为100。

2、添加一串文本到流对象中。

3、取出缓冲区尺寸,显示在编辑框中。

 

运行结果如下图:

“按钮1”被点击后,可看到当前缓冲区尺寸为“4”,证明并非创建时的尺寸。

 

● 重置

 

帮助文档如下图:

通过本方法可重置流对象的缓冲区。

 

代码编写如下图:

在上一个方法的基础上,增加本方法测试结果。

 

运行结果如下图:

最终取出缓冲区尺寸为0,证明流对象被重置。

 

 

三、缓冲写出流

 

● 本类说明

 

本类继承了“写出流”可使用写出流的所有方法。

本类的主要作用:高效写出。

 

● 创建

 

帮助文档如下图:

顾名思义,通过本方法可创建一个“缓冲写出流”对象。

参数1:填写基于的“写出流”对象。

参数2:填写缓冲区尺寸。

 

代码编写如下图:

1、创建一个文件写出流对象,起名“写出流对象”

2、创建缓冲写出流对象,将“写出流对象”放到“创建()”方法的参数中。

3、此处添加文本后需要调用“写出缓冲()”方法,保证内容被成功写出到文件中。

4、关闭两个流对象。

 

运行结果如下图(GIF):

提示“添加成功”后,打开文件管理器就会看到写出的文件。

 

● 写出换行

 

帮助文档如下图:

顾名思义,调用本方法等同于使用了“\n”换行符。

添加成功返回真,失败返回假。

 

代码编写如下图:

在上一个方法代码的基础上,增加本方法。

 

运行结果如下图(GIF):

提示“添加成功”后,打开写出的文件,会发现文本被换行。

 

 

四、打印写出流

 

● 本类说明

 

本类继承了“写出流”可使用写出流的所有方法。

本类的主要作用:可用于打印格式文本数据

注意:此类并不能连接打印机。

 

● 创建
● 创建1
● 创建2
● 创建3
● 打印数据
● 检查错误

 

前四个创建方法,都是用于创建当前“打印写出流”对象,此处演示“创建2”方法。

 

“创建2”帮助文档:

通过本方法可创建当前打印写出流对象。

参数1:填写要保存的文件路径,如果文件存在会进行覆盖操作。

参数2:可通过“文本编码”类中定义的常量值调用。

 

“打印数据”帮助文档:

顾名思义,通过本方法可打印数据到本地文件中,支持所有类型的数据打印。

注意:如果要检查是否打印成功,需要调用“检查错误()”方法。

 

“检查错误”帮助文档:

本方法用于检查打印方法是否执行错误。

返回真表示执行错误,执行正确返回假。

 

代码编写如下图:

1、调用“创建2”方法,创建当前“打印写出流”的对象。

2、调用“打印数据()”方法,可随意打印“整数”“小数”“文本”等各种类型数据。

3、最后调用“检查错误()”方法检查打印结果。

 

运行结果如下图(GIF):

提示“数据写出成功!”后,打开文件管理器就可以看到写出的文件。

 

● 打印换行

 

帮助文档如下图:

调用本方法就等同于使用“\n”换行符。

 

代码编写如下图:

在上一个方法代码的基础上,增加本方法做测试。

 

运行结果如下图(GIF):

最终结果可看到,文本文件中的数据被换行。

 

● 打印格式数据

 

帮助文档如下图:

通过本方法可打印“格式文本”数据到指定文件中。

参数1:要操作的打印流对象。

参数2:填写要操作的“格式文本”

参数3:可自由扩展,填写任意类型数据。

 

代码编写如下图:

1、创建当前打印写出流对象。

2、调用“打印格式数据()”方法,打印数据。

3、最后检查是否打印成功。

 

运行结果如下图(GIF):

 

 

五、管道读入/写出流

 

● 本分类说明

 

本分类说明:

本分类共两个对象,分别为“管道写出流”“管道读入流”对象。

主要作用:用于多线程之间的通信,可通过“管道写出流”发送数据,“管道读入流”接收数据。

以上两个类在使用中有以下注意事项:

1、本管道写出/读入对象是线程安全的,不会出现线程冲突的情况。

2、千万不要在一个线程内同时使用这两个管道对象。

3、两个管道对象,只能一方连接另一方,不可双方互联,也不可一方连多方(例如:一个写出管道连接多个读入管道。)

4、使用完毕之后,请及时调用“关闭”来关闭掉这两个管道对象.

下面将写一个示例程序讲解具体通信实现过程。

 

● 示例程序讲解

 

代码编写(1):

1、首先在成员变量中定义两个线程类,分别起名“多线程1”“多线程2”

2、随后定义类型为“管道写出/读入流”的变量,起名“读入管道”“写出管道”,并给“写出管道”勾选参考。

代码编写(2):

3、“按钮1”被点击后,通过“管道写出流.创建(读入管道)”方法,创建“写出管道”对象。

4、分别将两个线程对象启动。

代码编写(3):

判断“多线程1”被启动后:

5、通过“写出管道.写出文本()”方法可向读入管道发送数据。

6、不使用“写出管道”后,调用“关闭()”方法关闭当前对象。

判断“多线程2”被启动后:

7、定义“读入长度”整数变量,用于判断数据是否读入完毕。

8、定义“字符[10]”结果字符变量,用于存储接收到的数据(注意:成员数必须大于接收数据)。

9、循环判断“读入长度”的数值是否不等于-1,从而执行“读入管道.读入文本()”方法。

“读入文本()”帮助文档:

参数1:要操作的流对象,动态调用时本参数省略。

参数2:管道接收到的数据,存放在本参数内。

参数3:起始读取位置。

参数4:读取字符数量,不能大于定义的“字符数组”成员数量。

参数5:留空即可。

10、执行“读入文本()”方法的目的,是为了将返回值赋值给“读入长度”变量,从而使“判断循环()”进行循环执行读取。

11、利用“字符数组到文本()”方法可将定义的“结果字符”变量转换成文本显示。

12、关闭读入管道流对象,至此利用管道流在线程中发送数据编写完毕。

 

运行结果如下图:

 

 

六、读入流

 

● 本类说明

 

本类的主要作用就是用来进行数据读入操作。

所有的“XX读入流”都是基于本类,不使用本对象后注意关闭。

 

● 创建字符数组读入流
● 读入字符
● 关闭

 

“创建字符数组读入流”帮助文档:

顾名思义,通过字符数组创建当前对象,失败返回空对象。

 

“读入字符”帮助文档:

通过本方法可读取当前流对象内的一个字符,返回当前字符代码,如果返回-1表示读取完毕。

字符代码:字符的一种表现形式,可通过“(字符)具体字符代码”将字符代码强制转换成“字符”类型。

注意:第一次调用读取流对象中第一个字符,第二次调用读取第二个字符,以此类推。

 

“关闭”帮助文档:

不使用当前对象后,务必调用本方法关闭。

代码编写如下图:

1、定义类型为“读入流”的变量,起名“流对象”并勾选参考。

2、通过“创建字符数组读入流()”方法创建本对象,赋值给“流对象”变量。

3、定义“返回结果”整数变量,用于循环判断结果值是否等于-1,从而实现循环读取字符。

4、在循环语句内再次判断“返回结果”是否不等于-1,用于防止字符多读。

5、将字符代码转换成文本显示在编辑框中。

6、最后关闭本对象。

 

运行结果如下图:

 

● 创建文件读入流
● 读入文本

 

“创建文件读入流”帮助文档:

通过本方法可从一个文件创建“读入流”对象,创建失败返回空对象。

 

“读入文本”帮助文档:

调用本方法可读取一段文本,读取的文本将存放在参数2的“结果字符数组”中。

参数3、4:用于指定要读取的其实位置和读取字符数目。

如果本方法返回-1,表示应读取完毕。

代码编写如下图:

只需要在上一个方法代码的基础上简单修改即可。

1、调用“创建文件读入流()”通过存储卡的指定文件创建当前对象。

2、增加类型为“字符[1]”的结果字符变量,用于存储读取结果。

3、循环方法内调用“读入文本()”方法,一个字符一个字符的读取到“结果字符”中。

4、利用“字符数组到文本()”方法将字符数组转换成文本显示在编辑框中。

5、最后关闭当前对象。

 

运行结果如下图:

“按钮1”被点击后,文件的内容就会被读取到编辑框中显示。

 

● 创建文本内容读入流

 

帮助文档如下图:

本方法顾名思义,可通过文本创建一个读入流对象,失败返回空对象。

代码编写如下图:

在上一个方法的基础上将“创建文件读入流()”换成“创建文本内容读入流()”方法即可,其余代码保持不变。

 

运行结果如下图:

“按钮1”被点击后,文本内容就会被读取到编辑框中显示。

 

● 标记
● 跳转到标记
● 是否支持标记(读)

 

“标记”帮助文档:

顾名思义,做一个标记,需要时可跳转到本标记位置。

参数2的作用:后续读入多少个字符后,本标记失效。

 

“跳转到标记”帮助文档:

顾名思义,跳转到最后一次标记位置。

 

“是否支持标记(读)”帮助文档:

通过本属性可判断当前流对象是否支持标记,返回真表示支持,否则不支持。

代码编写如下图:

1、通过“创建文本内容读入流()”创建当前流对象。

2、定义“返回结果”整数变量,用于读取返回值。

3、读入一个字符后,判断当前对象是否支持标记,如果支持则调用“标记()”方法标记位置。

4、再次读入一个字符后,调用“跳转到标记()”方法跳转到指定位置。

5、重新读入一个字符后关闭当前对象。

 

运行结果如下图(GIF):

最后可看到编辑框中显示了两个“文”,证明“标记()”“跳转到标记()”方法都执行成功。

 

● 跳过

 

帮助文档如下图:

顾名思义,通过本方法可跳过指定字符数,返回跳过的字符数量。

如果跳过失败则返回-1。

代码编写如下图:

1、通过“创建文本内容读入流()”创建当前流对象。

2、调用“跳过()”方法跳过4个字符后,调用“读入字符()”读取一个字符。

3、最后关闭当前对象。

 

运行结果如下图(GIF):

最终结果,编辑框内显示“容”,证明前四个字符被成功跳过。

 

 

七、缓冲读入流

 

● 本类说明

 

本类继承了“读入流”可使用读入流的所有方法。

本类的主要作用:用于高效读取数据。

 

● 创建
● 读入一行

 

“创建”帮助文档:

通过指定“读入流”创建当前对象,失败返回空对象。

 

“读入一行”帮助文档:

顾名思义,通过本方法可读入一行文本,失败将返回空对象。

代码编写如下图:

1、通过“创建文本内容读入流()”创建“读入流对象”

2、随后利用“读入流对象”创建“缓冲读入流”对象。

3、调用“读入一行()”方法读取一行文本,显示在编辑框中。

4、关闭两个流对象。

 

运行结果如下图:

最终结果,读取了一行文本显示在编辑框中。

 

 

八、行号读入流

 

● 本类说明

 

本类继承了“读入流”“缓冲读入流”可使用这两个类的所有方法。

本类的主要作用:获取当前读入行的行号。

 

● 创建行号读入流
● 取当前行号

 

“创建行号读入流”帮助文档:

通过指定“读入流”创建当前对象,失败返回空对象。

参数1:提供要创建行号读入流的“读入流”对象。

参数2:如无特殊需求留空即可。

 

“取当前行号”帮助文档:

通过本方法可读取当前行的行号。

注意:行号从0开始。

代码编写如下图:

1、通过“创建文本内容读入流()”创建“读入流对象”

2、随后利用“读入流对象”创建“行号读入流”对象。

3、调用“取当前行号()”“读入一行()”获取行号和文本显示在编辑框中。

4、关闭两个流对象。

 

运行结果如下图:

最终结果,行号和文本成功读取。

 

 

九、文件输入流

 

● 本类说明

 

本流对象继承了“输入流”可使用输入流的所有方法,因输入流不能直接创建对象,因此用本类做演示。

本类的主要作用:以流的方式对文件进行操作。

 

● 创建
● 读入数据

 

“创建”帮助文档:

通过指定“文件路径”创建当前对象,失败返回空对象。

 

“读入数据”帮助文档:

通过本方法可读取对象中存储的文件数据,读取成功返回实际读取的字节数,否则返回-1。

参数1:提供要操作的输入流,通过变量调用本方法是,本参数省略。

参数2:提供字节数组缓冲区,用于存放读取到的文件数据。

参数3、4:提供起始位置和读取字节数。

参数5:提供读取的状态对象,如果不想使用本参数,填写空对象即可。

注意:本方法继承自“输入流”

代码编写如下图:

1、通过“创建()”创建“文件输入流”对象。

2、定义类型为“字节[]”的缓冲数组变量,成员填写1024,此变量的作用用于临时存放读取到的文件数据。

3、定义“返回结果”整数变量,用于判断“读入数据()”是否读取成功。

4、循环判断“返回结果”是否不等于-1,如果不等于就调用“文件流.读入数据()”方法,并将结果显示在编辑框中。

5、最后关闭本对象。

 

运行结果如下图:

最终结果,文本文件的内容读取成功。

 

● 创建缓冲流
● 读入指定尺寸数据

 

“创建缓冲流”帮助文档:

通过本方法可创建“缓冲输入流”对象,目的用于快速高效读取数据,失败返回空对象。

注意:“缓冲输入流”同样继承自“输入流”可使用输入流的所有方法。

 

“读入指定尺寸数据”帮助文档:

本方法可“读入数据()”方法类似,不同之处为,本方法返回值为逻辑型,用于判断是否读取成功。

注意:如果缓冲字节数组成员数大于要读取的数据,则本方法会返回假。

代码编写如下图:

1、通过“文件输入流.创建缓冲流()”方法创建“缓冲输入流”对象,起名缓冲流。

2、定义类型为“字节[]”的缓冲数组变量,成员填写3,此变量的作用用于临时存放读取到的文件数据。

3、定义“返回结果”逻辑变量,用于判断“读入数据()”是否读取成功。

4、最后将读取结果显示在编辑框中,并关闭本对象。

 

运行结果如下图(GIF):

最终结果,成功读取一个汉字显示在编辑框中。

 

● 标记位置
● 跳回标记位置
● 支持位置标记(读)
● 跳过

 

帮助说明:

以上三个方法的作用可参考“读入流”中的“标记”“跳转到标记”,“跳过”“是否支持标记”

 

 

十、字节数组输入流

 

● 本类说明

 

本类继承自“输入流”可使用输入流的所有方法。

创建本对象,必须使用本对象提供的创建方法。

本类的主要作用:对字节数组进行流操作。

 

● 创建
● 创建2

 

以上两个方法都是用于创建当前字节数组输入流对象,不同之处为“创建2”可以设置起始位置和数据尺寸。

此处举例“创建()”方法。

 

帮助文档如下图:

通过本方法可创建当前字节数组输入流对象,失败返回空对象。

参数1:提供创建当前对象的字节数组。

 

代码编写如下图:

1、调用“创建()”方法创建当前对象。

2、定一个“缓冲数组”变量,调用“读入数据()”方法读取流对象中的数据显示在编辑框中。

3、最后关闭当前对象。

提示:如果要读取的字节数据较多,参考“文件输入流.读入数据()”方法中判断循环的用法。

 

运行结果如下图(GIF):

最终结果,成功将数据显示在编辑框中。

 

 

十一、管道输入/出流

 

“管道输入/出流”的主要作用也是用于线程之间的通信和“管道读/写流”的用法一致。

具体操作实现流程,直接参考“管道读/写流”即可。

 

 

十二、文件输出流

 

● 本类说明

 

本类继承自“输出流”可使用输出流的所有方法。

本类的主要作用:用于文件写出操作。

 

● 创建
● 写出数据2
● 写出缓存
● 关闭

 

“创建”帮助文档:

顾名思义,通过本方法可创建当前“文件输出流”

参数1:提供要写出的文件路径。

参数2:是否在原文件的基础上增加数据,如果留空则覆盖原文件。

 

“写出数据2”帮助文档:

本方法继承自“输出流”可用于写出数据。

参数1:要操作的输出流对象,通过变量调用本方法时,本参数省略。

参数2:准备写出的字节数组数据。

参数3:写出状态保存在此参数中,留空则为空对象。

写出成功返回真,失败返回假。

 

“写出缓存”帮助文档:

本方法的作用可保证流对象的数据被正常写出。

注意:本方法继承自“输出流”

 

“关闭”帮助文档:

顾名思义,关闭当前对象。

注意:本方法继承自“输出流”

 

代码编写如下图:

1、通过“创建()”创建当前流对象。

2、调用“写出数据2()”方法写出一段数据到流对象中,并判断是否写出成功。

3、调用“写出缓存()”用来保证数据被成功写出到文件中。

4、最后关闭当前对象。

 

运行结果如下图(GIF):

“按钮1”被点击后,打开文件管理器可看到被写出的文件。

 

 

十三、字节数组输出流

 

● 本类说明

 

本类继承自“输出流”可使用输出流的所有方法。

本类的主要作用:操作字节数组,可实现字节数组合并。

 

● 创建
● 取已写入数据

 

“创建”帮助文档:

顾名思义,通过本方法可创建当前“字节数组输出流”

参数1:填写字节尺寸,如果写入的数据大于本尺寸,将自动扩充。

 

“取已写入数据”帮助文档:

通过本方法可将写入的字节数组合并后取出并返回。

 

代码编写如下图:

1、通过“创建()”创建当前“字节数组输出流”对象,尺寸分配1。

2、调用“写出数据2()”方法写出三组数据。

3、调用“取已写入数据()”取出被写出的数据显示在编辑框中。

4、最后关闭当前对象。

 

运行结果如下图:

最终被写出的数据将会合并显示在编辑框中。

 

● 取已写入文本
● 取已写入数据尺寸

 

“取已写入文本”帮助文档:

通过本方法可直接取出当前流对象内的文本数据。

 

“取已写入数据尺寸”帮助文档:

本方法可取出流对象中的数据尺寸,单位字节。

 

代码编写如下图:

1、创建当前“字节数组输出流”对象,尺寸分配1。

2、调用“写出数据2()”方法写出三组数据。

3、调用“取已写入文本()”“取已写入数据尺寸()”方法取出数据和尺寸,显示在编辑框中。

4、最后关闭当前对象。

 

运行结果如下图:

 

● 写到流

 

本方法的作用和用法可参考“字符数组写出流.写到流()”方法。

 

 

十四、打印输出流

 

● 本类说明

 

本类中的方法和“打印写出流”中的方法基本一致,不同之处为本类继承自“输出流”

下面列举一个示例来讲解如何操作。

 

代码编写如下图:

1、定义类型为“打印输出流”的变量并勾选参考,调用“创建2()”方法赋值给此变量。

2、调用“写出数据2()”“打印数据()”方法写出数据到文件中。

3、最后关闭当前对象。

 

运行结果如下图(GIF):

最后两组数据将成功被写出到文件中。