Javascript快速读取本地文件到UInt8Array

时间:2017-09-21 07:42:46

标签: javascript performance io uint8t

如何快速读取本地二进制文件到UInt8Array。在下面的代码中

function readAllBytesAsUInt8Array(path) {
    var req = new XMLHttpRequest();
    req.open("GET", path, false);
    req.overrideMimeType("text/plain; charset=binary-data");
    req.send(null);
    if (req.status !== 200) {
        console.log("error");
        return null;
    }
    var text = req.responseText;
    var resultArray = new Uint8Array(text.length);
    for(var i = 0; i < text.length;i++){
    resultArray[i] = (text[i].charCodeAt() & 255) & 255;
    }
    return resultArray.buffer;
 }
执行

var text = req.responseText;不到一秒,同时这部分

var resultArray = new Uint8Array(text.length);
for(var i = 0; i < text.length;i++){
    resultArray[i] = (text[i].charCodeAt() & 255) & 255;
}
对于50MB的二进制文件,

大约需要10秒 有没有办法更快地将二进制文件读取到UInt8Array?

2 个答案:

答案 0 :(得分:1)

您可以将.responseType XMLHttpRequest()设置为"arraybuffer",然后将ArrayBuffer实例传递给new Uint8Array()。或者,您可以使用fetch()中的Response.arrayBuffer()FileReaderSync()WorkerArrayBuffer转移到主线程,而无需复制ArrayBuffer

req.responseType = "arraybuffer";
let buffer = req.response;
let u = new Uint8Array(buffer);

答案 1 :(得分:0)

您可以使用TextEncoder! TextEncoder将一串代码点作为输入,并发出一个字节流。

这是您的新代码:)

function readAllBytesAsUInt8Array(path) {
    var req = new XMLHttpRequest();
    req.open("GET", path, false);
    req.overrideMimeType("text/plain; charset=binary-data");
    req.send(null);
    if (req.status !== 200) {
        console.log("error");
        return null;
    }
    var text = req.responseText;
    var encoder = new TextEncoder("utf-8");
    var resultArray = encoder.encode(text);
    return resultArray.buffer;
 }

看看它是如何工作的,应该快得多。