Streams, bir kaynaktaki verileri sürekli bir biçimde okumanıza veya bir hedefe veri yazmanıza izin veren nesnelerdir. Node.js’de dört akış türü vardır:
- Okunabilir – Okuma işlemi için kullanılan stream.
- Yazılabilir – Yazma işlemi için kullanılan stream.
- Dubleks – Hem okuma hem de yazma işlemi için kullanılabilen stream.
- Transform – Çıktının girdiye göre hesaplandığı dubleks stream tipi.
Her stream türü bir EventEmitter örneğidir ve farklı zamanlarda farklı olaylar atar. Örneğin, yaygın olarak kullanılan bazı olaylar şunlardır –
- data – Okunacak veriler olduğunda bu etkinlik tetiklenir.
- end – Okunacak başka veri olmadığında bu olay tetiklenir.
- error – Veri alıyorken veya veri yazarken herhangi bir hata oluştuğunda bu olay tetiklenir.
- finish – Bu olay, tüm veriler temel alınan sisteme boşaltıldığında tetiklenir.
Şimdi stream ile ilgili metotları bir bakalım.
Stream Okuma
Aşağıdaki gibi bir metin.txt dosyamız olsun.
1 2 |
Merhaba Node.js Dunyasi Ornek bir text dosya. |
Şimdi bir okuma işlemi yapalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
var fs = require("fs"); var data = ''; // Okuma icin bir stream olustur var readerStream = fs.createReadStream('input.txt'); // utf8 olarak karakter encoding ayarla readerStream.setEncoding('UTF8'); // Stream olayini yönet --> data, end, ve error readerStream.on('data', function(chunk) { data += chunk; }); //Stream olayı bitince olusan data'yi console'a yazdir readerStream.on('end',function(){ console.log(data); }); //hata olursa yazdir readerStream.on('error', function(err){ console.log(err.stack); }); //Program sonu console.log("Program Bitti"); |
Bir önceki çalıştırıldığında aşağıdaki gibi bir çıktı oluşur.
1 2 3 |
Program bitti. Merhaba Node.js Dunyasi Ornek bir text dosya. |
Asenkron bir çalışma olduğunu çıktıdan anlayabilirsiniz. readerStream.on(‘data’… veriyi teker teker alıp data değişkeninde biriktirir. readerStream.on(‘end’ olayı olduğunda sonuç console’a yazılır. Ancak bu kodlar asenkron çalıştığı için arka planda işlem olurken “Program bitti” çıktısı console ekranına ilk olarak yazar.
Stream Yazma
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
var fs = require("fs"); var data = 'Merhaba Node.js'; // yazilabilir bir stream olustur var writerStream = fs.createWriteStream('output.txt'); // Veriyi utf8 formatinda yaz. writerStream.write(data,'UTF8'); // Dosya sonunu isaretle writerStream.end(); // Stream olaylarını yonet --> finish ve error writerStream.on('finish', function() { console.log("Yazma bitti."); }); writerStream.on('error', function(err){ console.log(err.stack); }); console.log("Program Bitti"); |
Eşzamasız (Asenkron) yapı burada da geçerlidir. Yazma işlemi bittiğinde writerStream.on(‘finish’ olayının fonksiyonu çalışır. Eğer hata olursa writerStream.on(‘error’ olayının fonksiyonu çalışır. Console çıktısı:
1 2 |
Program Bitti Yazma bitti. |
Stream Piping
Eşzamansız programlamanın en kötü tarafı işlemlerin birbirini beklemeden çalışmasıdır. Eğer birinci stream çıktısı diğer ikinci bir stream’in girdisi ise problem oluşabilir. İkinci stream çalışmaya kalkar ve birinci stream daha işini bitirmediyse problem büyüktür. İşte piping mekanizması sayesinde bir stream çıktısını başka bir stream girişi olarak sağlayabiliriz. Bu mekanizma akıştan veri alıp o akışın çıktısını başka bir akışa geçirmek için kullanılır.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
var fs = require("fs"); // Bir okuma stream olustur var readerStream = fs.createReadStream('input.txt'); // Yazilabilir bir stream olustur var writerStream = fs.createWriteStream('output.txt'); // Okuma ve yazma islemlerini bagla // input.txt oku ve verileri output.txt'a yaz readerStream.pipe(writerStream); console.log("Program Bitti"); |