2017-03-15 124 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);