node 操作文件流 fs 同步与异步 流式文件的写入与读取
fs
fs ( File System ) 文件系统
在node中通过fs模块来和系统中的文件进行交互
通过fs模块可以对磁盘中的文件做各种增删改查的操作
写入文件
1.同步写入
2.异步写入
3.简单写入
4.流式写入
读取文件
在fs模块中所有的方法都有两个版本
不带sync的,异步方法
带sync的,同步方法
1、同步写入
**1.打开要写入的文件** fs.openSync(path, flags[, mode]) 该方法用来打开一个文件 参数: path:路径,要打开文件的路径 flags:操作的类型,要对文件做什么操作 需要字符串作为参数 "w" 写 "r" 读 "a" 追加 mode:可选参数,一般不传,用来设置文件的权限 返回值: fd 文件的描述符 2.写入并保存 fs.writeSync(fd, string[, position[, encoding]]) 该方法用于向文件中写入内容 参数: fd: 文件的描述符,需要指定要写入文件的描述符 string: 要写入的内容 position: 开始写入的位置 encoding: 写入内容的字符编码,默认utf-8 3.关闭文件 fs.closeSync(fd):: 该方法用来关闭文件 参数: fd 文件的描述符 实例 //引入fs模块 var fs=require('fs'); var fd=fs.openSync('gzl.txt','w'); fs.writeSync(fd,'1111',10,'utf-8'); fs.closeSync(fd);
2.简单文件的写入
简单文件写入 fs.writeFile(file, data[, options], callback) fs.writeFileSync(file, data[, options]) - 参数: file 要写入的文件的路径 data 要写入的内容 options 配置对象(可选) encoding 编码 默认 utf8 flag 操作类型 默认 w mode 文件的权限 默认666,一般不需要传 callback 回调函数,写入完成后会调用该函数
3.异步写入
1.打开文件 fs.open(path, flags[, mode], callback) 参数:callback 回调函数,会在文件打开以后执行 回调函数中会有两个参数: err: 错误信息,如果操作过程中出现了错误,则该对象存在,如果没有出现错误,则该参数的值为null 错误优先 fd: 文件的描述符 2.写入文件 fs.write(fd, string[, position[, encoding]], callback) callback 回调函数会在写入完毕以后执行 参数: err 错误对象 byte 写入的字节数 data 写入的数据 3.关闭文件 fs.close(fd, callback) 异步写入的相关代码::: var fs=require('fs'); fs.open('gzl.txt','a',function (err,fd) { if (!err){ fs.write(fd,'ffffff',10,function (err,bite,data) { if (!err){ console.log('文件写入成功'); }; fs.close(fd,function (err) { if (!err){ console.log('文件已关闭'); }; }); }); }; });
4.流式文件的写入与读取
流式文件写入
其他的文件的写入方式都是一次性将一个内容写入到文件中的,
如果文件太大了则会导致运行速度过慢,会严重影响程序的性能
流式文件写入适合较大的文件写入,可以分多次将多个内容输出到文件中
相关代码: //创建一个可写流(WriteStream) var ws = fs.createWriteStream("hello3.txt"); //为流绑定一个open和close事件,来监听流是否打开和关闭 ws.once("open",function () { console.log("流打开了~~~"); }); ws.once("close",function () { console.log("流关闭了~~~"); }); //通过可写流向文件中输出内容 ws.write("O(∩_∩)O哈哈~"); ws.write("O(∩_∩)O~"); //关闭流 ws.end();
流式文件读取 适合较大的文件读取
相关代码: //创建一个可读流 var rs = fs.createReadStream("C:\\Users\\lilichao\\Desktop\\笔记.mp3"); //创建一个可写流 var ws = fs.createWriteStream("a.mp3"); //监听流的状态 rs.once("open",function () { console.log("可读流已经打开"); }); rs.once("close",function () { console.log("可读流已经关闭"); //关闭可写流 ws.end(); }); ws.once("open",function () { console.log("~~~~可写流已经打开"); }); ws.once("close",function () { console.log("~~~~可写流已经关闭"); }); //要读取一个可读流中的数据,必须要给该流绑定一个data事件 //绑定data事件后,流会自动读取数据,数据读取完毕以后,流会自动关闭 //读取到的数据会通过回调函数的参数的形式返回 rs.on("data",function (data) { //console.log(data.length); //将数据线写入到可写流中 ws.write(data); }); 简单方法:: //创建一个可读流 var rs = fs.createReadStream("C:\\Users\\lilichao\\Desktop\\笔记.mp3"); //创建一个可写流 var ws = fs.createWriteStream("b.mp3"); //将可读流中的数据写入到可写流中 rs.pipe(ws);
5.其他读取文件
相关代码: /* 验证路径是否存在 fs.existsSync(path) 获取文件信息 fs.stat(path, callback) fs.statSync(path) 删除文件 fs.unlink(path, callback) fs.unlinkSync(path) */ var result = fs.existsSync("ab.jpg"); //console.log(result); fs.stat("a.jpg", function (err , stats) { if(!err){ //stats 是一个对象,在该对象中保存了当前文件的状态信息 /* 通过该对象可以获取文件的状态 stats.size 获取文件的大小 stats.isFile() 是否是文件 stats.isDirectory()是否是目录 */ //console.log(stats.isDirectory()); } }); //删除文件 //fs.unlinkSync("hello.txt"); /* 列出文件 fs.readdir(path[, options], callback) fs.readdirSync(path[, options]) 截断文件 fs.truncate(path, len, callback) fs.truncateSync(path, len) 建立目录 fs.mkdir(path[, mode], callback) fs.mkdirSync(path[, mode]) */ /* fs.readdir(".",function (err , files) { if(!err){ //files是一个保存了目录下文件(夹)名字的string数组 console.log(files[0]); } });*/ //截断文件 将文件截断成指定的大小,会丢失数据 //fs.truncateSync("hello2.txt",10); //创建目录 //fs.mkdir("hello"); /* 删除目录 fs.rmdir(path, callback) fs.rmdirSync(path) 重命名文件和目录 fs.rename(oldPath, newPath, callback) fs.renameSync(oldPath, newPath) - 通过该方法也可以实现剪切的功能 监视文件更改写入 fs.watchFile(filename[, options], listener) - 参数: filename 文件名 options 配置对象 listener 回调函数,当前文件发生变化时,该函数将会执行 - curr 表示文件现在的状态 - prev 表示文件修改前的状态 - 这两个对象都是stats对象 */ //fs.rmdir("hello"); /*fs.rename("b.mp3","C:\\Users\\lilichao\\Desktop\\b.mp3",function (err) { if(!err){ console.log("修改成功"); } });*/ fs.watchFile("hello2.txt",{interval:1000},function (curr,prev) { console.log("当前文件的大小为: "+curr.size); console.log("修改前文件的大小为: "+prev.size); });