fs.read(fd,buffer,offest,length,position,callback)
fd:文件描述符。由open函数返回
buffer:被写入数据的缓冲区。缓存从文件中读取的数据
offset:偏移量,描述的是写入缓冲区的位置
length:表示从文件中读取的字节数
position:表示从文件中读取数据的位置,若为null,表示从当前位置开始读
callback:回调函数
// 导入fs模块
const fs = require('fs');
//创建Buffer缓冲区
let buf = Buffer.alloc(1024);//缓冲区共有1024个单元(字节),每个单元存储的数据只能有0-255
//打开文件
fs.open('input.txt','r+',function (err,fd){//fd是被打开文件的描述符
if(err){
return console.error(err);
}
fs.read(fd,buf,0,buf.length,0,function (err,bytes){//bytes表示从文件中实际读取的字节数
if(err){
return console.error(err);
}
if(bytes>0){ //表示从文件中已经读取到了数据
console.log(buf.slice(0,bytes).toString());//将缓冲区中有数据的转换成字符串输出
}
})
})
fs.close(fd,callback)
fd:文件描述符。由open函数返回 callback:回调函数
fs.close(fd,function (err){
if(err){
return console.log('关闭失败~',err)
}
})
fs.write(fd,buffer[,offset[,length[,position]]],callback)//将buffer中的数据写入fd所描述的文件中
写入时若文件不存在则新建文件,若文件存在则覆盖源文件
let buf = new Buffer([0x41,0x42,0x43])
fs.open('input.txt','w+',(err,fd)=>{
if(err){
return console.error(err)
}
fs.write(fd,buf,(err)=>{
if(err){
console.log('写入失败~',err);
}
})
fs.close(fd);
})
fs.appendFile(path,data[,options],callback)
path:文件全名(路径和文件名)
data:要追加的数据
callback:回调函数
fs.mkdir(path,[,model],callback)
path:目录名(包含有路径)
model:可选的,表示目录的权限
callback:回调函数
fs.mkdir('./dd',(err)=>{
if(err){
throw err;
}
console.log('目录创建成功~')
})
fs.readdir(path,callback)
path:目录名(包含有路径)
callback:回调函数。两个参数(err.files),files中放的是读取目录中的文件和子目录信息
fs.rmdir(path,callback)
path:目录名(包含有路径)
callback:回调函数
fs.rmdir('dd',(err)=>{
if(err){
throw err;
}
console.log('删除成功~');
}
(1)传统方式:先将数据全部读入缓存(内存),然后再进行处理。
优点:符合人的思维方式,流程比较流畅
缺点:对于数据量较大的文件,处理效率较低
(2)'数据流'方式:读一块,处理一块。将待处理的数据分割成一块一块的,像流水一样。每当有新的数据块进入内存时会触发一个事件,程序就从内存中获取新数据进行处理
优点:程序处理数据的效率高
(1)readable —— 用于读操作的数据流
(2)writable —— 用在写操作的数据流
(3)Duplex —— 可以用于读取和写入操作
(4)Transform —— 输出基于输入的地方进行计算的一种双向流
(1)data —— 当流中有数据可读取时触发。data是事件名
(2)end —— 当流中没有数据时触发。end是事件名
(3)error —— 当有任何错误或接收数据写入触发。error是事件名
(4)finish —— 当所有数据已刷新到底层系统时触发。finish是事件名
fs.createReadStream(文件全名)
// 数据流
const fs = require('fs');
let str = '';//存储从流中读取的数据
// 1.创建数据流
let redStream = fs.createReadStream('input.txt');
// 2.设置数据流的字符集
redStream.setEncoding('utf8');
// 3.注册data事件:若该事件被触发,说明数据流中有数据了,数据会读到回调函数的val中,再将val保存到str中
redStream.on('data',function (val){
str += val;
})
// 4、注册end事件:若该事件被触发,说明流中没有数据可读,表示读取结束
redStream.on('end',function (){
console.log(str);
})
// 5、注册error事件:若该事件被触发,表示读取流过程中出现错误,输出错误信息栈的信息
redStream.on('error',function(err){
console.error(err,stack);
})
console.log('程序结束~')
fs.creatWriteStream(文件名)
const fs = require('fs');
let str = '今天周四~'; //将该字符串写入到文件中
// 1、创建写入流
let writeStream = fs.createWriteStream('./output.txt');
// 2、设置写入流的字符集:先写入缓存
writeStream.write(str,'utf8');
// 3、写入结束
writeStream.end();
// 4、触发事件:finish
writeStream.on('finish',function (){
console.log('写入完成~')
})
// 5、触发error
writeStream.on('error',(err)=>{
console.error(err,stack)
})
console.log('主程序结束~');
const fs = require('fs');
// 1、创建一个输入流:用于读取数据
let readStream = fs.createReadStream('input.txt');
// 2、创建一个输出流,用于写数据
let writeStream = fs.createWriteStream('./output.txt');
// 3、通过输出流调用方法:将数据送入输出流中
readStream.pipe(writeStream);
// 4、测试
console.log('主程序结束~')
const fs = require('fs');
const zlib = require('zlib');//压缩与解压缩的模块
fs.createReadStream('input.txt')
.pipe(zlib.createGzip()) //创建压缩包
.pipe(fs.createWriteStream('./input.zip'))//生成压缩文件
(2) 解压缩
const fs = require('fs');
const zlib = require('zlib');
fs.createReadStream('./input.zip')
.pipe(zlib.createGunzip())//创建一个解压缩的对象,通过管道连接到解压缩对象
.pipe(fs.createWriteStream('./gun.txt'))//通过管道连接输出流