Nodejs Streams

Yasin DALKILIÇ
3 min readMay 7, 2021

--

Nodejs File Stream

Herkese merhabalar bu yazımızda sizlerle beraber nodejs stream konusuna değinmeye çalısıyor olacağız.Öncelikle nedir bu stream diye soracak olursanız, strem yapıları bizim bir veriyi okurken,yazarken yahut bir yere gönderirken ilgili veriyi bütün bir şekilde değil parça parça aktarmamızı sağlayan yapılardır. Örneğin 10mb bir text dosyamızın oldugunu düşünelim bir istek geldigi zaman tek seferde 10m dosyayı okumak ram’i yoracaktır ve isteğin bir değil birden fazla oldugunu düşünürsek örneğin 100 istek 100*10 mb şeklinde oldugunu düşünürsek ortaya biraz kaos çıkabilir. İşte bu gibi işlemler için veriyi buffer şeklinde okuyup okundukça göndermek isteyebiliriz, okuduğumuz verileri client tarafına bir socket ile beraber gönderebilir yada çeşitli işlemler yapabiliriz. Şimdi bir örnek yaparak işe koyulalım.

Proje Oluşturma

npm init -y

Yapılandırma;

Projemizi oluşturduktan sonra aynı dizin içerisinde app.js dosyamızı oluşturuyoruz.Daha sonra aynı dizin içerisinde test.txt dosyamızı oluşturup içerisine örnekte 18mb olacak şekilde dummy string ile dolduruyorum. Siz istediğiniz boyutta yapabilirsiniz.

const fs = require('fs')const stream = fs.createReadStream("test.txt")
stream.on('data', (chunk) => {
console.log('okunan byte', chunk.length)
}
)
stream.on('end', () => {
console.log('veri okuma işlemi bitti')
})

öncelikle readable bir stream oluşturdum ve ilgili dosya okunurken event emitter kullandığı için data içerisinde okudugu buffer lengthlerini alarak kaç o an okunan değeri byte olarak görebildim. Peki bu ne böyle buffer yazıyor benim verilerim nerede diyecek olursanız eğer.

const fs = require('fs')const stream = fs.createReadStream("test.txt")
stream.on('data', (chunk) => {
console.log('okunan byte', chunk.toString())
}
)
stream.on('end', () => {
console.log('veri okuma işlemi bitti')
})

ilgili buffer string’e çevirerek metinlerimizi görebiliriz. Tam bu noktada veri okunurken örnek olması açısından okunan her veriyi socket ile istemciye gönderip ekrana basabiliriz.

Şimdi buraya kadar verimizi okuduk fakat verinin yüzde kaçını okuduk ki ? Diye soru sordugumuzda ise aşağıdaki gibi küçük bir işlem yapıyoruz.

const fs = require('fs')const stream = fs.createReadStream("test.txt")
fs.stat("test.txt", (err, data) => {
console.log('size', data.size)
const size = data.size;
let chunkSize = 0;
stream.on('data', (chunk) => {
//console.log('okunan byte', chunk.length)
//console.log('chunk', chunk.toString())
chunkSize += chunk.length;
console.log('percent', Math.round(chunkSize * 100 / size))
})})
stream.on('end', () => {
console.log('veri okuma işlemi bitti')
})

file system modülü üzerinden okumak istediğim dosyanın boyutunu ele alarak , her okunan veriyi (byte cinsinden) toplayıp file total boyutuna oranladığımda yüzde kaçının okunmuş olduğu bilgisine erişebiliriz.

Peki iyi güzel hoş verileri okuduk peki ya yazma işlemi nasıl olacak diyorsak bununda cevabı çok basit.

const fs = require('fs')const stream = fs.createReadStream("test.txt")
const wstream = fs.createWriteStream("test2.txt")
fs.stat("test.txt", (err, data) => {
console.log('size', data.size)
const size = data.size;
let chunkSize = 0;
stream.on('data', (chunk) => {
//console.log('okunan byte', chunk.length)
//console.log('chunk', chunk.toString())
chunkSize += chunk.length;
console.log('percent', Math.round(chunkSize * 100 / size))
wstream.write(chunk)
})})
stream.on('end', () => {
console.log('veri okuma işlemi bitti')
})

yazılabilir bir stream oluşturduktan sonra test dosyası okunurken bir yandan da okunan her byte farklı bir text dosyasına aktırabilir.

Ve aynı şekilde writestream.write demek yerine pipe ile de bu işlemi gerçekleştirebiliriz.

pipe bizden bir kaynak ve birde writeableStream olarak hedef ister. Biz bu değere sahip oldugumuz için aşağıdaki gibi de ilerleyebiliriz.

const fs = require('fs')const stream = fs.createReadStream("test.txt")
const wstream = fs.createWriteStream("test2.txt")
fs.stat("test.txt", (err, data) => {
console.log('size', data.size)
const size = data.size;
let chunkSize = 0;
stream.on('data', (chunk) => {
//console.log('okunan byte', chunk.length)
//console.log('chunk', chunk.toString())
chunkSize += chunk.length;
console.log('percent', Math.round(chunkSize * 100 / size))
//wstream.write(chunk)
})})
stream.pipe(wstream)wstream.on("finish", () => {
console.log(`yazma bitti`)
})
stream.on('end', () => {
console.log('veri okuma işlemi bitti')
})

Herkese İyi Çalışmalar Dilerim.

--

--

Yasin DALKILIÇ

Hi, My name is Yasin I am a Software Developer, I love so much researching and development 😊 Here is my youtube channel @webciyasin