在JavaScript中逐步读取二进制文件
Progressively read binary file in JavaScript
使用Chrome,我正在尝试读取和处理本地磁盘上的一个大(>4GB)二进制文件。看起来FileReader API只会读取整个文件,但我需要能够以流的形式逐渐读取文件。
该文件包含一系列帧,其中包含1字节的类型标识符、2字节的帧长度、8字节的时间戳,以及一些具有基于类型的格式的二进制数据。这些帧的内容将被累积,我想使用HTML5+JavaScript生成图形,并根据该文件的内容实时播放其他指标。
有人有什么想法吗?
实际上,文件是Blob,Blob有一个slice方法,我们可以用它来获取大块文件中的小块。
上周我写了下面的截图来过滤大的日志文件,但它显示了可以使用的模式,可以通过大文件逐小节循环。
- file是文件对象
- fnLineFilter是一个函数,它接受文件的一行并返回true以保留它
- fnComplete是一个回调,其中收集的行作为数组传递
这是我使用的代码:
function fileFilter(file, fnLineFilter, fnComplete) {
var bPos = 0,
mx = file.size,
BUFF_SIZE = 262144,
i = 0,
collection = [],
lineCount = 0;
var d1 = +new Date;
var remainder = "";
function grabNextChunk() {
var myBlob = file.slice(BUFF_SIZE * i, (BUFF_SIZE * i) + BUFF_SIZE, file.type);
i++;
var fr = new FileReader();
fr.onload = function(e) {
//run line filter:
var str = remainder + e.target.result,
o = str,
r = str.split(/'r?'n/);
remainder = r.slice(-1)[0];
r.pop();
lineCount += r.length;
var rez = r.map(fnLineFilter).filter(Boolean);
if (rez.length) {
[].push.apply(collection, rez);
} /* end if */
if ((BUFF_SIZE * i) > mx) {
fnComplete(collection);
console.log("filtered " + file.name + " in " + (+new Date() - d1) + "ms ");
} /* end if((BUFF_SIZE * i) > mx) */
else {
setTimeout(grabNextChunk, 0);
}
};
fr.readAsText(myBlob, myBlob.type);
} /* end grabNextChunk() */
grabNextChunk();
} /* end fileFilter() */
很明显,您可以摆脱寻线,而只获取纯范围;我不确定你需要挖掘什么类型的数据,重要的是切片机制,上面以文本为中心的代码很好地证明了这一点。
相关文章:
- 从桌面读取python文件时高亮显示代码
- Javascript-如何读取json文件中的列并将其保存在Javascript数组中
- 使用JavaScript从二进制文件中读取字节,而不使用jQuery
- 使用 node.js 从 Google 云端硬盘读取二进制文件
- 使用 JQuery 读取二进制文件的浏览器之间的不同行为
- 读取 JavaScript 中包含 32 位浮点数的二进制文件
- 为什么我可以使用 FileSystemObjects 来读取和写入客户端二进制文件,而不能用于读取和发送到服务器
- 从Javascript(多浏览器)读取二进制文件
- 打开并读取二进制文件(JavaScript)
- 如何使用FileReader读取二进制文件,以便在CryptoJS中使用SHA-256进行哈希
- 在JavaScript中逐步读取二进制文件
- 读取二进制文件并从中生成字符串
- 在IE9中使用jQuery和jDataView读取二进制文件
- Javascript二进制文件读取
- 用Karma-Jasmine读取二进制文件
- 如何读取二进制文件字节字节使用javascript
- 函数读取二进制文件使用v8
- 读取二进制文件从服务器和赞扬它在javascript
- 如何将文本保存到文件并再次读取,但在javascript中保存为二进制文件
- 读取二进制文件时出错