1.1 文件的写入操作
文件的简单写入:直接一次性把全部内容写入。
const fs = require('fs')
fs.writeFile('./a.txt', 'new学习node的一天', {
flag: 'a'
}, (err) => {
if (!err) {
console.log('文件写入成功')
} else {
console.log(err)
}
})
解释:第一个参数是路径,第二个是写入的数据,第三个是可选参数(是一个配置对象,里面最常用的属性是flag,它的默认值是:‘w’,意思是覆盖以前的内容,还有另一个值是:‘a’,大概是append这个单词的缩写,就在原有的内容上追加内容。)第四个是一个回调函数:回调函数的形参只有一个:err。
文件的写入流:写入流就是分段的写入,一段一段的写入,写完要关闭,不然写入流会一直占用cpu。当要写入的数据过大的时候,我们可以采用写入流的方式去写入数据,如果使用简单写入可以导致服务器报错,因为文件过大,服务器内存不够。
const fs = require('fs')
// 创建流
const ws = fs.createWriteStream('./a.txt', {
flags: 'a' // 这里也是append,追加的意思
})
// 监听流是否开启
ws.on('open', () => {
console.log('可写流开启')
})
// 监听流是否关闭
ws.on('close', () => {
console.log('可写流关闭')
})
ws.write('haha')
ws.write('shanbi')
ws.close() // 如果node的版本在8或者低于8,建议使用ws.end()来关闭写入流
ws.end() // 另一种关闭流的方法
1.2 文件的读取操作
文件的简单读取:直接一次性读取。
const fs = require('fs')
fs.readFile('./a.txt', (err, data) => {
if (err) {
return console.log(err)
}
console.log(data.toString()) // 将二进制转换成我们看得到的懂得字符。这个是buffer的tostring。
})
注:由于node的设计原则是:错误优先,所以大部分的回调函数的第一个参数就是err
文件的读取流:分段分段的读取文件
const fs = require('fs')
const rs = fs.createReadStream('./a.txt')
// 监听可读流是否开启
rs.on('open', () => {
console.log('开启可读流')
})
// 监听可读流是否关闭
rs.on('close', () => {
console.log('关闭可读流')
})
// 自动触发data事件,进行读取
rs.on('data', (data) => {
console.log(data.toString())
})
注:文件的可读流是会自动关闭的,我们无需关闭。
1.3 可读流和可写流的综合使用
const fs = require('fs')
const rs = fs.createReadStream('./a.txt')
const ws = fs.createWriteStream('./b.txt')
rs.on('open', () => {
console.log('开启可读流')
})
rs.on('close', () => {
console.log('关闭可读流')
ws.close() // 为了确保写入完成,我们需要在可读流关闭后才去关闭可写流
})
ws.on('open', () => {
console.log('开启可写流')
})
ws.on('close', () => {
console.log('关闭可写流')
})
rs.on('data', (data) => {
ws.write(data)
})
注:这里主要是注意可写流的关闭时机。必须在可读流关闭后才才关闭,否则会导致写入错误!