更详细的的文档说明 https://nodejs.cn/api/fs.html

一、使用 fs 模块

读取文件

读取文本

var fs = require('fs')

fs.readFile('js/2.js','utf-8', function (err, data) {
    if (err) {
        console.log(err)
    } else {
        console.log(data)
    }
})

var fs = require('fs')

导入文件读写模块fs并存入变量fs

readFile(文件,编码,回调函数)

读取文件的方法,需要三个参

编码为必须,不写默认为二进制读取

function (err, data)

回调函数,err 错误信息 data 读取的数据

没有错误errbull

可以优化为箭头函数

fs.readFile('js/2.js', 'utf-8', (err, data) => {
    if (err) {
        console.log(err)
    } else {
        console.log('读取好了' + data)
    }
})

读取二进制数据

fs.readFile('js/2.js', function (err, data) {
    if (err) {
        console.log(err)
    } else {
        console.log(data)
    }
})

由于没有传入编码,所以编码默认为null

读取返回的是例如下面的二进制数据

Buffer(158) [102, 117, 110, '...']

写入数据

fs.writeFile('js/2.js', data, function (err) {
    if (err) {
        console.log(err)
    } else {
        console.log('写好了')
    }
})

writeFile(文件,数据,回调函数)

写入数据的方法

同步

以上操作默认为异步,如果需要同步

fs.readFileSync()
fs.writeFileSync()

二、使用 fs 的 stream

1. 为什么要使用?

readFile 是一口气吃完整个文件再给你

createReadStream 是一口一口吃一口一口咽

除非文件很大(如大于1M的图片音乐等),不使用createReadStream

fs.createReadStream 更适合处理大文件。

fs.createReadStream 创建一个读取文件的流,并且可以逐块读取和发送文件(data事件可能会有多次,每次传递的chunk是流的一部分数据。),而不需要一次性将整个文件加载到内存中。这使得 fs.createReadStream 能够处理非常大的文件,而不会消耗过多的内存。

相比之下,fs.readFile 会一次性将整个文件读入内存,如果文件非常大,这可能会消耗大量的内存,并可能导致 Node.js 进程崩溃。

读取流中每个区块的大小

创建一个读取流时,你可以指定一个选项 highWaterMark 来控制每次读取的数据块的大小。highWaterMark 的默认值是 64KB(对于 fs 模块)。

读取文件

基本示例:

const fs = require('fs')

// 怎么读,读什么
var rs = fs.createReadStream('2.js', 'utf-8')

// 在读了
rs.on('data', function (chunk) {
    console.log(chunk);
});

// 读完了
rs.on('end', function () {
    console.log('END');
});

// 读不了
rs.on('error', function (err) {
    console.log('ERROR: ' + err);
});

写入文件

基本示例:

const fs = require('fs')

// 如果文件没有会创建
var rs = fs.createWriteStream('2.js', 'utf-8')

rs.on('finish', () => {
    // 成功事件(在end()后) 
    console.log("finish")
}).on('error', (e) => {
    // 异常事件
    console.log("error!" + e)
})

// 途中多次write会追加写入
rs.write("你好")
rs.write("\n")
rs.write("Magic Node.js")

// 结束写入
rs.end()