Node.js Akışları (Streams) ile Dosya Yönetimi 💾
Bu rehberde, Node.js akış sistemini (Streams) kullanarak dosyalarla nasıl verimli çalışabileceğinizi öğreneceksiniz.
Belleği şişirmeden dosya okuyacak, yazacak, kopyalayacak ve hatta içeriği ters çevireceksiniz.
Yani kısaca, “fs.createReadStream”, “pipe()” ve “Transform()” ustası olacağız. 😎
🚀 Bu Rehberde Öğrenecekleriniz
- Akış (Stream) kavramını ve avantajlarını
- Dosya okuma:
fs.createReadStream() - Dosyaya yazma:
fs.createWriteStream() - Dosya kopyalama:
pipe() - Veri dönüştürme:
Transform()sınıfı - Komut satırı tabanlı mini bir CLI aracı
💡 Akış (Stream) Nedir ve Neden Kullanılır?
Akış (stream), verinin tek seferde değil parça parça işlenmesini sağlar.
Böylece gigabaytlık dosyaları bile belleğe yüklemeden işleyebilirsiniz.
Avantajlar:
- Bellek Verimliliği: Veri “chunk” (parça) bazlı işlendiği için RAM tasarrufu sağlar.
- Zaman Verimliliği: Verinin tamamı yüklenmeden işlem başlar.
| Akış Türü | Açıklama |
|---|---|
| Readable | Verinin okunduğu kaynak (fs.createReadStream). |
| Writable | Verinin yazıldığı hedef (fs.createWriteStream). |
| Duplex | Hem okuma hem yazma yapabilen akış. |
| Transform | Veriyi işleyip dönüştüren çift yönlü akış. |
⚙️ 1. Komut Satırı Programı İskeleti
İlk adımda CLI yapısını kuralım.
mkdir rabisu-streams && cd rabisu-streams
nano cli-araci.js
chmod +x cli-araci.js
#!/usr/bin/env node
const fs = require('fs');
const readline = require('readline');
const stream = require('stream');
const args = process.argv;
const commands = ['oku', 'yaz', 'kopyala', 'terscevir'];
Bu iskelet, CLI komutlarını “oku”, “yaz”, “kopyala” ve “terscevir” olarak tanımlar.
📖 2. Dosya Okuma — createReadStream()
function oku(filePath) {
const readableStream = fs.createReadStream(filePath, 'utf8');
readableStream.on('data', chunk => console.log(chunk));
readableStream.on('error', err => console.error(`Hata: ${err.message}`));
}
Bu fonksiyon dosyayı parça parça okur ve her “chunk”’ı terminale yazar.
./cli-araci.js oku veri.txt
✍️ 3. Dosyaya Yazma — createWriteStream()
function yaz(filePath) {
const writableStream = fs.createWriteStream(filePath);
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
prompt: 'Cümle gir (bitirmek için exit): '
});
rl.prompt();
rl.on('line', line => {
if (line.trim() === 'exit') rl.close();
else { writableStream.write(line + '\n'); rl.prompt(); }
}).on('close', () => {
writableStream.end();
console.log(`${filePath} dosyasına yazma tamamlandı.`);
});
}
Terminalden yazdığın her satırı anında dosyaya kaydeder.
🧩 4. Dosya Kopyalama — pipe()
function kopyala(filePath) {
const copyPath = filePath.replace('.', '-kopya.');
fs.createReadStream(filePath)
.pipe(fs.createWriteStream(copyPath))
.on('finish', () => console.log(`Dosya kopyalandı: ${copyPath}`));
}
pipe() metodu, okuma akışını otomatik olarak yazma akışına bağlar.
🔄 5. İçeriği Tersine Çevirme — Transform()
const { Transform } = stream;
function terscevir(filePath) {
const outPath = filePath.replace('.', '-ters.');
const reverseStream = new Transform({
transform(data, enc, cb) {
this.push(data.toString().split('').reverse().join(''));
cb();
}
});
fs.createReadStream(filePath)
.pipe(reverseStream)
.pipe(fs.createWriteStream(outPath))
.on('finish', () => console.log(`Ters çevirme tamamlandı: ${outPath}`));
}
Okunan veriyi ters çevirir ve yeni dosyaya yazar.
❓ Sıkça Sorulan Sorular
- Stream ile fs.readFileSync farkı nedir?
readFileSync tüm dosyayı belleğe alır. Stream ise veriyi parça parça işler.
- pipe() neden tercih edilir?
Akış kontrolünü senin yerine yönetir; hata ve hız optimizasyonunu otomatik yapar.
- Transform() nerelerde kullanılır?
Veriyi işlerken dönüştürmek istediğinde — sıkıştırma, şifreleme, formatlama gibi.
- Akışta hatalar nasıl yönetilir?
Tüm akışlar EventEmitter’dır. Hataları stream.on('error', ...) ile yakalayabilirsin.
🏁 Sonuç
Artık Node.js’te dosyalarla akış tabanlı çalışmayı öğrendin. Bellek dostu, yüksek performanslı sistemler kurabilir ve veri akışını profesyonelce yönetebilirsin.
Bu teknikleri Rabisu Bulut Platformu üzerinde hemen deneyebilir, Node.js uygulamalarını yüksek performansla çalıştırabilirsin. 🚀