逐步读取JavaScript中的二进制文件

时间:2013-06-20 20:29:22

标签: javascript html5 google-chrome

使用Chrome,我尝试在本地磁盘上读取并处理大型(> 4GB)二进制文件。看起来FileReader API只会读取整个文件,但我需要能够以流的形式逐步读取文件。

此文件包含一系列帧,其中包含1字节类型标识符,2字节帧长度,8字节时间戳,然后是一些具有基于类型的格式的二进制数据。这些帧的内容将被累积,我想使用HTML5 + JavaScript生成图表,并根据此文件的内容显示其他指标作为实时回放。

有人有什么想法吗?

1 个答案:

答案 0 :(得分:4)

实际上,文件是Blob,而Blob有一个切片方法,我们可以用它来获取较小的大块文件。

上周我编写了以下剪辑来过滤大型日志文件,但是它显示了可用于循环子节的大型文件的模式。

  1. 文件是文件对象
  2. fnLineFilter是一个函数,它接受一行文件并返回true以保持它
  3. fnComplete是一个回调,其中收集的行作为数组传递
  4. 这是我使用的代码:

     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() */
    
    显然,你可以摆脱线条发现,而只是抓住纯粹的范围;我不确定你需要挖掘什么类型的数据,重要的是切片机制,上面以文本为中心的代码很好地证明了这一点。