JavaScript 进阶营技术干货

Node.js 拷贝大文件

2019-03-17  本文已影响0人  Kenny锅

大家一谈到 Node.js,首先提到的就是 Chrome V8 引擎多厉害,不可否认 V8 在内存管理等方面作用非常大。但其实还有一个非常牛的技术常常被大家忽略了,那就是 libuv。

那么 libuv 是什么呢?

libuv is a multi-platform support library with a focus on asynchronous I/O.

libuv 是一个跨平台操作异步I/O的库,Node.js 之所以擅长文件操作,也是大量使用这个技术。不单单是文件操作,Node.js 其他所有无阻塞异步操作都是用的它。

下面我们来展示一下拷贝1G大小文件怎么写,如码所示:

const fs = require('fs');
const path = require('path');
const sourceFile = path.join(__dirname, '../', 'indiv18.zip');
const destFile = path.join(__dirname, 'indiv18.zip');

console.time('copying');
fs.stat(sourceFile, (err, stat) => {
  const fileSize = stat.size;
  let bytesCopied = 0;
  const readStream = fs.createReadStream(sourceFile);
  readStream.on('data', (buffer) => {
    bytesCopied += buffer.length;
    const porcentage = ((bytesCopied / fileSize) * 100).toFixed(3);
    console.log(porcentage + '%');
  });
  readStream.on('end', () => {
    console.timeEnd('copying');
  });
  readStream.pipe(fs.createWriteStream(destFile));
});

用一句话来解释上述代码:将文件以流的形式读取,通过管道传给写文件流的函数,从而实现文件拷贝。

1.032%
1.894%
...
99.997%
100.000%
copying: 3098.074ms

你没有看错,只用了 3 秒。如果把输出进度那个功能去掉,大约是 1 秒多点。

其实我不是在说 Node.js 多好,而是想告诉大家用固态硬盘有多爽,哈哈!

上一篇下一篇

猜你喜欢

热点阅读