• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 压缩与解压
2
3本文针对常见的几种压缩、解压场景,介绍相关函数的使用方法。
4
5## 接口说明
6
7以下是示例中使用的主要接口,更多接口及使用方式请见[接口文档](../../reference/apis-basic-services-kit/js-apis-zlib.md)。
8
9| 接口名                                                       | 接口描述                     |
10| ------------------------------------------------------------ | ---------------------------- |
11| compressFile(inFile: string, outFile: string, options: Options): Promise<void> | 压缩文件。               |
12| decompressFile(inFile: string, outFile: string, options?: Options): Promise<void> | 解压文件。               |
13| compress(dest: ArrayBuffer, source: ArrayBuffer, sourceLen?: number): Promise<ZipOutputInfo> | 将源缓冲区压缩到目标缓冲区。               |
14| compressBound(sourceLen: number): Promise<number> | 计算返回压缩大小的上限。              |
15| uncompress(dest:ArrayBuffer, source: ArrayBuffer, sourceLen?: number): Promise<ZipOutputInfo> | 将压缩后的数据解压缩为原始的未压缩形式。               |
16| deflate(strm: ZStream, flush: CompressFlushMode): Promise<ReturnStatus> | 压缩数据。               |
17| inflate(strm: ZStream, flush: CompressFlushMode): Promise<ReturnStatus> | 解压数据。|
18
19## 开发步骤
20
21### 环境准备
22
23在应用沙箱目录下创建一个测试文件data.txt,并写入测试数据。示例代码如下。
24
25   ```ts
26   import { fileIo as fs} from '@kit.CoreFileKit'
27   import { BusinessError, zlib } from '@kit.BasicServicesKit'
28
29   @Entry
30   @Component
31   struct Index {
32     @State dataSize: number = 0;
33
34     build() {
35       Row() {
36         Column() {
37           // 在应用沙箱目录下创建文件data.txt,并写入测试数据
38           Button('创建测试文件data.txt').onClick(() => {
39             let path = this.getUIContext()?.getHostContext()?.filesDir;
40             // 创建文件data.txt
41             let inFile = fs.openSync(path + '/data.txt', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
42             // 写入测试数据
43             for (let index = 0; index < 100; index++) {
44               fs.writeSync(inFile.fd, index + ': hello world, hello world, hello world, hello world, hello world.\n');
45             }
46             // 获取测试数据原始大小,并保存到dataSize中
47             let stat = fs.statSync(inFile.path);
48             this.dataSize = stat.size;
49             console.info('dataSize: ' + this.dataSize);
50             // 关闭文件
51             fs.closeSync(inFile);
52           })
53         }
54       }
55       .height('100%')
56       .width('100%')
57     }
58   }
59   ```
60
61### Zip文件的压缩与解压
62
63采用接口[zlib.compressFile()](../../reference/apis-basic-services-kit/js-apis-zlib.md#zlibcompressfile9-1)将文件data.txt压缩并归档到data.zip中,采用接口[zlib.decompressFile()](../../reference/apis-basic-services-kit/js-apis-zlib.md#zlibdecompressfile9-1)将data.zip解压到应用沙箱目录下,示例代码如下。
64
65   ```ts
66   import { fileIo as fs} from '@kit.CoreFileKit'
67   import { BusinessError, zlib } from '@kit.BasicServicesKit'
68
69   @Entry
70   @Component
71   struct Index {
72     build() {
73       Row() {
74         // 示例一:将测试文件data.txt压缩并归档到data.zip中。
75         Button('compressFile').onClick(() => {
76           let path = this.getUIContext()?.getHostContext()?.filesDir;
77           let inFile = path + '/data.txt';
78           let outFile = path + '/data.zip';
79           let options: zlib.Options = {};
80           zlib.compressFile(inFile, outFile, options).then((data: void) => {
81             console.info('compressFile success, data: ' + JSON.stringify(data));
82           }).catch((errData: BusinessError) => {
83             console.error(`compressFile errCode: ${errData.code}, message: ${errData.message}`);
84           })
85         })
86
87         // 示例二:将data.zip文件解压到应用沙箱目录下。
88         Button('decompressFile').onClick(() => {
89           let path = this.getUIContext()?.getHostContext()?.filesDir;
90           let inFile = path + '/data.zip';
91           let outFile = path;
92           let options: zlib.Options = {};
93           zlib.decompressFile(inFile, outFile, options).then((data: void) => {
94             console.info('decompressFile success, data: ' + JSON.stringify(data));
95           }).catch((errData: BusinessError) => {
96             console.error(`decompressFile errCode: ${errData.code}, message: ${errData.message}`);
97           })
98         })
99       }
100       .height('100%')
101       .width('100%')
102     }
103   }
104   ```
105
106### 已知大小缓冲区的压缩与解压
107
108针对一个已知大小的缓冲区中的数据,使用接口[compress()](../../reference/apis-basic-services-kit/js-apis-zlib.md#compress12)将其压缩到一个目的缓冲区中,使用接口[compressBound()](../../reference/apis-basic-services-kit/js-apis-zlib.md#compressbound12)计算压缩目的缓冲区大小的上限值,使用接口[uncompress()](../../reference/apis-basic-services-kit/js-apis-zlib.md#uncompress12)对存储压缩数据的缓冲区进行解压。由于解压时无法获取解压后原始数据的大小,为了确认解压后目的缓冲区的大小,需要在压缩前获取原始数据的大小并保存,示例代码如下。
109
110   ```ts
111   import { fileIo as fs} from '@kit.CoreFileKit'
112   import { BusinessError, zlib } from '@kit.BasicServicesKit'
113
114   @Entry
115   @Component
116   struct Index {
117     @State dataSize: number = 0;  //用于保存原始数据的大小
118
119     build() {
120       Row() {
121         // 示例一:读取data.txt文件内容并存入一个缓冲区,调用compress接口压缩缓冲区中的数据到目标缓冲区,并将目标缓冲区的内容写入文件data.bin
122         Button('compress buffer').onClick(() => {
123           let path = this.getUIContext()?.getHostContext()?.filesDir;
124           let inFile = fs.openSync(path + '/data.txt', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
125           let outFile = fs.openSync(path + '/data.bin', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
126           // 读取data.txt文件的内容,并存入缓冲区inBuf
127           let stat = fs.statSync(inFile.path);
128           let inBuf = new ArrayBuffer(stat.size);
129           let readLen = fs.readSync(inFile.fd, inBuf);
130           console.info(`original size: ${stat.size}, read len: ${readLen}`);
131           // 获取原始数据的大小,并保存
132           this.dataSize = stat.size;
133           // 创建一个压缩对象实例
134           let zip = zlib.createZipSync();
135           // 获取一个目标缓冲区的上限
136           zip.compressBound(stat.size).then((data) => {
137             console.info(`the max dest buf len is ${data}`);
138             // 目标缓冲区outBuf
139             let outBuf = new ArrayBuffer(data);
140             // 将inBuf中的数据压缩到outBuf中
141             zip.compress(outBuf, inBuf, readLen).then((zipOutInfo) => {
142               console.info(`compress success, status ${zipOutInfo.status}, destLen  ${zipOutInfo.destLen}`);
143               // 将outBuf中的数据写入到data.bin文件
144               let writeLen = fs.writeSync(outFile.fd, outBuf, { length: zipOutInfo.destLen });
145               console.info(`write destBuf to data.bin, writeLen ${writeLen}`);
146               // 关闭文件
147               fs.closeSync(inFile.fd);
148               fs.closeSync(outFile.fd);
149             }).catch((errData: BusinessError) => {
150               console.error(`errData is errCode:${errData.code}  message:${errData.message}`);
151             })
152           }).catch((errData: BusinessError) => {
153             console.error(`errData is errCode:${errData.code}  message:${errData.message}`);
154           })
155         })
156
157         // 示例二:读取data.bin文件中的压缩数据并存入一个缓冲区,调用uncompress接口将缓冲区中的数据解压到目标缓冲区,并将目标缓冲区的内容写入文件data.txt
158         Button('uncompress buffer').onClick(() => {
159           let path = this.getUIContext()?.getHostContext()?.filesDir;
160           let inFile = fs.openSync(path + '/data.bin', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
161           let outFile = fs.openSync(path + '/data.txt', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
162           // 读取data.bin文件中的压缩数据,并存入缓冲区inBuf
163           let stat = fs.statSync(inFile.path);
164           let inBuf = new ArrayBuffer(stat.size);
165           let readLen = fs.readSync(inFile.fd, inBuf);
166           console.info(`compressed data size: ${stat.size}, read len: ${readLen}`);
167           // 创建一个目标缓冲区,此处的dataSize是我们进行数据压缩前保存的数据的原始大小
168           let outBuf = new ArrayBuffer(this.dataSize);
169           console.info(`the dest buf size is ${this.dataSize}`);
170           // 创建一个压缩对象实例
171           let zip = zlib.createZipSync();
172           // 将inBuf中的数据解压缩outBuf中
173           zip.uncompress(outBuf, inBuf, readLen).then((zipOutInfo) => {
174             console.info(`uncompress success, status ${zipOutInfo.status}, destLen  ${zipOutInfo.destLen}`);
175             // 将outBuf中的数据写入到data.txt文件
176             let writeLen = fs.writeSync(outFile.fd, outBuf, { length: zipOutInfo.destLen });
177             console.info(`write destBuf to data.txt, writeLen ${writeLen}`);
178             // 关闭文件
179             fs.closeSync(inFile.fd);
180             fs.closeSync(outFile.fd);
181           }).catch((errData: BusinessError) => {
182             console.error(`errData is errCode:${errData.code}  message:${errData.message}`);
183           })
184         })
185       }
186       .height('100%')
187       .width('100%')
188     }
189   }
190   ```
191
192### 未知大小缓冲区的压缩与解压(zlib格式)
193
194针对一个未知大小的缓冲区中的数据,使用接口[deflate()](../../reference/apis-basic-services-kit/js-apis-zlib.md#deflate12)将从一个原始输入流中读取的数据进行压缩,使用接口[inflate()](../../reference/apis-basic-services-kit/js-apis-zlib.md#inflate12)将从一个压缩输入流中读取的数据进行解压,示例代码如下。
195
196   ```ts
197   import { fileIo as fs} from '@kit.CoreFileKit'
198   import { BusinessError, zlib } from '@kit.BasicServicesKit'
199
200   @Entry
201   @Component
202   struct Index {
203     build() {
204       Row() {
205         // 示例一:从文件中不断读取数据进行压缩
206         Button('deflateFile').onClick(() => {
207           let path = this.getUIContext()?.getHostContext()?.filesDir;
208           let inFile = fs.openSync(path + '/data.txt', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
209           let outFile = fs.openSync(path + '/data.bin', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
210           deflateFile(inFile, outFile).then(() => {
211             console.info('deflateFile success');
212             fs.closeSync(inFile.fd);
213             fs.closeSync(outFile.fd);
214           })
215         })
216
217         // 示例二:从文件中不断读取压缩数据进行解压
218         Button('inflateFile').onClick(() => {
219           let path = this.getUIContext()?.getHostContext()?.filesDir;
220           let inFile = fs.openSync(path + '/data.bin', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
221           let outFile = fs.openSync(path + '/data.txt', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
222           inflateFile(inFile, outFile).then(() => {
223             console.info('deflateFile success');
224             fs.closeSync(inFile.fd);
225             fs.closeSync(outFile.fd);
226           })
227         })
228       }
229       .height('100%')
230       .width('100%')
231     }
232   }
233
234   // 从一个文件中,不断的读入数据,进行压缩,并写入到另一个文件中
235   async function deflateFile(src: fs.File, dest: fs.File) {
236     let flush = zlib.CompressFlushMode.NO_FLUSH;
237     let strm: zlib.ZStream = {};  //初始化一个压缩流
238     const BUFLEN = 4096;
239     let inBuf = new ArrayBuffer(BUFLEN);  // 初始化一个输入缓冲区
240     let outBuf = new ArrayBuffer(BUFLEN); // 初始化一个输出缓冲区
241     // 创建一个压缩对象实例
242     let zip = zlib.createZipSync();
243     // 初始化流的状态
244     let initStatus = zip.deflateInit(strm, zlib.CompressLevel.COMPRESS_LEVEL_BEST_SPEED);
245     console.info('deflateInit ret: ' + (await initStatus).valueOf());
246     do {
247       // 从文件中读取数据到缓冲区
248       let readLen = fs.readSync(src.fd, inBuf);
249       console.info("readSync readLen: " + readLen);
250       flush = readLen == 0 ? zlib.CompressFlushMode.FINISH : zlib.CompressFlushMode.NO_FLUSH;
251       // 设置输入缓冲区
252       strm.availableIn = readLen;
253       strm.nextIn = inBuf;
254       do {
255         // 设置输出缓冲区
256         strm.availableOut = BUFLEN;
257         strm.nextOut = outBuf;
258         try {
259           // 压缩输入缓冲区中数据到输出缓冲区
260           let deflateStatus = zip.deflate(strm, flush);
261           console.info('deflate ret: ' + (await deflateStatus).valueOf());
262           // 更新流的状态
263           let innerStrm = zip.getZStream();
264           strm.availableIn = (await innerStrm).availableIn;
265           strm.nextIn = (await innerStrm).nextIn;
266           strm.availableOut = (await innerStrm).availableOut;
267           strm.nextOut = (await innerStrm).nextOut;
268           strm.totalIn = (await innerStrm).totalIn;
269           strm.totalOut = (await innerStrm).totalOut;
270
271           if (strm.availableOut != undefined) {
272             // 将已完成压缩的数据,写入到输出文件中
273             let have = BUFLEN - strm.availableOut;
274             let writeLen = fs.writeSync(dest.fd, outBuf, { length: have });
275             console.info(`writeSync writeLen: ${writeLen}`);
276           }
277         } catch (err) {
278           console.error('deflate err: ' + JSON.stringify(err));
279         }
280       } while (strm.availableOut == 0); // 循环压缩输入缓冲区中剩余的数据,直到全部完成压缩
281     } while (flush != zlib.CompressFlushMode.FINISH); // 循环从文件中读取数据,直到数据全部读取
282     // 释放资源
283     zip.deflateEnd(strm);
284   }
285
286   // 从一个文件中,不断的读入已压缩的数据,进行解压,并写入到另一个文件中
287   async function inflateFile(src: fs.File, dest: fs.File) {
288     let status: zlib.ReturnStatus = zlib.ReturnStatus.OK;
289     let strm: zlib.ZStream = {};  //初始化一个压缩流
290     const BUFLEN = 4096;
291     let inBuf = new ArrayBuffer(BUFLEN);  // 初始化一个输入缓冲区
292     let outBuf = new ArrayBuffer(BUFLEN); // 初始化一个输出缓冲区
293     // 创建一个压缩对象实例
294     let zip = zlib.createZipSync();
295     // 初始化流的状态
296     let initStatus = zip.inflateInit(strm);
297     console.info('inflateInit ret: ' + (await initStatus).valueOf());
298     do {
299       // 从文件中读取已压缩的数据到缓冲区
300       let readLen = fs.readSync(src.fd, inBuf);
301       console.info("readSync readLen: " + readLen);
302       if (readLen == 0) {
303         break;
304       }
305       // 设置输入缓冲区
306       strm.availableIn = readLen;
307       strm.nextIn = inBuf;
308       do {
309         // 设置输出缓冲区
310         strm.availableOut = BUFLEN;
311         strm.nextOut = outBuf;
312         try {
313           // 解压输入缓冲区中数据到输出缓冲区
314           let inflateStatus = zip.inflate(strm, zlib.CompressFlushMode.NO_FLUSH);
315           console.info('inflate ret: ' + (await inflateStatus).valueOf());
316           // 更新流的状态
317           let innerStrm = zip.getZStream();
318           strm.availableIn = (await innerStrm).availableIn;
319           strm.nextIn = (await innerStrm).nextIn;
320           strm.availableOut = (await innerStrm).availableOut;
321           strm.nextOut = (await innerStrm).nextOut;
322           strm.totalIn = (await innerStrm).totalIn;
323           strm.totalOut = (await innerStrm).totalOut;
324
325           if (strm.availableOut != undefined) {
326             // 将已完成解压的数据,写入到输出文件中
327             let have = BUFLEN - strm.availableOut;
328             let writeLen = fs.writeSync(dest.fd, outBuf, { length: have });
329             console.info(`writeSync writeLen: ${writeLen}`);
330           }
331         } catch (err) {
332           console.error('inflate err: ' + JSON.stringify(err));
333         }
334       } while (strm.availableOut == 0)  // 循环解压输入缓冲区中剩余的数据,直到全部完成解压
335     } while (status != zlib.ReturnStatus.STREAM_END.valueOf())  // 循环从文件中读取数据,直到数据全部读取
336     // 释放资源
337     zip.inflateEnd(strm);
338   }
339   ```
340
341### 未知大小缓冲区的压缩与解压(gzip格式)
342
343采用gzip格式,针对一个未知大小的缓冲区中的数据,使用接口[deflate()](../../reference/apis-basic-services-kit/js-apis-zlib.md#deflate12)将从一个原始输入流中读取的数据进行压缩,使用接口[inflate()](../../reference/apis-basic-services-kit/js-apis-zlib.md#inflate12)将从一个压缩输入流中读取的数据进行解压,示例代码如下。
344
345   ```ts
346   import { fileIo as fs} from '@kit.CoreFileKit'
347   import { BusinessError, zlib } from '@kit.BasicServicesKit'
348
349   @Entry
350   @Component
351   struct Index {
352     build() {
353       Row() {
354         // 示例一:从文件中不断读取数据进行压缩
355         Button('deflateGzipFile').onClick(() => {
356           let path = this.getUIContext()?.getHostContext()?.filesDir;
357           let inFile = fs.openSync(path + '/data.txt', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
358           let outFile = fs.openSync(path + '/data.gz', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
359           deflateGzipFile(inFile, outFile).then(() => {
360             console.info('deflateGzipFile success');
361             fs.closeSync(inFile.fd);
362             fs.closeSync(outFile.fd);
363           })
364         })
365
366         // 示例二:从文件中不断读取压缩数据进行解压
367         Button('inflateGzipFile').onClick(() => {
368           let path = this.getUIContext()?.getHostContext()?.filesDir;
369           let inFile = fs.openSync(path + '/data.gz', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
370           let outFile = fs.openSync(path + '/data.txt', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
371           inflateGzipFile(inFile, outFile).then(() => {
372             console.info('deflateGzipFile success');
373             fs.closeSync(inFile.fd);
374             fs.closeSync(outFile.fd);
375           })
376         })
377       }
378       .height('100%')
379       .width('100%')
380     }
381   }
382
383   // 从一个文件中,不断的读入数据,进行压缩,并写入到另一个文件中
384   async function deflateGzipFile(src: fs.File, dest: fs.File) {
385     let flush = zlib.CompressFlushMode.NO_FLUSH;
386     let strm: zlib.ZStream = {};  //初始化一个压缩流
387     const BUFLEN = 4096;
388     let inBuf = new ArrayBuffer(BUFLEN);  // 初始化一个输入缓冲区
389     let outBuf = new ArrayBuffer(BUFLEN); // 初始化一个输出缓冲区
390     // 创建一个压缩对象实例
391     let zip = zlib.createZipSync();
392     // 初始化流的状态,windowBits > 15时,启用gzip格式
393     let windowBits = 15 + 16;
394     let initStatus = zip.deflateInit2(strm, zlib.CompressLevel.COMPRESS_LEVEL_BEST_SPEED,
395       zlib.CompressMethod.DEFLATED, windowBits, zlib.MemLevel.MEM_LEVEL_DEFAULT,
396       zlib.CompressStrategy.COMPRESS_STRATEGY_DEFAULT_STRATEGY);
397     console.info('deflateInit2 ret: ' + (await initStatus).valueOf());
398     do {
399       // 从文件中读取数据到缓冲区
400       let readLen = fs.readSync(src.fd, inBuf);
401       console.info("readSync readLen: " + readLen);
402       flush = readLen == 0 ? zlib.CompressFlushMode.FINISH : zlib.CompressFlushMode.NO_FLUSH;
403       // 设置输入缓冲区
404       strm.availableIn = readLen;
405       strm.nextIn = inBuf;
406       do {
407         // 设置输出缓冲区
408         strm.availableOut = BUFLEN;
409         strm.nextOut = outBuf;
410         try {
411           // 压缩输入缓冲区中数据到输出缓冲区
412           let deflateStatus = zip.deflate(strm, flush);
413           console.info('deflate ret: ' + (await deflateStatus).valueOf());
414           // 更新流的状态
415           let innerStrm = zip.getZStream();
416           strm.availableIn = (await innerStrm).availableIn;
417           strm.nextIn = (await innerStrm).nextIn;
418           strm.availableOut = (await innerStrm).availableOut;
419           strm.nextOut = (await innerStrm).nextOut;
420           strm.totalIn = (await innerStrm).totalIn;
421           strm.totalOut = (await innerStrm).totalOut;
422
423           if (strm.availableOut != undefined) {
424             // 将已完成压缩的数据,写入到输出文件中
425             let have = BUFLEN - strm.availableOut;
426             let writeLen = fs.writeSync(dest.fd, outBuf, { length: have });
427             console.info(`writeSync writeLen: ${writeLen}`);
428           }
429         } catch (err) {
430           console.error('deflate err: ' + JSON.stringify(err));
431         }
432       } while (strm.availableOut == 0); // 循环压缩输入缓冲区中剩余的数据,直到全部完成压缩
433     } while (flush != zlib.CompressFlushMode.FINISH); // 循环从文件中读取数据,直到数据全部读取
434     // 释放资源
435     zip.deflateEnd(strm);
436   }
437
438   // 从一个文件中,不断的读入已压缩的数据,进行解压,并写入到另一个文件中
439   async function inflateGzipFile(src: fs.File, dest: fs.File) {
440     let status: zlib.ReturnStatus = zlib.ReturnStatus.OK;
441     let strm: zlib.ZStream = {};  //初始化一个压缩流
442     const BUFLEN = 4096;
443     let inBuf = new ArrayBuffer(BUFLEN);  // 初始化一个输入缓冲区
444     let outBuf = new ArrayBuffer(BUFLEN); // 初始化一个输出缓冲区
445     // 创建一个压缩对象实例
446     let zip = zlib.createZipSync();
447     // 初始化流的状态,windowBits > 15时,启用gzip格式
448     let windowBits = 15 + 16;
449     let initStatus = zip.inflateInit2(strm, windowBits);
450     console.info('inflateInit2 ret: ' + (await initStatus).valueOf());
451     do {
452       // 从文件中读取已压缩的数据到缓冲区
453       let readLen = fs.readSync(src.fd, inBuf);
454       console.info("readSync readLen: " + readLen);
455       if (readLen == 0) {
456         break;
457       }
458       // 设置输入缓冲区
459       strm.availableIn = readLen;
460       strm.nextIn = inBuf;
461       do {
462         // 设置输出缓冲区
463         strm.availableOut = BUFLEN;
464         strm.nextOut = outBuf;
465         try {
466           // 解压输入缓冲区中数据到输出缓冲区
467           let inflateStatus = zip.inflate(strm, zlib.CompressFlushMode.NO_FLUSH);
468           console.info('inflate ret: ' + (await inflateStatus).valueOf());
469           // 更新流的状态
470           let innerStrm = zip.getZStream();
471           strm.availableIn = (await innerStrm).availableIn;
472           strm.nextIn = (await innerStrm).nextIn;
473           strm.availableOut = (await innerStrm).availableOut;
474           strm.nextOut = (await innerStrm).nextOut;
475           strm.totalIn = (await innerStrm).totalIn;
476           strm.totalOut = (await innerStrm).totalOut;
477
478           if (strm.availableOut != undefined) {
479             // 将已完成解压的数据,写入到输出文件中
480             let have = BUFLEN - strm.availableOut;
481             let writeLen = fs.writeSync(dest.fd, outBuf, { length: have });
482             console.info(`writeSync writeLen: ${writeLen}`);
483           }
484         } catch (err) {
485           console.error('inflate err: ' + JSON.stringify(err));
486         }
487       } while (strm.availableOut == 0)  // 循环解压输入缓冲区中剩余的数据,直到全部完成解压
488     } while (status != zlib.ReturnStatus.STREAM_END.valueOf())  // 循环从文件中读取数据,直到数据全部读取
489     // 释放资源
490     zip.inflateEnd(strm);
491   }
492   ```
493
494## 常见问题
495
4961. 17800005 传入的数据错误
497
498   可能原因和处理步骤,请参见[错误码17800005](../../reference/apis-basic-services-kit/errorcode-zlib.md#17800005-传入的数据错误)。
499
5002. 17800007 传入的缓冲区错误
501
502   可能原因和处理步骤,请参见[错误码17800007](../../reference/apis-basic-services-kit/errorcode-zlib.md#17800007-传入的缓冲区错误)。