2017-03-15 301 views
0

我试图同步读取从节点的控制台参数,我设法做到以下几点:缓冲区充满了Unicode的零

var load = function() { 
    const BUFFER_LENGTH = 1024; 
    const stdin = fs.openSync('/dev/stdin', 'rs'); 
    const buffer = Buffer.alloc(BUFFER_LENGTH); 
    console.log('Provide parameter: '); 
    fs.readSync(stdin, buffer, 0, BUFFER_LENGTH); 
    fs.closeSync(stdin); 
    return buffer.toString().replace(/\n*/, ''); 
} 

它的工作原理,但这里有一个奇怪的事情:

var loadedValue = load(); 
console.log(loadedValue); // displays "a", if I typed "a", so the result is correct 
console.log({loadedValue}); // displays {a: 'a\n\u0000\u0000....'} 

当我将值包装在一个对象中时,剩余的BUFFER位显示在一个字符串中。这是为什么?我怎样才能摆脱它们?在创建对象之前对字符串进行regexp不起作用。

回答

1

Buffer.alloc(BUFFER_LENGTH)创建一个特定长度的缓冲区(在你的情况下为1024),并用NULL字符填充该缓冲区(如文档here所述)。

接下来,您从标准输入读取了一些(比如说2个)字节到该缓冲区,该字节用从标准输入读取的字符替换了前两个空字符。缓冲区的其余部分仍然由NULL组成。

如果您没有截断缓冲区到读取的字节数量,您的函数将返回一个长度为1024的缓冲区,其中大部分为NULL。由于这些不是可打印的,因此它们不会显示在第一个console.log()中,但它们仍然存在。

所以从标准输入看完之后,你应该截断缓冲区大小合适:

let bytesRead = fs.readSync(stdin, buffer, 0, BUFFER_LENGTH); 
buffer = buffer.slice(0, bytesRead);