Failu rakstīšana programmā Node.js

Es'esmu mēģinājis atrast veidu, kā rakstīt uz failu, izmantojot Node.js, bet bez panākumiem. Kā es to varu izdarīt?

Risinājums

File System API ir daudz sīkumu. Visbiežāk sastopamais veids ir:

const fs = require('fs');

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

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

    console.log("The file was saved!");
}); 
Komentāri (16)

Pašlaik ir trīs veidi, kā ierakstīt failu:

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

    Lai nodrošinātu, ka buferis tiek ierakstīts uz diska, ir jāgaida atpakaļsaukums. Tā nav buferizēta.

  2. fs.writeFile(faila nosaukums, dati, [kodēšana], atgriezeniskais zvans)

    Visiem datiem jābūt saglabātiem vienlaicīgi; nevar veikt secīgu rakstīšanu.

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

    Izveido `WriteStream, kas ir ērti, jo nav jāgaida atpakaļsaukums. Bet atkal, tas nav buferēts.

WriteStream, kā norāda nosaukums, ir plūsma. Pēc definīcijas straume ir "buferis", kas satur datus, kuri pārvietojas vienā virzienā (avots ► galamērķis). Bet rakstāmā plūsma ne vienmēr ir "buferēta". Straume ir "buferēta", ja jūs rakstāt n reižu, un n+1 reizē straume nosūta buferi kodolam (jo tas ir pilns un ir jāizskalo).

Citiem vārdiem sakot: "Buferis" ir objekts. Tas, vai tas "ir vai nav buferizēts", ir šī objekta īpašība.

Ja paskatās uz kodu, WriteStream manto no rakstāmā Stream objekta. Ja pievērsīsiet uzmanību, redzēsiet, kā tie izskalo saturu; tiem nav buferēšanas sistēmas.

Ja jūs rakstāt virkni, tā tiek pārvērsta buferī un pēc tam nosūtīta uz vietējo slāni un ierakstīta diskā. Rakstot virknes, tās neaizpilda buferi. Tātad, ja jūs veicat:

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

Jūs'darāt:

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

Tas ir trīs izsaukumi I/O slānim. Lai gan jūs izmantojat "buferus", dati nav buferizēti. Buferēta plūsma būtu šāda: fs.write(new Buffer ("abc")), viens izsaukums uz I/O slāni.

No šī brīža Node.js v0.12 (stabilā versija paziņota 02/06/2015) tagad atbalsta divas funkcijas: cork() un uncork(). Šķiet, ka šīs funkcijas beidzot ļaus buferēt/izpludināt rakstīšanas izsaukumus.

Piemēram, Java ir dažas klases, kas nodrošina buferētas plūsmas (BufferedOutputStream, BufferedWriter...). Ja ierakstīsiet trīs baitus, šie baiti tiks saglabāti buferī (atmiņā), nevis tiks veikts I/O izsaukums tikai trīs baitiem. Kad buferis ir pilns, saturs tiek izskalots un saglabāts diskā. Tas uzlabo veiktspēju.

Es neko neatklāju, tikai atceros, kā jāveic piekļuve diskam.

Komentāri (5)

Protams, varat to nedaudz uzlabot. Nebloķēšana, fragmentu rakstīšana, nevis visa faila rakstīšana uzreiz:

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();
});
Komentāri (9)