Node.js 使用 fs 模块做文件 copy 的四种方法
首先引入文件模块 var fs = require('fs');
Method 1
function copy(src, target) {
console.log(target);
fs.writeFileSync(target, fs.readFileSync(src));
}
- 代码简短清晰
- 同步读取文件,容易阻塞
- 读取大文件时,容易内存溢出
- 尝试复制一个1.5G的电影 结果内存轻松溢出如图
Method 2
function copy(src, target) {
var rs = fs.createReadStream(src),
ws = fs.createWriteStream(target);
fs.on('data', function(chunk) {
console.log('read');
ws.write(chunk, function() {
console.log('write');
})
})
fs.on('end', function() {
ws.end();
})
}
- 读取大文件时不太容易导致内存溢出
- 代码比较复杂
- 由于读取和写入的速度不一样,同样存在内存溢出的风险,不过比 Method 1 好很多
Method 3
根据 Method 2 改进
function copy(src, target) {
var rs = fs.createReadStream(src),
ws = fs.createWriteStream(target);
fs.on('data', function(chunk) {
console.log('read');
if (ws.write(chunk, function() {
console.log('write');
}) === false) {
rs.pause();
} else {
rs.resume();
}
})
fs.on('end', function() {
ws.end();
})
}
- 同步了读取和写入的速度,没有内存溢出的风险
- 代码比较复杂
Method 4
node中支持pipe方法,类似于管道,将读出来的内容通过管道写入到目标文件中
function copy(src, target) {
fs.createReadStream(src).pipe(fs.createWriteStream(target));
}
- 代码简洁
- 没有内存溢出的风险
1.64G 的文件用了20秒复制完毕,没有内存溢出
posted on 2023-05-11 02:19 zhangzongshan 阅读(514) 评论(0) 编辑 收藏 举报