Javascript 节点gzip将文件解压缩到变量中
我使用gzip压缩json字符串,然后将其保存到如下文件中:Javascript 节点gzip将文件解压缩到变量中,javascript,node.js,gzip,Javascript,Node.js,Gzip,我使用gzip压缩json字符串,然后将其保存到如下文件中: fs.writeFile(`${craneProjectDir}/tree.out`, JSON.stringify(workspaceTree), (err) => { var gzip = zlib.createGzip(); var inp = fs.createReadStream(`${craneProjectDir}/tree.out`); var out = fs.createWriteSt
fs.writeFile(`${craneProjectDir}/tree.out`, JSON.stringify(workspaceTree), (err) => {
var gzip = zlib.createGzip();
var inp = fs.createReadStream(`${craneProjectDir}/tree.out`);
var out = fs.createWriteStream(`${craneProjectDir}/tree`);
inp.pipe(gzip).pipe(out);
fs.unlinkSync(`${craneProjectDir}/tree.out`);
});
它似乎可以工作,因为它创建了文件,但我不确定,因为我无法将其读回变量。这是我尝试过的:
var treeStream = fs.createReadStream(`${craneProjectDir}/tree`);
zlib.unzip(treeStream, (err, buffer) => {
if(err){
connection.console.log((util.inspect(err, false, null)));
}
workspaceTree = JSON.parse(buffer.toString());
});
我得到以下错误:
[TypeError:无效的非字符串/缓冲区区块]
问题可能是您在将内容完全写入磁盘之前删除了源文件
fs.writeFile(`${craneProjectDir}/tree.out`, JSON.stringify(workspaceTree), (err) => {
var gzip = zlib.createGzip();
var inp = fs.createReadStream(`${craneProjectDir}/tree.out`);
var out = fs.createWriteStream(`${craneProjectDir}/tree`);
inp.pipe(gzip).pipe(out).on('close', function () {;
fs.unlinkSync(`${craneProjectDir}/tree.out`);
});
});
注意系紧,不要系紧。close表示底层文件描述符已关闭,end表示流已完成数据处理
提取新文件时,您犯了两个错误
- 您使用了zlib.unzip,但内容是gzip,因此必须使用gunzip方法之一
- 您使用了zlib.unzip,它需要一个缓冲区,但您向它发送了一个流
var d = '';
fs.createReadStream(`${craneProjectDir}/tree`)
.pipe(zlib.createGunzip())
.on('data', function (data){
d += data.toString()
})
.on('end', function (){
console.log(d);
})
顺便说一句,我想你不需要这个临时文件;) 我发现我可以使用readFile,并将其内容放入缓冲区,如下所示:
fs.readFile(`${craneProjectDir}/tree`, (err, data) => {
var treeStream = new Buffer(data);
zlib.unzip(treeStream, (err, buffer) => {
if (err) {
connection.console.log((util.inspect(err, false, null)));
}
workspaceTree = JSON.parse(buffer.toString());
notifyClientOfWorkComplete();
});
});
由于
fs
操作是异步的,因此可能是在您尝试读取文件之前,该文件尚未完成编写。是的,我发现您使用了混合流/缓冲区、gzip/unzip。我会更新我的答案。实际上我发现我可以使用fs.readFile
并将内容放入new Buffer()
当您使用gzip时,应该使用gunzip(zlib.gunzip(buf[,options],callback))。不知道为什么它与zlib.unzip一起工作。