元のものは File でしょうか? それなら 直接 .stream() で逐次読み出しすれば いいのでは……?
js
1
2const file;
3
4for await (const text of file.stream().pipeThrough(new TextDecoderStream()))
5 console.log(text);
Blob: stream() メソッド - Web API | MDN
TextDecoderStream - Web API | MDN
読み込むコード例
こんな感じで良いのでは?
js
1openReadButton.addEventListener("click", openReadStart);
2
35
6async function openReadStart() {
7 const file = await showPicker();
8 log(`file: name:${file.name} size:${file.size}`);
9 const arrayBuffer = await readToArrayBuffer(file, ({ offset, length }) =>
10 log(`read ... ${offset}/${length}`),
11 );
12 log(`read complete: ${arrayBuffer.byteLength} byte`);
13 console.log(arrayBuffer);
14}
15
1618
19async function showPicker() {
20 const input = document.createElement("input");
21 input.type = "file";
22 const { resolve, promise } = Promise.withResolvers();
23 input.addEventListener("change", resolve);
24 input.showPicker();
25 await promise;
26 return input.files[0];
27}
28
2931
32async function readToArrayBuffer(file, progress) {
33 const array = new ArrayBuffer(file.size, { maxByteLength: file.size });
34 array.byteOffset = 0;
35 const buffer = new Uint8Array(array);
36 let offset = 0;
37 const iterator = file.stream();
38 for await (const value of iterator) {
39 buffer.set(value, offset);
40 offset += value.byteLength;
41 if (progress) await progress({ offset, length: file.size });
42 }
43 return buffer.buffer;
44}
https://livecodes.io/?x=id/bs5ddwfa9w2
1GB 読み込んでみましたが特に問題無いです。
ちなみに1GBのファイルは次のコマンドで作成しました。
cmd
1fsutil file createnew file.txt 1073741824