1.流式读取:
const readstream = fs.createReadStream('test.mp4');
let i = 0;
console.time('readtime');
readstream.on('readable', () => {
let chunk = readstream.read(8192 * 1024);
while (null !== chunk) {
console.log(`file${++i} md5: ${md5(chunk)}`);
chunk = readstream.read(8192 * 1024);
}
});
readstream.on('close', () => {
console.timeEnd('readtime');
});
2.同步读取
const partialFSReadSync = (path: string, start: number, end: number) => {
if (start < 0 || end < 0 || end < start || end - start > 0x3fffffff) {
throw new Error('bad start, end');
}
if (end - start === 0) {
return new Buffer(0);
}
const buf = new Buffer(end - start);
const fd = fs.openSync(path, 'r');
fs.readSync(fd, buf, 0, end - start, start);
fs.closeSync(fd);
return buf;
};
const stat = fs.statSync('test.mp4');
const size = stat.size;
let currentId = 0;
let start = 0;
let end = 0;
console.time('readtime');
while (true) {
if (end >= size) { break; }
start = currentId * 8192 * 1024;
end = (currentId + 1) * 8192 * 1024;
const chunk = partialFSReadSync('test.mp4', start, end);
console.log(`file${++currentId} md5: ${md5(chunk)}`);
}
console.timeEnd('readtime');
3.异步读取
let currentId = 0;
let start = true;
console.time('readtime');
fs.open('test.mp4', 'r', (err, fd) => {
while (start) {
const buff = Buffer.alloc(8192 * 1024);
fs.read(fd, buff, 0, buff.length, null, (err, bytesRead, chunk) => {
if (bytesRead) {
console.log(`file${++currentId} md5: ${md5(chunk.slice(0, bytesRead))}`);
} else {
start = false;
console.timeEnd('readtime');
fs.closeSync(fd);
}
});
}
});
4.异步读取promise版
let currentId = 0;
console.time('readtime');
const FileHandle = await fsPromise.open('mojito.mp4', 'r');
while (true) {
const { bytesRead, buffer } = await FileHandle.read(Buffer.alloc(8192 * 1024), 0, 8192 * 1024, null);
if (bytesRead) {
console.log(`md5 file ${++currentId}:${md5(buffer.slice(0, bytesRead))}`);
} else {
break;
}
}
await FileHandle.close();
console.timeEnd('readtime');
效率上:3>1>2