1.什么是流?
流是程序输入输出的一个连续的字节序列。
有文件流,网络流,设备(例如鼠标,键盘,磁盘,调制解调器和打印机)的输入输出都是用流来处理的。
任何数据的最根本表现形式都是二进制。
读取文件
用异步方式读取
fs.readFile(filename,callback);
异步的方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息(error)。
写入文件
语法
以下为异步模式下写入文件的语法格式:
fs.writeFile(filename, data[, options], callback)
如果文件存在,该方法写入的内容会覆盖旧的文件内容。
参数
参数使用说明如下:
-
path - 文件路径。
-
data - 要写入文件的数据,可以是 String(字符串) 或 Buffer(流) 对象。
-
options - 该参数是一个对象,包含 {encoding, mode, flag}。默认编码为 utf8, 模式为 0666 , flag 为 'w'
-
callback - 回调函数,回调函数只包含错误信息参数(err),在写入失败时返回。
//文件复制 const fs=require('fs'); const path=require('path'); console.time('read'); fs.readFile('D:\nodejs\01.txt',(error,data)=>{ if(error){ throw error } console.timeEnd('read'); console.time('write'); //读取文件拿到 fs.writeFile('D:\nodejs\02.txt',data,error=>{ if(error){ throw error } console.timeEnd('write'); console.log('拷贝完成'); }); });
但是如果大文件的拷贝的话,内存就受不了
而且没有进度的概念,比如说,你拷贝一个很大的文件,一直在拷贝,你不知道已经拷贝到哪了,已经等不及了,就把它给停掉了,这样就造成之前的拷贝白白浪费了。
因此采取文件流的方式复制,就是针对大文件操作的
2.文件流操作方式
获取文件信息
通过异步模式获取文件信息的语法格式:
fs.stat(path, callback)
参数
参数使用说明如下:
-
path - 文件路径。
-
callback - 回调函数,带有两个参数如:(err, stats), stats 是 fs.Stats 对象。
fs.stat(path)执行后,会将stats类的实例返回给其回调函数。可以通过stats类中的提供方法判断文件的相关属性。
//文件流的方式复制 const fs=require('fs'); const path=require('path'); //创建文件的读取流,并没有读出正式的数据,开始了读取文件的任务 var reader=fs.createReadStream('D:\nodejs\03.txt'); //创建一个写入流 var writer=fs.createWriteStream('D:\nodejs\04.txt'); fs.stat('D:\nodejs\01.txt',(err,stats)=>{ if(stats){//如果有stats,就说明文件存在 var readTotal=0; reader.on('data',(chunk)=>{ //chunk是一个buffer(字节数组),每次读取的只是一小部分数据 writer.write(chunk,(err)=>{ console.log('写的进度:'+((readTotal+=chunk.length)/stats.size*100)+'%');//可以查看进度 }); }); } });