0

我正在使用该fs.createWriteStream(path[, options])函数创建一个写入流,该流拆分为文本行,每行以\n.

但是,当该过程结束时,如果我去检查流 leater 它似乎已损坏,显示一些(很少)损坏的行(如 0.05% 的行看起来像缓冲区溢出错误一样被部分切割)。

无论如何,如果我使用创建流时的选项将内部流缓冲区从 16k 增加到 4M highWaterMark,错误率似乎会改变但不会消失!)

4

1 回答 1

0

这是由于阅读错误,而不是写作错误。我正在做类似的事情:

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();
于 2015-04-01T09:33:15.660 回答