Node.js'de dosya yazma

Node.js kullanırken bir dosyaya yazmanın bir yolunu bulmaya çalışıyorum, ancak başarılı olamadım. Bunu nasıl yapabilirim?

Çözüm

Dosya Sistemi API]1'de çok fazla ayrıntı vardır. En yaygın yol şudur:

const fs = require('fs');

fs.writeFile("/tmp/test", "Hey there!", function(err) {

    if(err) {
        return console.log(err);
    }

    console.log("The file was saved!");
}); 
Yorumlar (16)

Şu anda bir dosya yazmanın üç yolu vardır:

  1. fs.write(fd, buffer, offset, length, position, callback)

    Arabelleğin diske yazıldığından emin olmak için geri aramayı beklemeniz gerekir. Arabelleğe alınmaz.

  2. fs.writeFile(filename, data, [encoding], callback)

    Tüm veriler aynı anda depolanmalıdır; sıralı yazma işlemi gerçekleştiremezsiniz.

  3. fs.createWriteStream(path, [options])

    Bir WriteStream oluşturur, bu kullanışlıdır çünkü bir geri arama beklemenize gerek yoktur. Ancak yine de tamponlu değildir.

Bir WriteStream, adından da anlaşılacağı gibi, bir akıştır. Tanım olarak bir akış, tek yönde (kaynak ► hedef) hareket eden verileri içeren "bir tampon "dur. Ancak yazılabilir bir akışın "tamponlanmış" olması gerekmez. Bir akış, n kez yazdığınızda ve n+1 zamanında, akış tamponu çekirdeğe gönderdiğinde (çünkü dolmuştur ve temizlenmesi gerekir) "tamponludur".

Başka bir deyişle: "Bir tampon" nesnedir. "Tamponlanıp tamponlanmadığı" o nesnenin bir özelliğidir.

Koda bakarsanız, WriteStream yazılabilir bir Stream nesnesinden miras alır. Dikkat ederseniz, içeriği nasıl temizlediklerini göreceksiniz; herhangi bir tamponlama sistemleri yoktur.

Bir dize yazarsanız, bu bir tampona dönüştürülür ve ardından yerel katmana gönderilir ve diske yazılır. Dizeleri yazarken, herhangi bir arabelleği doldurmazlar. Yani, eğer yaparsanız:

write("a")
write("b")
write("c")

Yapıyorsun:

fs.write(new Buffer("a"))
fs.write(new Buffer("b"))
fs.write(new Buffer("c"))

Bu, G/Ç katmanına üç çağrı demektir. Her ne kadar "tampon" kullanıyor olsanız da, veriler tamponlanmamıştır. Tamponlanmış bir akış şunu yapardı: fs.write(new Buffer ("abc")), I/O katmanına bir çağrı.

Şu an itibariyle, Node.js v0.12'de (kararlı sürüm 02/06/2015'te duyuruldu) artık iki işlevi desteklemektedir: cork() ve uncork(). Görünüşe göre bu işlevler sonunda yazma çağrılarını tamponlamanıza / yıkamanıza izin verecek.

Örneğin, Java'da tamponlanmış akışlar sağlayan bazı sınıflar vardır (BufferedOutputStream, BufferedWriter...). Eğer üç bayt yazarsanız, bu baytlar sadece üç bayt için bir I/O çağrısı yapmak yerine tamponda (bellekte) saklanacaktır. Tampon dolduğunda içerik temizlenir ve diske kaydedilir. Bu performansı artırır.

Bir şey keşfetmiyorum, sadece bir disk erişiminin nasıl yapılması gerektiğini hatırlıyorum.

Yorumlar (5)

Elbette biraz daha gelişmiş hale getirebilirsiniz. Engellemesiz, parça parça yazma, tüm dosyayı bir kerede yazmama gibi:

var fs = require('fs');
var stream = fs.createWriteStream("my_file.txt");
stream.once('open', function(fd) {
  stream.write("My first row\n");
  stream.write("My second row\n");
  stream.end();
});
Yorumlar (9)