读取 javascript 中的部分二进制文件而不将整个文件加载到内存中

Read part of binary file in javascript without loading whole file in memory

我需要在 javascript 中读取一个非常大的本地二进制文件(在浏览器中,而不是在节点中)。该文件包含一个 header,其中包含我将使用的数据块的偏移量和大小。由于它是一个大文件,我不想将它全部加载到内存中。我想读取 header,然后只读取我将使用的数据块(不是全部)。

在 C/C++ 中,我可以将自己定位在文件的特定偏移量中,而无需实际读取整个文件,但我无法从浏览器(而非节点)中找到执行此操作的方法。 javascript 中的 FileReader object 在返回数组缓冲区之前读取整个参数。我找不到更好的方法来做到这一点。

您可以使用 File API:

分片读取文件

var blob = file.slice(startingByte, endingByte);

检查:https://developer.mozilla.org/en-US/docs/Web/API/Blob/slice

虽然 Pablo CG 的回答是正确的,但我还是决定用一个例子来扩展它。基本上我花了一点时间才明白如何实现它,所以以后可能其他人也会遇到同样的情况。

基本上,您只需按片读取文件(如 Pablo 所建议的),然后 然后 将其传递给 fileReader(这是我花了一些时间弄清楚的部分):

window.onload = function() {

    if (window.File && window.FileReader) {
      // Great success! All the File APIs are supported.
    } else {
      alert('The File APIs are not fully supported in this browser.');
    }

    function handleFileSelect(evt)
    {
        var file = evt.target.files[0];

        if (file != undefined);
        {
            let reader = new FileReader();
            let blob = file.slice(0, 2);

            reader.onload = function(e) {
                var buffer = e.target.result;
                let dv = new DataView(buffer);
                let blockId = dv.getUint16(0,true);

                if (blockId.toString(16)!="3a55"){
                    throw "Wrong format. Not a SEG-2 file."; }
            }
            reader.readAsArrayBuffer(blob);
        }
    }

    document.getElementById('fileInput').addEventListener('change', handleFileSelect);
}

在示例中,我只读取二进制文件的前两个字节以确定它是否确实是我正在处理的文件类型。