Nodejs-文件流

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)+'%');//可以查看进度
			});
		});
	}
});

  

 

 

posted @ 2016-08-25 11:46  GumpYan  阅读(3010)  评论(0编辑  收藏  举报