<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      nodejs中流(stream)的理解

      nodejs的fs模塊并沒有提供一個copy的方法,但我們可以很容易的實現一個,比如:

      var source = fs.readFileSync('/path/to/source', {encoding: 'utf8'});
      fs.writeFileSync('/path/to/dest', source);
      

      這種方式是把文件內容全部讀入內存,然后再寫入文件,對于小型的文本文件,這沒有多大問題,比如grunt-file-copy就是這樣實現的。但是對于體積較大的二進制文件,比如音頻、視頻文件,動輒幾個GB大小,如果使用這種方法,很容易使內存“爆倉”。理想的方法應該是讀一部分,寫一部分,不管文件有多大,只要時間允許,總會處理完成,這里就需要用到流的概念。

      如上面高大上的圖片所示,我們把文件比作裝水的桶,而水就是文件里的內容,我們用一根管子(pipe)連接兩個桶使得水從一個桶流入另一個桶,這樣就慢慢的實現了大文件的復制過程。

      Stream在nodejs中是EventEmitter的實現,并且有多種實現形式,例如:

      • http responses request
      • fs read write streams
      • zlib streams
      • tcp sockets
      • child process stdout and stderr

      上面的文件復制可以簡單實現一下:

      var fs = require('fs');
      var readStream = fs.createReadStream('/path/to/source');
      var writeStream = fs.createWriteStream('/path/to/dest');
      
      readStream.on('data', function(chunk) { // 當有數據流出時,寫入數據
          writeStream.write(chunk);
      });
      
      readStream.on('end', function() { // 當沒有數據時,關閉數據流
          writeStream.end();
      });
      

      上面的寫法有一些問題,如果寫入的速度跟不上讀取的速度,有可能導致數據丟失。正常的情況應該是,寫完一段,再讀取下一段,如果沒有寫完的話,就讓讀取流先暫停,等寫完再繼續,于是代碼可以修改為:

      var fs = require('fs');
      var readStream = fs.createReadStream('/path/to/source');
      var writeStream = fs.createWriteStream('/path/to/dest');
      
      readStream.on('data', function(chunk) { // 當有數據流出時,寫入數據
          if (writeStream.write(chunk) === false) { // 如果沒有寫完,暫停讀取流
              readStream.pause();
          }
      });
      
      writeStream.on('drain', function() { // 寫完后,繼續讀取
          readStream.resume();
      });
      
      readStream.on('end', function() { // 當沒有數據時,關閉數據流
          writeStream.end();
      });
      

      或者使用更直接的pipe

      // pipe自動調用了data,end等事件
      fs.createReadStream('/path/to/source').pipe(fs.createWriteStream('/path/to/dest'));
      

      下面是一個更加完整的復制文件的過程

      var fs = require('fs'),
          path = require('path'),
          out = process.stdout;
      
      var filePath = '/Users/chen/Movies/Game.of.Thrones.S04E07.1080p.HDTV.x264-BATV.mkv';
      
      var readStream = fs.createReadStream(filePath);
      var writeStream = fs.createWriteStream('file.mkv');
      
      var stat = fs.statSync(filePath);
      
      var totalSize = stat.size;
      var passedLength = 0;
      var lastSize = 0;
      var startTime = Date.now();
      
      readStream.on('data', function(chunk) {
      
          passedLength += chunk.length;
      
          if (writeStream.write(chunk) === false) {
              readStream.pause();
          }
      });
      
      readStream.on('end', function() {
          writeStream.end();
      });
      
      writeStream.on('drain', function() {
          readStream.resume();
      });
      
      setTimeout(function show() {
          var percent = Math.ceil((passedLength / totalSize) * 100);
          var size = Math.ceil(passedLength / 1000000);
          var diff = size - lastSize;
          lastSize = size;
          out.clearLine();
          out.cursorTo(0);
          out.write('已完成' + size + 'MB, ' + percent + '%, 速度:' + diff * 2 + 'MB/s');
          if (passedLength < totalSize) {
              setTimeout(show, 500);
          } else {
              var endTime = Date.now();
              console.log();
              console.log('共用時:' + (endTime - startTime) / 1000 + '秒。');
          }
      }, 500);
      
      

      可以把上面的代碼保存為copy.js試驗一下

      我們添加了一個遞歸的setTimeout(或者直接使用setInterval)來做一個旁觀者,每500ms觀察一次完成進度,并把已完成的大小、百分比和復制速度一并寫到控制臺上,當復制完成時,計算總的耗費時間,效果如圖:

      我們復制了一集1080p的權利的游戲第四季第7集,大概3.78G大小,由于使用了SSD,可以看到速度還是非常不錯的,哈哈哈~
      復制完成后,顯示總花費時間

      結合nodejs的readline, process.argv等模塊,我們可以添加覆蓋提示、強制覆蓋、動態指定文件路徑等完整的復制方法,有興趣的可以實現一下,實現完成,可以

      ln -s /path/to/copy.js /usr/local/bin/mycopy
      

      這樣就可以使用自己寫的mycopy命令替代系統的cp命令

      posted @ 2015-12-05 20:54  櫻良orz  閱讀(498)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 欧美黑人添添高潮a片www| 国产自拍一区二区三区在线| 国产国产久热这里只有精品| 55大东北熟女啪啪嗷嗷叫| 亚成区成线在人线免费99| 国产精品久久久福利| 国产欧美日韩精品第二区| 久久精品国产99国产精品澳门| 和田县| 18禁黄无遮挡网站免费| 国产午夜精品理论大片 | 久久伊99综合婷婷久久伊| 中文字幕久久国产精品| 国产精品午夜福利合集| 日韩av色一区二区三区| 亚洲国产成人无码av在线影院 | 精品无码久久久久久尤物| 91老熟女老女人国产老| 男受被做哭激烈娇喘gv视频| 日韩人妻久久精品一区二区| 在线视频观看| 久久国产精品波多野结衣| 日韩乱码人妻无码中文字幕视频| 欧美巨大巨粗黑人性aaaaaa| 久青草视频在线免费观看| 精精国产XXX在线观看| 深夜av免费在线观看| 蜜臀av日韩精品一区二区| 99久久亚洲精品无码毛片| 亚洲国产综合av在线观看| 国产在线一区二区不卡| 都江堰市| 色综合久久夜色精品国产| 久久发布国产伦子伦精品| 日本中文一区二区三区亚洲| 精品国产色情一区二区三区| 国产成人亚洲精品狼色在线| 日本道高清一区二区三区| 特黄大片又粗又大又暴| 国产精品亚洲专区无码导航| 免费a级毛片18以上观看精品|