Node.js Buffer-Modul

Java FileIntegrierte Module in Node.js


Buffer ist eine Klasse in Node.js, die zum Verarbeiten von binären Datenströmen verwendet wird. In Computern werden alle Daten letztendlich in binärer Form gespeichert und übertragen, und Buffer bietet eine Möglichkeit, diese rohen binären Daten in Node.js effizient zu verarbeiten.

Sie können sich Buffer als einen "Container" fester Größe vorstellen, der speziell dafür ausgelegt ist, rohe binäre Daten aufzunehmen. Im Gegensatz zu gewöhnlichen Arrays in JavaScript weist Buffer einen Speicherblock fester Größe zu, was ihn beim Umgang mit großen Mengen binärer Daten effizienter macht.


Warum brauchen wir Buffer?

In der Webentwicklung müssen wir oft verschiedene binäre Daten verarbeiten, wie zum Beispiel:

  • Datei-Lese- und -Schreibvorgänge
  • Datenübertragung in der Netzwerkkommunikation
  • Bildverarbeitung
  • Verschlüsselungs- und Entschlüsselungsoperationen

JavaScript wurde ursprünglich hauptsächlich für DOM-Operationen in Browsern entwickelt und hatte nur eingeschränkte Möglichkeiten zur Verarbeitung binärer Daten. Node.js als serverseitige Laufzeitumgebung benötigt leistungsfähigere Möglichkeiten zur Verarbeitung binärer Daten, weshalb das Buffer-Modul existiert.


Erstellen eines Buffers

Es gibt mehrere Möglichkeiten, einen Buffer in Node.js zu erstellen:

1. Verwendung von Buffer.alloc()

Beispiel

// Erstellt einen Buffer mit einer Länge von 10 Bytes, gefüllt mit 0
const buf1 = Buffer.alloc(10);
console.log(buf1); // <Buffer 00 00 00 00 00 00 00 00 00 00>

2. Verwendung von Buffer.allocUnsafe()

Beispiel

// Erstelle einen Buffer mit einer Länge von 10 Bytes, aber initialisiere den Inhalt nicht
// Kann alte Daten enthalten, ist daher schneller, aber weniger sicher
const buf2 = Buffer.allocUnsafe(10);
console.log(buf2); // <Buffer-Inhalt ist unsicher>

3. Erstellen aus einem Array

Beispiel

// Erstelle einen Buffer aus einem Array
const buf3 = Buffer.from([0x62, 0x75, 0x66, 0x66, 0x65, 0x72]);
console.log(buf3); // <Buffer 62 75 66 66 65 72>

4. Erstellen aus einem String

Beispiel

// Erstelle einen Buffer aus einem String
const buf4 = Buffer.from('Hello Node.js');
console.log(buf4); // <Buffer 48 65 6c 6c 6f 20 4e 6f 64 65 2e 6a 73>

Gängige Buffer-Methoden

Daten schreiben

Beispiel

const buf = Buffer.alloc(5);

// Einen String schreiben
buf.write('Hello');
console.log(buf); // <Buffer 48 65 6c 6c 6f>

// Kodierung beim Schreiben angeben
const buf2 = Buffer.alloc(10);
buf2.write('Hello', 'utf8');
console.log(buf2); // <Buffer e4 bd a0 e5 a5 bd 00 00 00 00>

Daten lesen

Beispiel

const buf = Buffer.from('Hello World');

// Als String lesen
console.log(buf.toString()); // Hello World

// Einen Teil des Inhalts lesen
console.log(buf.toString('utf8', 0, 5)); // Hello

Kopieren eines Buffers

Beispiel

const buf1 = Buffer.from('Hello');
const buf2 = Buffer.from('World');
const buf3 = Buffer.alloc(10);

buf1.copy(buf3, 0); // buf1 an den Anfang von buf3 kopieren
buf2.copy(buf3, 5); // buf2 an die Position ab dem 5. Byte von buf3 kopieren

console.log(buf3.toString()); // HelloWorld

Verketten von Buffern

Beispiel

const buf1 = Buffer.from('Hello');
const buf2 = Buffer.from(' ');
const buf3 = Buffer.from('World');

const result = Buffer.concat([buf1, buf2, buf3]);
console.log(result.toString()); // Hello World

Buffer und Strings

Buffer und Strings können ineinander umgewandelt werden, aber es muss auf die Kodierung geachtet werden. Gängige Kodierungen sind:

  • 'utf8' (Standard)
  • 'ascii'
  • 'base64'
  • 'hex'

Beispiel

Beispiel

// String in Buffer umwandeln
const str = 'Hello Buffer';
const buf = Buffer.from(str);

// Buffer in String umwandeln
console.log(buf.toString()); // Hello Buffer

