node环境中集成了对文件的读写操作,通常我们利用writeFile和readFile对文件进行读写,但是readFile是一次性对文件全部读入内存,然后写入,这样做常规上没什么问题,但是如果内容太小或者想要分段读写,就会力不从心
const fs = require("fs")
fs.readFile('./test1.txt',(err,obj)=>{
if(err)
throw err
console.log(obj.toString())
fs.writeFile('./test2.txt',obj,(err,mes)=>{
if(err)
throw err
console.log(mes)
})
})
在node中可以利用read和write函数,对读入的文件进行操作
const fs = require("fs")
const buf = Buffer.alloc(30) //分配30个字节空间
fs.open("./test1.txt",(err,fd)=>{
// fd表示从文件读取内容,默认数字从3开始
if(err){
throw err
}
// 从fd读,然后写入buf,从第三个位置开始写,写九个位置,最后一个3表示从fd的第三个位置开始读
// vscode utf-8中汉字占三个字节
fs.read(fd,buf,3,9,3,(err,file)=>{
// 原文:繁华声遁入空门
// 读入:华声遁
console.log(buf.toString())
})
})
fs.open("./test3.txt","w",(err,fd)=>{
// 从buf的第三个位置开始读,读三个位置,从文件的第0个位置开始写入
fs.write(fd,buf,3,3,0,(err,wfile)=>{
console.log(buf.toString())
// 写入:华
})
})
利用可读流可以时刻对文件读取进行控制
const fs = require("fs")
// 创建可读流
const rs = fs.createReadStream('test1.txt')
const ws = fs.createWriteStream("test4.txt")
// 开始监听文件的操作
rs.on('open',(fd)=>{
console.log(fd)
})
let arr = []
rs.on('data',(chunk)=>{
//从内存中拿数据的时候执行此操作
arr.push(chunk)
})
// 结束时触发
rs.on("end",()=>{
console.log(Buffer.concat(arr).toString())
ws.write(Buffer.concat(arr))
})
pipe函数实际就是对可读流的一种封装
const fs = require("fs")
const rs = fs.createReadStream("test1.txt")
const ws = fs.createWriteStream("test5.txt")
rs.pipe(ws)