Nodejs Stream modülü, verilerin okunmasını, yazılmasını ve manipüle edilmesini kolaylaştırır Stream'ler, veri parçalarının programlar arasında taşınmasını ve veri işleme işlemini daha verimli ve hızlı hale getirir Nodejs'de üç ana stream türü vardır: Okuma, Yazma ve Çift Taraflı Okunabilir Stream, veri okuma işlemleri için kullanılırken, Yazılabilir Stream, veri yazma işlemleri için kullanılır Çift Taraflı Stream ise hem veri okuma hem de yazma işlemleri için kullanılır Nodejs'de Readable Stream'ler, dosya gibi kaynaklardan veri okumak için kullanılır Okuyabilen akışlar, veri yayınını hedefleyen kodda işlenebilecek küçük parçalara ayırır Stream'lerin dışa aktarılması ve içe aktarılması oldukça kolaydır ve Nodejs'in sağladığı yöntemlerden birkaçı vardır Stream'leri dışa aktarma, stream'i başka bir modüle veya uygulamaya aktarman

Node.js ile stream modülü kullanarak veri akışları oluşturup yönetebilirsiniz. Bu modül, verilerin okunmasını, yazılmasını ve manipüle edilmesini kolaylaştırır. Ancak, stream'ler yalnızca şu anda kullandığınız uygulamada değil, başka uygulamalarda veya modüllerde de kullanılabilir. Bu nedenle, stream'leri dışa aktarmanız ve içe aktarmanız gerekebilir.
Stream dışa aktarma, stream'inizi başka bir modüle veya uygulamaya aktarmanızı sağlar. Böylece, stream'i kullanan farklı uygulamalar veya modüller de oluşturabilirsiniz. Stream'leri dışa aktarma işlemi oldukça kolaydır ve Node.js'in sağladığı yöntemlerden birkaçı vardır. Bunlar arasında modül dışa aktarma, require () fonksiyonu kullanarak dışa aktarma ve nesne oluşturucuları gibi yöntemler vardır.
Stream içe aktarma, başka bir modülden veya uygulamadan veri akışı alma işlemidir. Bu işlem, stream'in sizin tarafınızdan oluşturulmadığı ve başka bir modülde veya uygulamada bulunduğu durumlarda kullanışlıdır. Stream içe aktarma işlemi de stream dışa aktarma işlemine benzer şekilde gerçekleştirilir. Modül içindeki stream'i require () fonksiyonu kullanarak veya nesne oluşturucuları aracılığıyla içe aktarmanız mümkündür.
Stream Nedir?
Node.js, veri işleme konusunda oldukça başarılı bir platformdur. Stream, Node.js'te veri işlemeyi kolaylaştıran bir modüldür. Stream'ler, veri parçalarını programlar arasında taşımayı mümkün kılar.
Node.js'de Stream'ler, tarayıcıda işlem yapabilmek için dizelerin çıktısını tarayıcıya göndermek yerine kullanılır. Bu sayede, programların daha verimli çalışması sağlanır. Stream'ler, "okunabilir", "yazılabilir" ve "çift taraflı" stream olarak üç ana kategoriye ayrılabilir.
- Okunabilir Stream: Veri okuma işlemleri için kullanılır.
- Yazılabilir Stream: Veri yazma işlemleri için kullanılır.
- Çift Taraflı Stream: Hem veri okuma hem de yazma işlemleri için kullanılır.
Stream'ler, veri işleme sürecinde arabelleğe alma işlemini de sağlar. Bu işlem, yüksek miktarda veriyle çalışma gerektiğinde oldukça önemlidir. Ayrıca, akışları bağlayarak veri akışını daha verimli bir şekilde yönetmek de mümkündür.
Node.js, stream modülü ile veri işleme işlemlerini kolaylaştırırken aynı zamanda daha verimli ve hızlı bir çalışma sağlar. Stream'ler, Node.js kodlarının daha okunaklı ve anlaşılır olmasına da yardımcı olur.
Stream Türleri
Node.js'de 3 ana stream türü vardır: Okuma, Yazma ve Çift Taraflı. İlk olarak, Okuma akışını ele alalım. Okuma akışı, veri okuma işlemleri için kullanılır. Veri kaynağından çıktı akışına veri kopyalamak için okuma akışı kullanılır. Bir örnek olarak, dosya okuma işlemi gerçekleştirmek istediğinizde, fs modülünü kullanarak bir okuma akışı oluşturmanız gerekir.
- Readable Stream, Veri kaynağından okuma yaparak bir karakter dizisi veya tampon verisi gibi çeşitli veri türlerini üreten cihaz dışı veri kaynakları için tasarlanmıştır.
İkinci stream türü ise Yazma akışıdır. Bu tür, veri yazma işlemleri için kullanılır. Örneğin, bir dosyaya veri yazmak istediğinizde, bir yazma akışı oluşturmanız gerekir. Bir yazma akışı, veri üreticisinden çıktı akışına veri kopyalamak için kullanılır.
- Writable Stream, cihaz dışı hedeflere veri yazmak için tasarlanmıştır. Özellikle, okunabilir bir kaynaktan gelen verileri alır ve bunları bir dosyaya, sokete, HTTP cevabına veya başka bir yazılabilir hedefe yazarken izin verir.
Son olarak, Çift Taraflı stream türü ise hem okuma hem de yazma işlemleri için kullanılır. Bu akışlar, bir veri parçasını almak ve çıktı akışına koymak için kullanılırken aynı zamanda veri kaynağından veri okuyabilirler. Bir örnek olarak, sıralı bir işlem için hem okuma hem de yazma akışı kullanmanız gerektiğinde, çift taraflı stream kullanabilirsiniz.
- Duplex Stream, hem okunabilir hem de yazılabilir bir kaynak içindir ve genellikle bir veri kanalı bağlantısı için kullanılır.
Böylece, Node.js stream modülü, veri işleme işlemlerini çok daha etkili ve verimli hale getirebilir. İlgili stream türünü bilmeniz, veriyi nasıl yöneteceğinizi daha iyi anlamak için önemlidir.
Readable Stream
Readable Stream Nedir?
Node.js'de Readable Stream'ler, dosya gibi kaynaklardan veri okumak için kullanılır. Okuyabilen akışlar veri parçalarını okuyarak, veri yayınını hedefleyen kodda işlenebilecek küçük parçalara ayırır.
Bir veri kaynağından veri okuma işlemi gerçekleştirmek için Readable Stream, kullanılabilecek iki temel yöntem sunar: "Data" event'i ve "ReadableStream.read()" methodu
Data Event'i: Bu metot, okuyabilir bir akış üzerinde data event'i tetikler. Veri her event tetiklendiğinde okunan veri miktarı ile birlikte geri döndürülecektir
"ReadableStream.read()" Methodu: Bu yöntem okuyabilir bir akıştan veri okur ve okunan verileri bir tampon veya dizisini döndürür.
Metot | Açıklama |
read() | Akıştan bir parça veri okur |
unshift() | Daha önce okunan verileri arabelleğe almak için kullanılır |
pipe() | Akışı bir başka akışa bağlar |
Bir Readable Stream, okuma işlemi sırasında tampon bellek ile dolabilir. Bu nedenle, belirli bir veri boyutu okunduktan sonra arabellek aşırı yüklemelerinden kaçınmak isteyen kullanıcılar için, okuma işlemini belirli bir miktarda data ile sınırlandırmak için "readable.pause()" ve "readable.resume()" yöntemleri kullanılabilir. Bu yöntemler, akış tamponunu kontrol eder ve gerekirse okumanın durdurulmasına veya yeniden başlatılmasına karar verir.
Bir Readable Stream kullanarak, HTTP taleplerinin okunması, dosyalardan veri okunması veya TCP soketlerinden veri okunması gibi farklı kullanım durumları için kullanılabilir. Kısacası, Node.js'deki çok çeşitli uygulamalar için kullanılabilir.
Buffering
Okuyabilir akışlar, veri parçalarını programlara taşımak için kullanılır. Ancak, bazı durumlarda verilerin tamamının hemen gönderilmesi mümkün olmayabilir. Bu durumda, akışın arabelleğe alınması gerekebilir.
Arabellek işlemi, verilerin küçük parçalarda okunmasını sağlar ve böylece programda açıklanmayan hataları önler. Bu işlem, verilerin daha yavaş bir hızda gönderilmesine neden olabilir, ancak daha güvenli bir yoldur.
Bu nedenle, okuyabilir akışlarda arabellekleme işlemi oldukça önemlidir. Arabellekleme işlemi, 'pause()' ve 'resume()' metodları kullanılarak kontrol edilebilir.
Fakat, arabelleklenen verilerin yetersiz veya çok büyük arabellekler oluşturmasını önlemek için 'highWaterMark' özelliği kullanılmalıdır. Bu özellik, maksimum arabellek boyutunu belirler ve verilerin akış hızını düşürmeden tampon boyutunu kontrol eder.
Bu şekilde, okuyabilir akışlar, veri akışını daha güvenli ve düzenli bir şekilde yürütebilir ve kaynaklarda meydana gelebilecek hataları önleyebilir.
Piping
Akışları bağlayarak veri parçalarını taşımanın daha verimli bir yolunu sağlayan piping, Node.js stream modülünün en güçlü özelliklerinden biridir. Piping, bir akıştan veri okur ve bunu başka bir akışa yazar. Bu işlem, verinin hafızada arabelleğe alınmasını ve bellek tüketimini artırmadan veri parçalarını istenilen hıza göre işlemeyi mümkün kılar.
Piping işlemi, pipe()
yöntemi ile gerçekleştirilir. Bu yöntem, okuyabilir akışın sonunu yazılabilir akışın başlangıcına bağlar. Böylece, veri okuma işlemi otomatik olarak başlar ve veri yazma işlemi de otomatik olarak tamamlanır. İşlem, hatasız bir şekilde gerçekleşene kadar sürekli olarak devam eder.
Örnek:
const fs = require('fs');const readStream = fs.createReadStream('example.txt');const writeStream = fs.createWriteStream('example2.txt');// Piping işlemireadStream.pipe(writeStream);
Bu örnekte, example.txt
dosyasından okunan veriler, example2.txt
dosyasına yazılır. pipe()
yöntemi sayesinde, veri yazma işlemi otomatik olarak gerçekleştirilir ve bellek tüketimi minimum düzeyde tutulur.
Writable Stream
Yazılabilir stream'ler, veri yazma işlemleri için kullanılan stream türüdür. Bu tür stream'ler; dosyalara, ağ bağlantılarına, HTTP yanıtlarına ve daha birçok yere yazma işlemi gerçekleştirmek için kullanılır. Yazılabilir stream'lerin kullanımı oldukça kolaydır ve birçok işlemde kullanılabilirler.
Yazılabilir stream'leri kullanmak için, öncelikle bir yazılabilir stream oluşturmalısınız. Oluşturduğunuz stream'e veri yazmak için write() fonksiyonunu kullanarak veriyi göndermeniz yeterlidir. Bunun yanı sıra, yazılabilir stream'lerde çok sayıda özellik ve metod bulunur. Özellikle end() metodu, işlem bittiğinde stream'ı kapatarak veri kaybetme riskini azaltır.
Eğer birden fazla stream oluşturmak istiyorsanız, pipe() metodunu kullanarak stream'leri bağlayabilirsiniz. Bu sayede, veri parçaları daha az bellek kullanarak daha verimli bir şekilde taşınabilir.
Aşağıdaki örnek, bir dosyaya yazılabilir stream oluşturma işleminin nasıl yapıldığını göstermektedir:
Kod | Açıklama |
---|---|
const fs = require('fs');const writeStream = fs.createWriteStream('dosya.txt');writeStream.write('Merhaba Dünya!');writeStream.end(); | Dosyaya bir stream oluşturma ve veri yazma işlemi gerçekleştirme örneği |
Yukarıdaki örnekte, dosya.txt dosyasına bir yazılabilir stream oluşturulmuş ve "Merhaba Dünya!" yazısı dosyaya yazılmıştır.
Writable Stream Özellikleri
Yazılabilir stream'lerin temel özellikleri aşağıdaki gibidir:
- write(): Veri yazmak için kullanılır.
- end(): Veri akışını sonlandırmak için kullanılır.
- cork(): Akışın arabelleğe alınmasını sağlar.
- uncork(): Akışın arabelleğe alınmasını durdurur ve yazdırır.
Yazılabilir stream'ler, bağlanabilir veya bağlantısız çalışabilir. Bağlanabilir olanlar, bir Veri Akışı ile ilişkilidir ve verileri bu akışa yazma izni verir. Bağlantısız Yazılabilir Stream'ler, dosyaya veya ağ soketi bağlantısına veri yazmak için kullanılır.
Duplex Stream
Node.js stream modülü, veri akışlarını yönetmek için oldukça kullanışlıdır. Stream'ler, veri akışını okumak, yazmak veya hem okumak hem de yazmak için kullanılabilir. Duplex stream'ler, iki yönlü veri akışlarıdır ve hem okuma hem de yazma işlemleri için kullanılır.
Duplex stream'ler, aynı anda hem veri alıp hem de veri gönderebilirler. Örneğin, bir TCP soketi hem kullanıcı tarafından gönderilen veriyi alır hem de sunucu tarafından gönderilen veriyi görüntüler. Bunun yanı sıra, çeşitli sistematik testlerde de oldukça kullanışlıdır.
Duplex stream'leri oluşturmak oldukça kolaydır ve ayrıca okuma ve yazma akışlarının uygun şekilde yapılandırılması için birçok seçenek sunarlar. İki yönlü akışların kullanım örnekleri arasında, ses akışı veya video akışının işlenmesi, veri tabanı yönetimi, ağ yönetimi vb. yer alır. Duplex stream'ler, programlama dünyasında oldukça önemli ve yaygın bir araçtır.
Stream Dışa Aktarma
Stream'lerle çalışma, birden fazla modül veya uygulama içindeki verilerin aktarımını sağlayarak oldukça yararlı hale gelebilir. Stream'ler oluşturulduktan sonra bir uygulamanın dışındaki bir modüle veya başka bir uygulamaya aktarılabilir.
Örneğin, bir dosyadan verileri okuduğunuz ve bunları bir veritabanına yazdığınız bir durumda stream'leri kullanabilirsiniz. Dosyadaki verileri okumak için bir okuyucu (readable) stream oluşturun ve daha sonra verileri yazmak için bir yazıcı (writable) stream oluşturun. Bu stream'leri tıpkı bir boru gibi birleştirerek birbirine bağlayabilirsiniz. Bu, verileri okuyucu stream'den yazıcının stream'ine taşırken aynı zamanda bellekte büyük bir alan kaplamadan yapılabilir.
Dosya Okuyucu Stream'den Veri Aktarma | ||
---|---|---|
|
Yukarıdaki örnek kodda, fs (file system) modülü Node.js tarafından sağlanan bir modüldür. createReadStream() fonksiyonu oluşturduğumuz okuyucu stream'ini ornekDosya.txt dosyasından okur ve pipe() yöntemiyle bu verileri STDOUT'a (yani konsola) yazar.
Bu, dışa aktarmanın en temel örneğidir ve bu yönteme göre oluşturduğunuz stream'leri başka uygulamalara veya modüllere de aktarabilirsiniz.
Stream İçe Aktarma
Stream içe aktarma işlemi, dışa aktarma işlemine benzer şekilde gerçekleştirilir. Burada yapmanız gereken, veri sağlayıcısı olarak stream kullanmak ve veriyi istediğiniz şekilde işlemek için uygun bir yöntem seçmektir.
Bu yöntemler arasında fs.createReadStream() ve request() yer almaktadır. fs.createReadStream() yöntemi, dosyayı okuma modunda açar ve verileri akıllı bir şekilde işlemek için uygun bir şekilde akış yapısını oluşturur. Öte yandan, request() yöntemi, veriyi harici bir kaynaktan çekmek için kullanılır ve bu verileri stream olarak alır ve işlemek için uygun bir şekilde kullanabilmenizi sağlar.
Ayrıca, stream'in ek özellikleri de içe aktarma işlemini daha esnek ve kullanışlı hale getirir. Örneğin, writable.on('finish', callback) yöntemi, akışın yazılması tamamlandığında bir geri arama işlevi çalıştırır.
Dışa Aktarma | İçe Aktarma |
---|---|
fs.createReadStream() | fs.createWriteStream() |
request() | writable.on('finish', callback) |
Stream içe aktarma kullanımının en büyük avantajlarından biri, modüller arasındaki iletişimi kolaylaştırmasıdır. Akış yapıları, verileri daha verimli ve düzgün bir şekilde işlemek için tasarlanmıştır ve bu, modüller arasındaki veri aktarımının daha hızlı ve daha tutarlı hale gelmesini sağlar.
- Stream içe aktarma işlemi, stream dışa aktarma işlemi kadar önemlidir.
- fs.createReadStream() ve request() gibi yöntemler akış yapısını oluşturmak ve veri akışını işlemek için kullanılabilir.
- Stream içe aktarma işlemi, modüller arasındaki veri aktarımını daha hızlı ve daha tutarlı hale getirir.