// Verschiedene Kodierungen verwenden
console.log(buf.toString('hex')); // 48656c6c6f20427566666572
console.log(buf.toString('base64')); // SGVsbG8gQnVmZmVy

Praktische Anwendungen von Buffer

1. Dateioperationen

Beispiel

const fs = require('fs');

// Datei in Buffer einlesen
fs.readFile('example.txt', (err, data) => {
  if (err) throw err;
  console.log(data); // <Buffer ...>
  console.log(data.toString()); // Dateiinhalt
});

// Buffer in Datei schreiben
const content = Buffer.from('Hallo Dateisystem');
fs.writeFile('output.txt', content, (err) => {
  if (err) throw err;
  console.log('Datei gespeichert');
});

2. Netzwerkkommunikation

Beispiel

const http = require('http');

http.createServer((req, res) => {
  const chunks = [];
 
  req.on('data', (chunk) => {
    chunks.push(chunk); // Datenblöcke sammeln
  });
 
  req.on('end', () => {
    const body = Buffer.concat(chunks); // Alle Datenblöcke kombinieren
    console.log(`Empfangene Daten: ${body.toString()}`);
    res.end('Daten empfangen');
  });
}).listen(3000);

3. Bildverarbeitung

Beispiel

const fs = require('fs');
const sharp = require('sharp');

// Bild in Buffer einlesen
fs.readFile('input.jpg', (err, data) => {
  if (err) throw err;
 
  // Mit sharp Bilddaten in Buffer verarbeiten
  sharp(data)
    .resize(200, 200)
    .toBuffer()
    .then(outputBuffer => {
      // Den verarbeiteten Buffer in eine Datei schreiben
      fs.writeFile('output.jpg', outputBuffer, err => {
        if (err) throw err;
        console.log('Bildverarbeitung abgeschlossen');
      });
    });
});

Hinweise

  1. Speicherverwaltung: Buffer arbeitet direkt auf dem Speicher; das Zuweisen großer Buffer kann die Anwendungsleistung beeinträchtigen.

  2. Sicherheit:Buffer.allocUnsafe()Kann sensible Daten enthalten, seien Sie daher vorsichtig bei der Verwendung.

  3. Konsistente Kodierung: Stellen Sie bei der Konvertierung zwischen Buffer und String sicher, dass dieselbe Kodierung verwendet wird.

  4. Versionsunterschiede: Die Buffer-API in älteren Node.js-Versionen (v5.x und früher) unterscheidet sich von den neueren Versionen; es wird empfohlen, die neueste API zu verwenden.

  5. Performance-Überlegungen: Bei der Verarbeitung großer Datenmengen kann die ordnungsgemäße Verwendung von Buffer die Leistung erheblich verbessern.

Buffer ist ein Kernmodul in Node.js zur Verarbeitung binärer Daten. Das Verständnis seiner Funktionsweise und Verwendungsmethoden ist entscheidend für die Entwicklung effizienter und zuverlässiger Node.js-Anwendungen.


BufferListe der Modulmethoden und -eigenschaften

BufferEs ist ein Kernmodul in Node.js, das zur Verarbeitung binärer Daten verwendet wird. Die folgenden sind die wichtigsten Methoden und Eigenschaften des Buffer-Moduls:

Eigenschaften der Buffer-Klasse

Eigenschaft/Methode Beschreibung Eingeführt in Version
Buffer.poolSize Größe der vorab zugewiesenen internen Buffer-Instanz (Bytes), änderbar 0.11.3
Buffer.from() Erstellt einen neuen Buffer aus einem String, einem Array oder einem Buffer 5.10.0
Buffer.alloc() Erzeugt einen initialisierten Buffer der angegebenen Größe 5.10.0
Buffer.allocUnsafe() Erzeugt einen nicht initialisierten Buffer der angegebenen Größe (schneller, aber unsicher) 5.10.0
Buffer.allocUnsafeSlow() Erzeugt einen nicht initialisierten Buffer (ohne Verwendung des gemeinsamen Speicherpools) 5.12.0
Buffer.isBuffer() Prüft, ob ein Objekt ein Buffer ist 0.1.101
Buffer.isEncoding() Prüft, ob eine Kodierung gültig ist 0.9.1
Buffer.concat() Kombiniert ein Array von Buffers 0.7.11
Buffer.byteLength() Gibt die Byte-Länge eines Strings zurück 0.1.90
Buffer.compare() Zwei Buffers vergleichen 0.11.13

Buffer-Instanzmethoden

