Šta su Baferi (eng. Buffers)?
Kada radimo s podacima koji se prenose preko mreže ili kada čitamo i pišemo datoteke na disku, često se susrećemo sa podacima koji nisu odmah dostupni u celosti. Bufferi su privremena skladišta za podatke dok se oni premeštaju iz jednog mesta u drugo. Bufferi omogućavaju da se ovi podaci akumuliraju i obrađuju u delovima, čime se efikasno upravlja memorijom i brzinom obrade. Baferi su praktično nizovi bajtova (pročitajte više o binarnim brojevima u okviru članka “Binarni sistem”).
Baferi se koriste u različitim situacijama:
-
Upravljanje Protokom Podataka:
Baferi si koriste kada server prima podatke brže nego što ih može obraditi i tada se baferi koriste je mogu privremeno čuvati te podatke dok server ne stigne da ih obradi.
-
Poboljšanje Performansi:
Korišćenjem bafera, program može nastaviti sa radom bez čekanja da se svaki komad podataka potpuno obradi. To može značajno poboljšati performanse aplikacija, posebno u mrežnim operacijama gde su latencija i brzina prenosa ključni faktori.
-
Asinhrono Programiranje:
Baferi su ključni u asinhronom programiranju, omogućavajući aplikacijama da obavljaju operacije ulaza/izlaza (I/O) bez blokiranja. To znači da server može efikasno upravljati višestrukim zahtevima istovremeno, čineći ga sposobnim da opslužuje više korisnika bez usporavanja.
Buffers u Node.js-u
Buffer je klasa u Node.js-u dizajnirana za rad sa binarnim podacima. Omogućava direktno čitanje iz i pisanje u memoriju, što je mnogo brže i efikasnije za binarne podatke nego korišćenje stringova.U modernim verzijama Node.js-a, nije potrebno koristiti require za pozivanje Buffer objekta. Buffer je globalni objekat u Node.js, što znači da je automatski dostupan u svakom fajlu bez potrebe za eksplicitnim uvozom. Ovo olakšava rad sa binarnim podacima jer možete direktno koristiti Buffer metode.
Primer
1 2 3 |
// Direktno korišćenje Buffer metoda bez require const buffer = Buffer.from('Ovo je primer teksta u bufferu.'); console.log(buffer.toString()); |
U Node.js, bufferi se koriste za rad sa binarnim podacima. To znači da svaki element u bufferu predstavlja jedan bajt podataka. Bufferi su ključni kada radimo sa bilo kakvim binarnim podacima, kao što su multimedijalni fajlovi (slike, video, audio), jer omogućavaju efikasno upravljanje tim podacima.
Kreiranje buffera
Buffer možemo kreirati na nekoliko načina:
- Buffer.from(): Kreira buffer iz postojećih podataka, kao što je string.
- Buffer.alloc(): Kreira prazan buffer određene veličine, sa inicijalizovanim podacima.
- Buffer.allocUnsafe(): Slično kreira buffer određene veličine, ali bez inicijalizacije podataka.
Primer kreiranja bafera
1 2 3 4 5 6 |
// Kreiranje buffera iz stringa const buf = Buffer.from('hello'); // Kreiranje buffera iz niza brojeva const buf = Buffer.from([1, 2, 3, 4, 5]); // Kreiranje praznog buffera od 10 bajtova const bufEmpty = Buffer.alloc(10); |
Prvi način kreira buffer određene veličine, drugi kreira buffer iz stringa, a treći kreira buffer iz niza brojeva.
Nakon kreiranja, buffer možemo koristiti za čuvanje ili manipulaciju binarnim podacima.
Čitanje i pisanje bafera
Možete da čitate i pišete u buffere koristeći metode kao što su buf.write() i buf.toString().
Primer
Na primer, da napišete string u buffer i zatim ga pročitate:
1 2 3 |
// Pisanje "Hello" u prazan buffer bufEmpty.write("Hello", 0, 5, 'utf-8'); console.log(buf.toString()); |
Ovo će ispisati “hello” u konzoli, prevedeno iz binarnog formata koji je bio sačuvan u bufferu.
Primer korišćenja za konverzije
U Node.js-u, Buffers često koristimo za konvertovanje binarnih podataka u heksadecimalne stringove ili za rad sa različitim kodiranjima znakova.
1 2 |
const buf = Buffer.from('Zdravo, svete!', 'utf8'); console.log(buf.toString('hex')); // Pretvaranje sadržaja Buffer-a u heksadecimalni string |
Maksimalna veličina buffer-a u Node.js
Veličina buffera zavisi od verzije Node.js-a i arhitekture sistema na kojem se izvršava (32-bitni ili 64-bitni). U novijim verzijama Node.js-a, na 64-bitnim sistemima, maksimalna veličina buffer-a može biti do oko 2GB (gigabajta). Ovo ograničenje je postavljeno zbog ograničenja u V8 JavaScript motoru koji Node.js koristi. Da budemo precizniji, treba napomenuti da se maksimalna veličina može razlikovati u zavisnosti od verzije V8 motora i specifičnih izmena koje Node.js tim može implementirati. Stoga, ako radite s vrlo velikim bufferima i blizu ste granici onoga što V8 može da rukuje, preporučuje se da proverite najnoviju dokumentaciju Node.js-a ili testirate u vašem specifičnom okruženju.
Primer korišćenja buffera
U ovom primeru ćemo koristiti Buffer za čitanje i upisivanje binarnih podataka iz fajla tako što ćemo učitati sliku iz fajla, konvertovati je u base64 string i ponovo je upisati u novi fajl:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
import * as fs from 'fs'; import * as path from 'path'; // Putanja do ulazne slike const inputImagePath = path.join(__dirname, 'input.jpg'); // Putanja do izlazne slike const outputImagePath = path.join(__dirname, 'output.jpg'); // Čitanje slike u buffer fs.readFile(inputImagePath, (err, data) => { if (err) { console.error('Error reading file:', err); return; } // Konvertovanje buffer-a u base64 string const base64Image = data.toString('base64'); // Logovanje base64 string-a (opciono) console.log('Base64 Image:', base64Image); // Konvertovanje base64 string-a nazad u buffer const imageBuffer = Buffer.from(base64Image, 'base64'); // Upisivanje buffer-a u novi fajl fs.writeFile(outputImagePath, imageBuffer, (err) => { if (err) { console.error('Error writing file:', err); return; } console.log('Image written successfully to', outputImagePath); }); }); |