2017-04-04 10 views
1

FS#createReadStreamメソッドを使用してファイルを読み込んでおり、#pipe()メソッドを使用して書き込み可能なストリームにパイプしています。このように:.pipe()メソッドを使用した後でReadStreamを閉じるべきでしょうか

const stream = fs.createReadStream(...); 
const transformedStream = imgStream.pipe(someTransformer).pipe(anotherTransfomer); 
// do something with transformedStream 

#createReadStream()方法のドキュメントでは、私はit hasautoCloseパラメータがtrueにデフォルトで設定されたことがわかりました。

、反対側から、私はこのin documentation of #pipe() methodが見つかりました:

一つの重要な注意点は、読み込み可能なストリーム処理中にエラー を発する場合は、書き込み可能な先が自動的に を閉じていないということです。エラーが発生した場合は、手動でメモリリークを防ぐために各ストリームを閉じることが必要です( )。全くのノードJSに

  1. 私は閉じてください読み書き可能なストリーム:

は、だから私は2つの質問がありますか? (手動でtry-finallyブロックを使用)。またはストリームが自動的に閉じられますか?

  • ストリームを閉じるにはどうすればいいですか?#pipe()メソッドを使用している場合にのみ、ストリームを閉じる必要がありますか?あなたは、あなたはそれを終了するunpipeを使用することができ、パイプ・イベントを使用している場合

  • 答えて

    3

    を(#pipe()ので、メモリリークになります)。

    以下は、pipe()およびunpipe()イベントの使用例です。

    const writer = getWritableStreamSomehow(); 
    const reader = getReadableStreamSomehow(); 
    writer.on('unpipe', (src) => { 
        console.error('Something has stopped piping into the writer.'); 
        assert.equal(src, reader); 
    }); 
    reader.pipe(writer); 
    reader.unpipe(writer); 
    

    stream.unpipe()メソッドは、目的地のセットから、この書き込み可能の除去、読み取り可能なストリーム上で呼び出されたときのNode.js documentationによれば、「unpipe」イベントが発せられます。

    は、特にあなたの質問に対処するために、ここでの私の考えは以下のとおりです。

    1)は、私は全くのノードJSで読み書き可能なストリームを閉じるべきでしょうか? (手動でtry-finallyブロックを使用)。またはストリームが自動的に閉鎖 ?

    2)ストリームを閉じるだけで、私が#pipe() メソッドを使用している場合にのみ、ストリームを閉じる必要がありますか? (#pipe()はメモリリークを引き起こす可能性があるため)

    pipe()を使用しているかどうかに関係なくストリームを終了する必要があります。 (また、pipe()のみを使用している場合、メモリリークの問題についてあなたのコメントに同意しません)

    また、従来のJavaScriptのtry()catch()finally()節でストリームを閉じることはできません。理由は、読み書きストリームが非同期に実行されているためです。代わりに、それらのために終了イベントを発行する必要があります。

    例:

    var readStream = getReadableStreamSomehow(); 
    readStream 
        .on('data', function (chunk) { 
         console.log(chunk); 
        }) 
        .on('end', function() { 
         console.log('All the data in the file has been read'); 
        }) 
        .on('close', function (err) { 
         console.log('Stream has been Closed'); 
        }); 
    

    あなたは、書き込み可能なストリームの同じイベントを発することができます。

    +0

    ありがとう、私は少し構造化されるために私の質問を編集しました。あなたは両方の質問に答えてください。 – MyTitle

    +0

    私の答えを編集しました。 – Benjamin

    関連する問題