Methode Beschreibung Eingeführt in Version
buf.length Byte-Länge des Buffers 0.1.90
buf.write() Schreibt einen String in den Buffer 0.1.90
buf.toString() Den Buffer in einen String dekodieren 0.1.90
buf.toJSON() Gibt die JSON-Darstellung des Buffers zurück 0.9.2
buf.equals() Vergleichen, ob zwei Buffer gleich sind 0.11.13
buf.compare() Buffer vergleichen und die Sortierreihenfolge zurückgeben 0.11.13
buf.copy() Buffer-Daten kopieren 0.1.90
buf.slice() Eine Teilansicht des Buffers erstellen 0.3.0
buf.includes() Prüfen, ob der Buffer einen Wert enthält 5.3.0
buf.indexOf() Die Position des ersten Vorkommens eines Werts zurückgeben 1.5.0
buf.lastIndexOf() Gibt die Position des letzten Vorkommens eines Werts zurück 6.0.0
buf.fill() Füllt den Buffer mit einem angegebenen Wert 0.5.0
buf.readUIntLE() Liest eine vorzeichenlose Little-Endian-Ganzzahl 0.5.5
buf.readUIntBE() Liest eine vorzeichenlose Big-Endian-Ganzzahl 0.5.5
buf.readIntLE() Liest eine vorzeichenbehaftete Little-Endian-Ganzzahl 0.11.15
buf.readIntBE() Liest eine vorzeichenbehaftete Big-Endian-Ganzzahl 0.11.15
buf.readBE() Liest eine 64-Bit-Gleitkommazahl mit doppelter Genauigkeit im Big-Endian-Format. 0.11.15
buf.readDoubleLE() Liest eine 64-Bit-Gleitkommazahl mit doppelter Genauigkeit im Little-Endian-Format. 0.11.15
buf.readFloatBE() Liest eine 32-Bit-Gleitkommazahl im Big-Endian-Format. 0.11.15
buf.readFloatLE() Liest eine 32-Bit-Gleitkommazahl im Little-Endian-Format. 0.11.15
buf.writeUIntLE() Schreibt eine vorzeichenlose Little-Endian-Ganzzahl. 0.5.5
buf.writeUIntBE() Schreibt eine vorzeichenlose Big-Endian-Ganzzahl. 0.5.5
buf.writeIntLE() Schreibe eine vorzeichenbehaftete Little-Endian-Ganzzahl 0.11.15
buf.writeIntBE() Schreibe eine vorzeichenbehaftete Big-Endian-Ganzzahl 0.11.15
buf.writeDoubleBE() Schreibe eine 64-Bit-Gleitkommazahl mit doppelter Genauigkeit im Big-Endian-Format 0.11.15
buf.writeDoubleLE() Schreibe eine 64-Bit-Gleitkommazahl mit doppelter Genauigkeit im Little-Endian-Format 0.11.15
buf.writeFloatBE() Schreibe eine 32-Bit-Gleitkommazahl im Big-Endian-Format 0.11.15
buf.writeFloatLE() Schreibe eine 32-Bit-Gleitkommazahl im Little-Endian-Format 0.11.15
buf.swap16() 16-Bit-Byte-Reihenfolge vertauschen 5.10.0
buf.swap32() 32-Bit-Byte-Reihenfolge vertauschen 5.10.0
buf.swap64() 64-Bit-Byte-Reihenfolge vertauschen 6.3.0
buf.keys() Iterator für Buffer-Schlüssel erstellen 1.1.0
buf.values() Iterator für Buffer-Werte erstellen 1.1.0
buf.entries() Iterator für [index, byte] erstellen 1.1.0

Kodierungstypen

Vom Buffer unterstützte Kodierungstypen:

Kodierung Beschreibung
utf8 Mehrbyte-Unicode-Zeichen
utf16le 2- oder 4-Byte-Unicode-Zeichen
latin1 ISO-8859-1
ascii Nur 7-Bit-ASCII-Daten
base64 Base64-Kodierung
base64url URL-sichere Base64-Kodierung
hex Hexadezimale Kodierung
ucs2 Alias für utf16le
binär Alias für latin1 (veraltet)

Beispiel

// Einen Buffer erstellen
const buf1 = Buffer.alloc(10); // Einen mit Nullen gefüllten Buffer initialisieren
const buf2 = Buffer.from('hello'); // Aus einem String erstellen
const buf3 = Buffer.from([1, 2, 3]); // Aus einem Array erstellen

// Schreiben und lesen
buf1.write('Node.js');
console.log(buf1.toString('utf8', 0, 6)); // 'Node.js'

// Buffers vergleichen
const bufA = Buffer.from('A');
const bufB = Buffer.from('B');
console.log(bufA.compare(bufB)); // -1

// Buffers verketten
const concatBuf = Buffer.concat([bufA, bufB]);

Java FileNode.js integrierte Module

Weitere Erweiterungen