Stream API ve Veri İşleme

  • 5
  • (1)
  • (5)
  • 26 Oca 2025

Stream API, Node.js'in yüksek miktarda veriyi etkili bir şekilde işlemesini sağlayan güçlü bir araçtır. Büyük dosyaları okuma, yazma ve dönüştürme gibi işlemler, Stream API sayesinde bellek kullanımını optimize ederek gerçekleştirilir. Bu yazıda, Stream API'nin temel kavramlarını ve pratik kullanım örneklerini inceleyeceğiz.


Stream Nedir?

Stream, bir veri akışını temsil eden bir soyutlamadır. Node.js'te stream'ler, veriyi parça parça işlemeye olanak tanır. Bu sayede büyük miktarda veri bellekte tamamen yüklenmeden işlenebilir.

Stream Türleri

Readable Streams (Okunabilir Akışlar): Veri kaynağından okuma işlemi yapılır (örneğin, dosyadan okuma).

Writable Streams (Yazılabilir Akışlar): Veriyi bir hedefe yazma işlemi yapılır (örneğin, dosyaya yazma).

Duplex Streams (Çift Yönlü Akışlar): Hem okunabilir hem yazılabilir akışlardır (örneğin, TCP soketleri).

Transform Streams (Dönüştürülebilir Akışlar): Veriyi okurken dönüştürme işlemi yapılır (örneğin, sıkıştırma veya şifreleme).


Stream API Kullanımı

1. Okunabilir Akış (Readable Stream)

Bir dosyayı okunabilir akış olarak işlemek için aşağıdaki örneği inceleyebilirsiniz:


const fs = require('fs');

const okunabilirAkis = fs.createReadStream('ornek.txt', {
    encoding: 'utf8',
    highWaterMark: 16 // Her seferde 16 byte okur
});

okunabilirAkis.on('data', (chunk) => {
    console.log('Parça alındı:', chunk);
});

okunabilirAkis.on('end', () => {
    console.log('Dosya okuma tamamlandı');
});

okunabilirAkis.on('error', (err) => {
    console.error('Hata oluştu:', err);
});

Çıktı:

Parça alındı: İlk 16 byte'lık veri
 Parça alındı: İkinci 16 byte'lık veri
 ...
 Dosya okuma tamamlandı

2. Yazılabilir Akış (Writable Stream)

Bir dosyaya yazma işlemi yapmak için yazılabilir akış kullanılabilir:


const fs = require('fs');

const yazilabilirAkis = fs.createWriteStream('cikti.txt');

yazilabilirAkis.write('Merhaba, Stream API!
');
yazilabilirAkis.write('Node.js ile veri işleme çok kolay.
');
yazilabilirAkis.end('Akış sona erdi.
');

yazilabilirAkis.on('finish', () => {
    console.log('Dosya yazma tamamlandı');
});

yazilabilirAkis.on('error', (err) => {
    console.error('Hata oluştu:', err);
});

Çıktı:

Dosya yazma tamamlandı

3. Okuma ve Yazma Akışını Birleştirme (Pipe)

Okuma ve yazma akışlarını birleştirerek bir dosyayı başka bir dosyaya kopyalayabilirsiniz:


const fs = require('fs');

const okunabilirAkis = fs.createReadStream('ornek.txt');
const yazilabilirAkis = fs.createWriteStream('kopya.txt');

okunabilirAkis.pipe(yazilabilirAkis);

yazilabilirAkis.on('finish', () => {
    console.log('Dosya başarıyla kopyalandı');
});

Çıktı:

Dosya başarıyla kopyalandı

4. Dönüştürülebilir Akış (Transform Stream)

Veriyi dönüştürmek için Transform sınıfını kullanabilirsiniz. Örneğin, bir metni büyük harflere dönüştüren bir akış:


const { Transform } = require('stream');

const buyukHarfAkisi = new Transform({
    transform(chunk, encoding, callback) {
        this.push(chunk.toString().toUpperCase());
        callback();
    }
});

process.stdin.pipe(buyukHarfAkisi).pipe(process.stdout);

Terminalde çalıştırın ve metin girin. Çıktı büyük harfli olarak görüntülenecektir.


Büyük Dosya İşleme

Stream API, büyük dosyaları işlemede oldukça etkilidir. Örneğin, bir log dosyasını satır satır işlemek için:


const fs = require('fs');
const readline = require('readline');

const dosyaAkisi = fs.createReadStream('log.txt');

const satirOku = readline.createInterface({
    input: dosyaAkisi,
    crlfDelay: Infinity
});

satirOku.on('line', (line) => {
    console.log('Log satırı:', line);
});

satirOku.on('close', () => {
    console.log('Tüm satırlar işlendi');
});

Çıktı:

Log satırı: [INFO] Sunucu başlatıldı
 Log satırı: [ERROR] Bağlantı hatası
 ...
 Tüm satırlar işlendi

Stream API, Node.js'in büyük miktarda veriyi düşük bellek kullanımıyla işlemesine olanak tanır. Okunabilir, yazılabilir, dönüştürülebilir ve çift yönlü akışlar sayesinde dosya işlemleri, veri dönüşümleri ve diğer I/O işlemleri verimli bir şekilde gerçekleştirilir. Projelerinizde Stream API kullanarak performans ve verimlilik sağlayabilirsiniz.

Paylaşın
Etiket Bulutu