我正在使用该fs.createWriteStream(path[, options])
函数创建一个写入流,该流拆分为文本行,每行以\n
.
但是,当该过程结束时,如果我去检查流 leater 它似乎已损坏,显示一些(很少)损坏的行(如 0.05% 的行看起来像缓冲区溢出错误一样被部分切割)。
无论如何,如果我使用创建流时的选项将内部流缓冲区从 16k 增加到 4M highWaterMark
,错误率似乎会改变但不会消失!)
我正在使用该fs.createWriteStream(path[, options])
函数创建一个写入流,该流拆分为文本行,每行以\n
.
但是,当该过程结束时,如果我去检查流 leater 它似乎已损坏,显示一些(很少)损坏的行(如 0.05% 的行看起来像缓冲区溢出错误一样被部分切割)。
无论如何,如果我使用创建流时的选项将内部流缓冲区从 16k 增加到 4M highWaterMark
,错误率似乎会改变但不会消失!)
这是由于阅读错误,而不是写作错误。我正在做类似的事情:
var lines=[],
line='',
buf=new Buffer(8192);
while ((fs.readSync(fd,buf,0,buf.length))!=0) {
lines = buf.toString().split("\n");
lines[0]=line+lines[0];
line=lines.pop();
但是这种你在网上到处都能找到的方法真的是错误的!
使用buf.toString(null, 0 ,read_len)将其转换为字符串时,您必须检查实际缓冲区长度!
var lines=[],
line='',
buf=new Buffer(8192),
read_len;
while ((read_len=fs.readSync(fd,buf,0,buf.length))!=0) {
lines = buf.toString(null, 0 ,read_len).split("\n");
lines[0]=line+lines[0];
line=lines.pop();