2016-11-17 7 views
0

fs.createReadStreamfs.createWriteStreamに関して予期しない動作が発生しました。私は私が間違った仮定を行う場所を誰かが指摘することを願って:読み書き可能なストリーム予期しない動作

私はこの

let readableStream = fs.createReadStream('./lorem ipsum.doc'); 
let writableStream = fs.createWriteStream('./output'); 

なぜ、私はこの

のような書き込みストリームに読み出しストリームを送信する場合のような読み書き可能なストリームを作成します

Output file with discrepancy:私は、出力ファイルの不一致で終わる

let data, chunk; 
readableStream 
.on('readable',() => { 
    while ((chunk=stream.read()) !== null) { 
     data+=chunk; 
    } 
}) 
.on('end',()=>{ 
    writableStream.write(data) 
    console.log("done"); 
}); 

ながら私はこのようなストリーム場合:

let data, chunk; 
readableStream 
.on('readable',() => { 
    while ((chunk=stream.read()) !== null) { 
     writableStream.write(chunk) 
    } 
}) 
.on('end',()=>{ 
    console.log("done"); 
}); 

全てが微細であり、以下のように予想される:

Expected output

すなわち、バイト単位で追加のオーバーヘッドがある/最初の例で追加された?それはなぜ追加されますか?何がうまくいかない?

私に教えてくれてありがとう!


注:私は(私に正しい出力ファイルを与える)pipeを使用しての認識していますが、これらの例は、ちょうど私の理解のためのものです。

答えて

1

最初のデモでは、バイナリストリームを文字列に変換してスペースを無駄にする 'data + ='を使用しています。 2回目のデモを変換してみてください。 ===>

var s=chunk; 
writableStream.write(s); 

更新:ストリームバッファを組み合わせるための正しい方法は、あなたのコメントのようなものです:

var chunks = []; 
var size = 0; 
...on('data', function(chunk){ 
    chunks.push(chunk); 
    size += chunk.length; 
}) 
...on('end', function(){ 
    var buf = Buffer.concat(chunks, size); // use buf to write to writestream 
    var str = iconv.decode(buf, 'utf8'); // use str to console.log string, which supports all languages such as Asian 
}) 
+0

はい、あなたは正しいです。 'data = Buffer.from([]);'を実行し、 'data = Buffer.concat([data、chunk]);'を使うと、ファイルが正しく出力されます。私の愚かな、私は文字列型に変換していたことを認識していない。 –

+0

または実際には、そのJavaScriptは文字列型に変換していた... :) –

関連する問題