Signatur
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
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
});
});
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}` });
}
};
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);
// Wichtig · Fallstricke
- Nur in Workern: Im Hauptthread (
window) istFileReaderSyncnicht definiert, dort führt der Aufruf zu einemReferenceError. Nutze dortFileReaderoder das Promise-basierteBlob.prototype.text(). - Ausnahmen statt Events: Fehler werden als Ausnahme geworfen, etwa
NotFoundError(Datei existiert nicht mehr),NotReadableError(keine Leserechte, Sperre) oderSecurityError. Den Aufruf deshalb intry...catcheinschließen. - Speicher: Die ganze Datei landet auf einmal als String im Speicher. Bei sehr großen Dateien besser stückweise mit
blob.slice()lesen oderblob.stream()zusammen mitTextDecoderStreamverwenden. - 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
FileReaderSynclaut Spezifikation nicht verfügbar. Node.js bietet die Schnittstelle nicht an.