Start · Sprachen · JavaScript · Referenz · FileReaderSync.readAsText()

FileReaderSync.readAsText()

Methode

Liest den Inhalt eines <code>Blob</code> oder <code>File</code> synchron ein und gibt ihn als dekodierte Zeichenkette zurück – nur in Web Workern verfügbar.

seit JavaScript Baseline: alle modernen Browser (nur in Workern ve Kategorie: webapi

Signatur

FileReaderSync.prototype.readAsText(blob, encoding)

Beschreibung

readAsText() liest den Inhalt eines Blob- oder File-Objekts synchron ein und gibt ihn direkt als Zeichenkette zurück. Anders als beim asynchronen FileReader gibt es keine Ereignisse wie load oder error: Die Methode blockiert, bis der Inhalt vollständig gelesen ist, und liefert das Ergebnis als Rückgabewert.

Die Schnittstelle FileReaderSync gibt es nur in Workern (Dedicated Worker, Shared Worker). Das ist Absicht, denn synchrones Lesen im Hauptthread würde die Benutzeroberfläche einfrieren. Typisch ist es, eine Datei (z. B. aus einem <input type="file">) per postMessage() an einen Worker zu schicken. Dort wird sie ohne Callbacks eingelesen und dann verarbeitet, zum Beispiel beim Parsen von CSV, beim Durchsuchen von Log-Dateien oder beim Zählen von Wörtern.

Die Bytes werden standardmäßig als UTF-8 dekodiert. Mit dem optionalen Parameter encoding lässt sich eine andere Zeichenkodierung angeben (z. B. "ISO-8859-1" oder "windows-1252"). Beginnt die Datei mit einer Byte-Order-Mark (BOM), hat diese Vorrang vor der angegebenen Kodierung.

Parameter

Name Typ Default Beschreibung
$blob Pflicht Blob | File Das Blob- oder File-Objekt, dessen Inhalt gelesen werden soll.
$encoding string "UTF-8" Bezeichnung der Zeichenkodierung nach dem Encoding Standard, z. B. "utf-8", "iso-8859-1" oder "windows-1252". Eine unbekannte Bezeichnung führt dazu, dass UTF-8 verwendet wird.

Rückgabewert

Typ
string
Beschreibung
Der dekodierte Textinhalt des Blobs als Zeichenkette.

Beispiele

Datei im Worker einlesen und Zeilen zählen

// main.js
const worker = new Worker('reader-worker.js');
const input = document.querySelector('#datei');

input.addEventListener('change', () => {
  const [file] = input.files;
  if (file) worker.postMessage(file);
});

worker.addEventListener('message', (event) => {
  console.log(`Zeilen: ${event.data.lines}, Zeichen: ${event.data.chars}`);
});

// reader-worker.js
self.addEventListener('message', (event) => {
  const reader = new FileReaderSync();
  const text = reader.readAsText(event.data); // blockiert nur den Worker
  self.postMessage({
    lines: text.split(/\r?\n/).length,
    chars: text.length
  });
});
Zeilen: 42, Zeichen: 1873

CSV mit Windows-Kodierung parsen

// csv-worker.js
self.onmessage = ({ data: file }) => {
  try {
    const reader = new FileReaderSync();
    // Ältere Excel-Exporte sind oft in windows-1252 kodiert (Umlaute!)
    const text = reader.readAsText(file, 'windows-1252');
    const rows = text
      .trim()
      .split(/\r?\n/)
      .map((line) => line.split(';'));
    self.postMessage({ ok: true, header: rows[0], count: rows.length - 1 });
  } catch (err) {
    self.postMessage({ ok: false, error: `${err.name}: ${err.message}` });
  }
};
{ ok: true, header: ['Name', 'Straße', 'Ort'], count: 120 }

Selbst erzeugten Blob im Worker lesen

// Innerhalb eines Workers ausführen
const blob = new Blob(['Grüße aus dem Worker!'], { type: 'text/plain' });
const reader = new FileReaderSync();
const text = reader.readAsText(blob);
console.log(text);
Grüße aus dem Worker!

// Wichtig · Fallstricke

  • Nur in Workern: Im Hauptthread (window) ist FileReaderSync nicht definiert, dort führt der Aufruf zu einem ReferenceError. Nutze dort FileReader oder das Promise-basierte Blob.prototype.text().
  • Ausnahmen statt Events: Fehler werden als Ausnahme geworfen, etwa NotFoundError (Datei existiert nicht mehr), NotReadableError (keine Leserechte, Sperre) oder SecurityError. Den Aufruf deshalb in try...catch einschließen.
  • Speicher: Die ganze Datei landet auf einmal als String im Speicher. Bei sehr großen Dateien besser stückweise mit blob.slice() lesen oder blob.stream() zusammen mit TextDecoderStream verwenden.
  • Kodierung: Eine vorhandene BOM überschreibt den Parameter encoding. Ungültige Byte-Folgen werden durch das Ersatzzeichen U+FFFD (�) ersetzt, ohne dass ein Fehler geworfen wird.
  • Alternative: In modernem Code ist await blob.text() oft einfacher. Diese Methode funktioniert auch im Hauptthread, unterstützt aber nur UTF-8.
  • Kompatibilität: Wird von allen aktuellen Browsern in Dedicated und Shared Workern unterstützt. In Service Workern ist FileReaderSync laut Spezifikation nicht verfügbar. Node.js bietet die Schnittstelle nicht an.