3.5. Streams (Akışlar)

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.

Şimdi bir okuma işlemi yapalım.

Bir önceki çalıştırıldığında aşağıdaki gibi bir çıktı oluşur.

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

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ı:

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.