Asynchronous 如何学习nsIZipWriter和nsIZipReader?

Asynchronous 如何学习nsIZipWriter和nsIZipReader?,asynchronous,firefox-addon,zip,Asynchronous,Firefox Addon,Zip,我想知道如何使用JavaScript进行异步zip写入和读取。这里是一个zip读取的示例,zip写入的方式与此类似。该示例从/tmp/example.zip读取一个zip文件,并将第一个文件的内容打印到控制台 备注: 我正在使用for async I/O,我在上找到了对该API的引用。此接口提供了一个.asyncRead方法,该方法接受一个实现(和)的对象 我将这个示例的运行时间与进行了比较,发现读取阻塞读取所使用的时间要小得多(从RAM磁盘读取zip文件:从1-2ms到0.1-0.3ms)(

我想知道如何使用JavaScript进行异步zip写入和读取。

这里是一个zip读取的示例,zip写入的方式与此类似。该示例从
/tmp/example.zip
读取一个zip文件,并将第一个文件的内容打印到控制台

备注:

  • 我正在使用for async I/O,我在上找到了对该API的引用。此接口提供了一个
    .asyncRead
    方法,该方法接受一个实现(和)的对象
  • 我将这个示例的运行时间与进行了比较,发现读取阻塞读取所使用的时间要小得多(从RAM磁盘读取zip文件:从1-2ms到0.1-0.3ms)(使用
    console.time('foo');
    reusableStreamInstance.init
    调用和
    console.timeEnd之前进行测量)('foo');
    reusableStreamInstance.readBytes
    之后
  • 我使用
    .readBytes
    而不是
    .read
    来避免在文件包含空字节时截断数据
  • 我没有实现任何错误处理(zip不存在,zip不包含文件,zip/文件无法打开),但不管是否发生错误,我都会关闭zipreader
let{Cc:classes,Cu:utils,Ci:interfaces}=Components;
Cu.进口resource://gre/modules/FileUtils.jsm');
让pathToZip='/tmp/example.zip';
让nsiFileZip=newfileutils.File(pathToZip);
让streamListener={
缓冲区:空,
//NSI请求观察员
onStartRequest:函数(areRequest、aContext){
this.buffer=[];
},
//NSI流侦听器
ONDATA可提供:
函数(请求、aContext、aInputStream、aOffset、aCount){
让reusableStreamInstance=Cc['@mozilla.org/scriptableinputstream;1']
.createInstance(Ci.nsScriptableInputStream);
reusableStreamInstance.init(aInputStream);
let chunk=reusableStreamInstance.readBytes(aCount);
this.buffer.push(chunk);
},
//NSI请求观察员
onStopRequest:函数(aRequest、aContext、aStatusCode){
console.log('end',代码);
var data=this.buffer.join(“”);
控制台日志(数据);
}
};
let pump=Cc['@mozilla.org/network/input stream pump;1']
.createInstance(Ci.nsInputStreamPump);
让zr=Cc['@mozilla.org/libjar/zip阅读器;1']
.createInstance(Ci.nsIZipReader);
试一试{
zr.open(nsiFileZip);
//null=没有条目名称筛选器。
var条目=zr.findEntries(null);
while(entries.hasMore()){
var entryPointer=entries.getNext();
var entry=zr.getEntry(entryPointer);
如果(!entry.isDirectory){
var stream=zr.getInputStream(入口指针);
初始(流,0,-1,0,0,真);
异步读取(streamListener,null);
//对于演示,我们只需要一个文件,现在休息一下。
打破
}
}
}最后{
zr.close();
}

这真的很酷,非常感谢您的分享!感谢您在async/sync上进行的计时测试这真是太好了,感谢您所做的所有工作!!