Pisanje datotek v Node.js

Poskušal sem najti način za pisanje v datoteko z uporabo Node.js, vendar brez uspeha. Kako lahko to storim?

Rešitev

V API datotečnega sistema je veliko podrobnosti. Najpogostejši način je:

const fs = require('fs');

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

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

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

Trenutno obstajajo trije načini zapisovanja datoteke:

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

    Počakati morate na povratni klic, da se zagotovi, da se buffer zapiše na disk. To ni v obliki medpomnilnika.

  2. fs.writeFile(ime datoteke, podatki, [kodiranje], povratni klic)

    Vsi podatki morajo biti shranjeni istočasno; zaporednega zapisovanja ne morete izvajati.

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

    Ustvari `WriteStream, kar je priročno, saj vam ni treba čakati na povratni klic. Vendar pa spet ni izravnano.

WriteStream, kot pove že ime, je tok. Potok je po definiciji "buffer", ki vsebuje podatke, ki se premikajo v eni smeri (vir ► cilj). Vendar zapisljiv tok ni nujno "izravnalni". Tok je "bufferiran", če nkrat pišete, ob času n+1 pa tok pošlje buffer jedru (ker je poln in ga je treba sprazniti).

Z drugimi besedami: "Buffer" je objekt. Ali "je ali ni izenačen", je lastnost tega objekta.

Če si ogledate kodo, WriteStream podeduje objekt Stream, ki ga je mogoče zapisovati. Če ste pozorni, boste videli, kako splakujejo vsebino; nimajo nobenega sistema za bufferiranje.

Če zapišete niz, se ta pretvori v medpomnilnik, nato pa se pošlje v nativno plast in zapiše na disk. Pri pisanju nizov se ne zapolnjuje noben medpomnilnik. Če torej naredite:

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

Delate:

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

To so tri klici na plast I/O. Čeprav uporabljate "bufferje", podatki niso shranjeni v obliki bufferja. Pri pretoku z medpomnilnikom bi bilo mogoče: fs.write(new Buffer ("abc")), en klic na plast I/O.

Od zdaj v Node.js v0.12 (stabilna različica objavljena 02/06/2015) podpira dve funkciji: [cork()] (http://nodejs.org/docs/v0.11.5/api/stream.html#stream_writable_cork) in [uncork()] (http://nodejs.org/docs/v0.11.5/api/stream.html#stream_writable_uncork). Zdi se, da bosta ti funkciji končno omogočili, da boste lahko klice za pisanje zapisali v medpomnilnik/izpraznili.

V Javi na primer obstaja nekaj razredov, ki omogočajo bufferirane tokove (BufferedOutputStream, BufferedWriter ...). Če zapišete tri bajte, bodo ti bajti shranjeni v buffer (pomnilnik), namesto da bi opravili I/O klic samo za tri bajte. Ko je buffer poln, se vsebina izprazni in shrani na disk. To izboljša zmogljivost.

Ničesar ne odkrivam, samo spomnim se, kako bi bilo treba opraviti dostop do diska.

Komentarji (5)

Seveda ga lahko naredite nekoliko bolj naprednega. Neblokiranje, pisanje po koščkih, ne pisanje celotne datoteke naenkrat:

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();
});
Komentarji (9)