870920 Menu

输入流和输出流详解

流(stream)用来读取或写入数据,各类输入与输出流的使用贯穿整个JUCE类库。输入流用来读取文件或内存中的数据,读取的结果置入内存。输出流则用来将数据写入文件或内存中,输出流的数据来源为给定了起始地址和大小的内存区域。更容易理解的说明是:输入流用来读,输出流用来写。

InputStream 输入流

输入流的抽象基类为InputStream,核心函数read()可读取文件、内存、缓冲中的数据,其他成员函数用于返回当前所读取的位置处的char、bool、short、int、int64、float、double、String(读取全部或读取一行),可获取所读取的数据流的总长度(字节数),判断是否已读完,将所读取的数据置入给定大小和起始地址的内存区域或内存块对象中,跳跃式读取,还可设置从数据中的某个具体位置开始读取,并获取所设置的下一个读取位置,等等。

InputStream 输入流基类的派生类有:
 FileInputStream 文件输入流:用于读取磁盘文件中的数据,构造参数为要读取的文件
 MemoryInputStream 内存输入流:读取内存块对象或某个内存区域中的数据
 BufferedInputStream 缓冲输入流:使用缓冲技术读取其他输入流类的对象
 SubregionStream 将其他输入流中的一部分数据转换为独立的输入流对象
 GZIPDecompressorInputStream 解压缩Zlib文档,数据来源为InputStream对象

注:除File类中的创建输入输出流函数之外,还可通过InputSource输入源类的成员函数创建InputStream输入流对象。InputSource是一个抽象基类,其派生类FileInputSource代表一个具体的文件,该类的成员函数createInputStream()可返回用于读取该文件的InputSream指针。

使用输入流读取数据的具体示例。本例实现:将ZIP文件解压缩,压缩文件中的原始文件为多个SVG图像。ZIP压缩文件的二进制数据已转化为代码中的字节流(注意,此时这些字节流依然是压缩数据)。解压后,每个SVG图像转换为一个Drawable可绘制对象,而后将这些可绘制对象保存到一个OwnedArray自有数组中,以供其他代码块使用:


OutputStream 输出流

与输入流的各个功能相对应,输出流的write()函数可将数据写入到文件或内存中,数据来源为内存中某个区域的数据,也可以是InputStream输入流对象所读取的内容。输出流的抽象基类为OutputStream,其派生类有:

  • FileOutputStream 文件输出流。可将数据写入磁盘文件中
  • MemoryOutputStream 内存输出流。可将数据写入内存缓冲或内存块中
  • GZIPCompressorOutputStream 将Zlib压缩数据写入文件输出流或内存输出流对象中

使用输出流写入数据的具体示例(本例为实现录音的核心函数,音频数据实时写入磁盘文件中):

使用输入/输出流可完成很多具体功能,比如:

 压缩并解压GZIP和ZIP文档
GZIP全名为GUN ZIP,适合于压缩单个文档,其压缩率比ZIP格式更高一些。而ZIP适合于压缩多个文件。压缩并解压GZIP和ZIP文档所需的类:

  • GZIPDecompressorInputStream 解压缩GZIP,数据来源为InputStream输入流对象,解压结果保存到内存区域中。
  • GZIPCompressorOutputStream 创建GZIP压缩数据,数据来源为内存中的数据,压缩结果保存OutputStream输出流对象中。
  • ZipFile 解压缩ZIP文档,数据来源为压缩文档或InputStream对象,可将原始文件直接解压到磁盘中。
  • ZipFile::Builder 创建ZIP压缩数据,数据来源为要压缩的原始文件,压缩结果保存到OutputStream输出流对象中。