Start · Sprachen · JavaScript · Referenz · FileReaderSync

FileReaderSync

Schnittstelle

Liest den Inhalt von <code>File</code>- oder <code>Blob</code>-Objekten synchron. Das Interface steht nur in Web Workers zur Verfügung, nicht im Hauptthread.

seit JavaScript Baseline: alle modernen Browser (nur in Web Worker Kategorie: webapi

Signatur

interface FileReaderSync

Beschreibung

FileReaderSync ist das synchrone Gegenstück zu FileReader. Statt mit Events wie load oder error zu arbeiten, geben die Lesemethoden das Ergebnis direkt zurück. Bei einem Fehler werfen sie eine Ausnahme. Dadurch bleibt der Code linear und gut lesbar, ganz ohne Callbacks oder Promises.

Weil synchrones Lesen den Thread blockiert, gibt es das Interface nur in Web Workers (DedicatedWorkerGlobalScope, SharedWorkerGlobalScope), nicht im Hauptthread. Typische Einsätze sind rechenintensive Arbeiten an Dateien im Hintergrund, zum Beispiel Parsen großer CSV- oder JSON-Dateien, Prüfsummen berechnen oder Binärformate auswerten.

Der Konstruktor new FileReaderSync() erwartet keine Argumente. Diese Methoden stehen zur Verfügung:

  • readAsArrayBuffer(blob): gibt ein ArrayBuffer mit den Rohdaten zurück.
  • readAsText(blob, encoding): gibt einen string zurück. Ohne Angabe wird UTF-8 verwendet.
  • readAsDataURL(blob): gibt eine data:-URL mit Base64-kodiertem Inhalt zurück.
  • readAsBinaryString(blob): veraltet. Jedes Byte wird als ein Zeichen zurückgegeben.

In neuem Code sind oft die Promise-Methoden von Blob einfacher: blob.text(), blob.arrayBuffer() und blob.stream(). Sie funktionieren überall, auch im Hauptthread.

Parameter

Name Typ Default Beschreibung
$blob Pflicht Blob | File Das zu lesende Objekt. Gilt für alle readAs…-Methoden.
$encoding string "UTF-8" Nur bei readAsText(): die Zeichenkodierung, z. B. "ISO-8859-1" oder "windows-1252".

Rückgabewert

Typ
FileReaderSync
Beschreibung
new FileReaderSync() gibt eine Leser-Instanz zurück. Die Lesemethoden geben je nach Methode direkt ein ArrayBuffer oder einen string zurück.

Beispiele

Textdatei im Worker lesen und Zeilen zählen

// main.js
const worker = new Worker('worker.js');
document.querySelector('#datei').addEventListener('change', (e) => {
  worker.postMessage(e.target.files[0]);
});
worker.onmessage = ({ data }) => console.log(`Zeilen: ${data.zeilen}`);

// worker.js
self.onmessage = ({ data: file }) => {
  const reader = new FileReaderSync();
  const text = reader.readAsText(file); // blockiert nur den Worker
  self.postMessage({ zeilen: text.split('\n').length });
};
Zeilen: 1284

Binärdaten lesen: PNG-Signatur prüfen

// worker.js
const PNG_SIGNATUR = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];

self.onmessage = ({ data: file }) => {
  const reader = new FileReaderSync();
  // Nur die ersten 8 Bytes lesen
  const buffer = reader.readAsArrayBuffer(file.slice(0, 8));
  const bytes = new Uint8Array(buffer);
  const istPng = PNG_SIGNATUR.every((b, i) => bytes[i] === b);
  self.postMessage({ name: file.name, istPng });
};
{ name: "bild.png", istPng: true }

Fehlerbehandlung und Data-URL mit Kodierung

// worker.js
self.onmessage = ({ data: file }) => {
  const reader = new FileReaderSync();
  try {
    const vorschau = reader.readAsDataURL(file);
    const altText = reader.readAsText(file.slice(0, 200), 'windows-1252');
    self.postMessage({ vorschau, altText });
  } catch (err) {
    // z. B. NotReadableError, wenn die Datei inzwischen gelöscht wurde
    self.postMessage({ fehler: `${err.name}: ${err.message}` });
  }
};
{ vorschau: "data:text/plain;base64,SGFsbG8...", altText: "Hallo ..." }

// Wichtig · Fallstricke

  • Nur in Workern: Im Hauptthread ist FileReaderSync nicht definiert. Ein Aufruf dort führt zu ReferenceError: FileReaderSync is not defined. In Service Workern ist es nicht zuverlässig verfügbar, verwende dort blob.arrayBuffer().
  • Fehler als Ausnahme: Statt eines error-Events werfen die Methoden eine DOMException, z. B. NotFoundError, NotReadableError oder SecurityError. Setze die Aufrufe deshalb in einen try…catch-Block.
  • Speicherbedarf: Die ganze Datei wird auf einmal in den Speicher geladen. Große Dateien liest du besser stückweise mit blob.slice(start, end) oder mit blob.stream().
  • Veraltet: Verwende readAsBinaryString() nicht mehr. readAsArrayBuffer() zusammen mit typisierten Arrays ist die bessere Wahl.
  • Kompatibilität: Wird in Chrome, Firefox, Safari und Edge seit vielen Jahren in Dedicated und Shared Workern unterstützt. In Node.js gibt es dieses Interface nicht.