我使用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.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:无效的非字符串/缓冲区块]
答案 0 :(得分:5)
问题可能是您在内容完全写入磁盘之前删除了源文件。
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表示流已完成处理数据。
提取新文件时,你犯了两个错误,
要压缩内容,
var d = '';
fs.createReadStream(`${craneProjectDir}/tree`)
.pipe(zlib.createGunzip())
.on('data', function (data){
d += data.toString()
})
.on('end', function (){
console.log(d);
})
BTW,我怀疑你不需要这个临时文件;)
答案 1 :(得分:0)
我发现我可以使用readFile,并将其内容放入Buffer中,如下所示:
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();
});
});