Not, yazarın okuyabildiği veya kullanamayacağını taklit etmek için bir aralık kullanıyorum. yazar Şu son satır
readStrem.pipe(transformBbuffer).pipe(writeStream);
aşağıdaki gibi okur yani
r.pipe(b).pipe(w);
istediğini düşünüyorum vb arabelleğe başlamak için devlet güncellerdi yanlış dönerse Sen yani istediğiniz bu herhangi bir şekilde yapabilirsiniz
Örnek kod, tüm verileri arabelleğe almak için yapabileceğimiz bazı değişiklikler var. Koddan sonra tarif edeceğim.
https://nodejs.org/api/stream.html#stream_class_stream_transform_1
Bu kod ... Eğer akışları hakkında bilmeniz gereken ve daha docs olan her şey, onlar daha tam örneklerle yapabileceğini düşünüyorum ama onlar olduğu gibi oldukça iyi.
var fs = require('fs');
var stream = require('stream')
const util = require('util');
//const StringDecoder = require('string_decoder').StringDecoder;
const Transform = require('stream').Transform;
var check_buff = 0;
var DRAIN_ME = 0;
var r = fs.createReadStream('file1.txt').setEncoding('utf8');
var w = fs.createWriteStream('file2.txt');
var BufferStream = function() {
stream.Transform.apply(this, arguments);
this.buffer = [];
};
util.inherits(BufferStream, stream.Transform);
var intId;
intId = setInterval(function(){
if(check_buff % 3 == 0) {
DRAIN_ME = 1;
return;
}
DRAIN_ME = 0;
},10);
BufferStream.prototype._transform = function (chunk, encoding, done) {
this.buffer.push(String(chunk));
while(DRAIN_ME > 0 && this.buffer.length > 0) {
this.push(this.buffer.shift());
}
console.log(chunk.length);
console.log(this.buffer.length);
done();
};
var b = new BufferStream();
b.on('end', function(chunk) {
clearInterval(intId);
});
r.pipe(b).pipe(w);
Ben dönüşümü uygulamak için kanonik yol arıyorum/boru üzerinde çağrı gelene kadar tüm veri arabelleği dere yoluyla.
bu oluşturmak test etmek için ... o alan verileri yani durur çünkü şu
BufferStream.prototype._transform = function (chunk, encoding, done) {
this.buffer.push(String(chunk));
console.log(chunk.length);
console.log(this.buffer.length);
done();
};
......
BufferStream.prototype._flush = function (cb) {
var len = this.buffer.length;
for (var i = 0; i < len; i++) {
this.push(this.buffer.shift());
};
cb();
};
Ayrıca yürürlükte yazılabilir akışı duraklar okunabilir akışı durdurabilir değişikliklerini yapın 100MB ya da daha fazla disk üzerinde oldukça büyük bir dosya ve bunu çalıştırın ...
var fs = require('fs');
var readableStream = fs.createReadStream('file1.txt');
var writableStream = fs.createWriteStream('file2.txt');
readableStream.setEncoding('utf8');
readableStream.on('data', function(chunk) {
var ready = 0;
readableStream.pause();
setInterval(function(){
if(ready == 0) {
//console.log('pausing');
readableStream.pause();
ready = 1;
}
else {
//console.log('resuming');
readableStream.resume();
ready = 0;
}
},100);
writableStream.write(chunk);
});
Hemen duraklatmanın nedeni Çünkü aralık 10ms
'u attığında dosya zaten yazılmış olabilir. Bunun varyasyonları var yani ...
var fs = require('fs');
var readableStream = fs.createReadStream('file1.txt');
var writableStream = fs.createWriteStream('file2.txt');
readableStream.setEncoding('utf8');
var ready = 0;
setInterval(function(){
if(ready == 0) {
//console.log('pausing');
readableStream.pause();
ready = 1;
}
else {
//console.log('resuming');
readableStream.resume();
ready = 0;
}
},100);
readableStream.on('data', function(chunk) {
writableStream.write(chunk);
readableStream.pause();
});
, burada kabul cevap gibi görünüyor ben http://stackoverflow.com/questions/20317759/implementing-a-buffered-transform-stream –