MST

星途 面试题库

面试题:JavaScript在Node中如何高效地实现大文件的分块写入

假设要向磁盘写入一个非常大的文件,出于性能考虑需要分块写入。请用JavaScript在Node环境下实现这一功能,要求使用流(stream)相关知识,包括可读流和可写流,并处理好流的事件(如data、end等)以确保文件正确写入。
20.3万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
const fs = require('fs');
const path = require('path');

function writeLargeFileInChunks(inputFilePath, outputFilePath, chunkSize = 1024 * 1024) {
    const readStream = fs.createReadStream(inputFilePath, {
        highWaterMark: chunkSize
    });
    const writeStream = fs.createWriteStream(outputFilePath);

    readStream.on('data', (chunk) => {
        writeStream.write(chunk);
    });

    readStream.on('end', () => {
        writeStream.end();
    });

    writeStream.on('finish', () => {
        console.log('文件已成功写入');
    });

    readStream.on('error', (err) => {
        console.error('读取文件时出错:', err);
    });

    writeStream.on('error', (err) => {
        console.error('写入文件时出错:', err);
    });
}

// 示例调用
const inputFile = path.join(__dirname, 'largeFileToRead.txt');
const outputFile = path.join(__dirname, 'largeFileWritten.txt');
writeLargeFileInChunks(inputFile, outputFile);

上述代码的主要逻辑如下:

  1. 引入模块:通过require引入fs模块用于文件操作,path模块用于处理文件路径。
  2. 定义函数writeLargeFileInChunks函数接收输入文件路径、输出文件路径以及可选的分块大小参数(默认为1MB)。
  3. 创建可读流和可写流
    • fs.createReadStream创建可读流,并设置highWaterMark为分块大小,这决定了每次从文件读取的数据量。
    • fs.createWriteStream创建可写流用于写入目标文件。
  4. 事件处理
    • readStreamdata事件,当有数据可读时,将数据写入writeStream
    • readStreamend事件,当可读流读取完毕,结束writeStream写入。
    • writeStreamfinish事件,当写入操作完成,打印成功信息。
    • readStreamwriteStreamerror事件,捕获并打印读取或写入过程中的错误信息。
  5. 示例调用:在函数外部定义输入输出文件路径并调用writeLargeFileInChunks函数实现分块写入大文件。