nodejs中Stream的理解
在nodejs中可以通过fs模块读写文件,我们来看下fs模块提供的接口:
fs.readFile(filename, callback)
异步读取文件。
filename是读取文件的文件名,如果是相对路径,则通过当前进程执行的路径来查找文件。
回调函数有两个参数callback(err, buffer)
第一个参数为err(如果没有报错,该参数值为null),进行操作时,应先判断err是否有值。
第二个参数是代表文件内容的Buffer实例。
fs.writeFile(filename, content [, encode], callback)
异步写入文件,content为写入内容字符串, encode为编码(默认utf8)
对应的cb回调函数中只有err一个参数(若无报错为null);
这两个方法有相应的同步版本:
fs.readFileSync(filename [,encode])
第二个参数可以是表示编码的字符串,也可以是一个配置对象({encoding: null, flag: 'r'})
即默认编码是null,读取模式为r(只读)。
如果不指定编码方式,fs返回一个表示文件内容的Buffer实例,否则返回字符串。
fs.writeFileSync(filename, content, encode)
filename表示文件名,content是要写入的字符串内容,encode是文件内容编码方式。
通过这几个接口我们可以完成简单的文件读写工作:
var fs = require('fs');
var source = fs.readFileSync('/path/to/source', {encoding: 'utf8'});
fs.writeFileSync('/path/to/dest', source);
上面几个接口,无论是异步或是同步,都是等文件读取完成,才进行操作的。
如果操作对象是一些小文件,这种操作没有什么问题。
但是在服务器端,文件体积一般很庞大,用这种方式效率低下,导致线程阻塞,
甚至会因为内存不足而崩溃。
这里要引用Stream流的概念。
nodejs中Stream是EventEmitter的实现,你可以理解为在程序后台打开了一个文件(不占用主线程),
程序会一点一点的读取(写入)文件,通过事件和回调来完成文件的读写。来看个例子
var fs = require('fs');
// 创建一个可读流
var readStream = fs.createReadStream('/path/to/source');
var writeStream = fs.createWriteStream('/path/to/dest');
readStream.on('data', function(chunk){
// 可读流收到data事件时,将内容写入到可写流
writeStream.write(chunk);
});
readStream.on('end', function(){
// 当可读流读取完成,会发出end事件,这时我们要把可写流关闭
writeStream.end();
});
当调用fs.createReadStream时,相当于创建了一个文件读取流。
可以通过监听data事件,来获取读取的部分数据,来进行一些操作。
也可以用pipe的写法:
fs.createReadStream('/path/to/source')
.pipe(fs.createWriteStream('/path/to/dest'))
nodejs中Stream的理解的更多相关文章
- nodejs中stream相关资料
nodejs中流(stream)的理解 nodejs stream 手册完整中文版本 nodejs stream详细使用介绍
- nodejs中流(stream)的理解
nodejs的fs模块并没有提供一个copy的方法,但我们可以很容易的实现一个,比如: var source = fs.readFileSync('/path/to/source', {encodin ...
- nodejs基础 -- Stream流
nodejs 的 Stream 是一个抽象接口,node中有很多对象实现了这个接口.例如,对http服务器发起请求的request对象就是一个Stream,还有stdout(标准输出)也是一个Stre ...
- 理解nodejs中的stream(流)
阅读目录 一:nodeJS中的stream(流)的概念及作用? 二:fs.createReadStream() 可读流 三:fs.createWriteStream() 可写流 回到顶部 一:node ...
- 关于java中Stream理解
关于java中Stream理解 Stream是什么 Stream:Java 8新增的接口,Stream可以认为是一个高级版本的Iterator.它代表着数据流,流中的数据元素的数量可以是有限的, 也可 ...
- [NodeJs系列][译]理解NodeJs中的Event Loop、Timers以及process.nextTick()
译者注: 为什么要翻译?其实在翻译这篇文章前,笔者有Google了一下中文翻译,看的不是很明白,所以才有自己翻译的打算,当然能力有限,文中或有错漏,欢迎指正. 文末会有几个小问题,大家不妨一起思考一下 ...
- 深入理解nodejs中的异步编程
目录 简介 同步异步和阻塞非阻塞 javascript中的回调 回调函数的错误处理 回调地狱 ES6中的Promise 什么是Promise Promise的特点 Promise的优点 Promise ...
- 大熊君大话NodeJS之------Stream模块
一,开篇分析 流是一个抽象接口,被 Node 中的很多对象所实现.比如对一个 HTTP 服务器的请求是一个流,stdout 也是一个流.流是可读,可写或兼具两者的. 最早接触Stream是从早期的un ...
- 详解Java 8中Stream类型的“懒”加载
在进入正题之前,我们需要先引入Java 8中Stream类型的两个很重要的操作: 中间和终结操作(Intermediate and Terminal Operation) Stream类型有两种类型的 ...
随机推荐
- 日常维护sql
修复mysqlcheck -u -p --repair pmdb prefix="/export/data/mysql/bin/mysql -u -p -e" domain=机房 ...
- MongoDB Replica Set 选举过程
什么是选举? 选举是副本集选择某个成员成为primary的过程.primary是一个副本集中唯一能够接收写操作的成员. 下面的事件能够引发一次选举: 第一次初始化一个副本集 Primary失效.rep ...
- 初探C++Primer(15.面向对象程序设计)
最近在恶补OOP相关知识,很遗憾学校的课没选上,于是只能上网购进C++Primer一本,开始重学C++之旅... (壮哉我大ZJU,网购半天到货XDD) 学习路线 7.类->13.类设计者的工具 ...
- PCIE学习
PCIe在传输中用8b/10b编码,所以单PCEe2.0的有效带度是4Gb/s x2模式将用于内部接口而非插槽模式 PCIe卡能使用在至少与之传输通道相当的插槽上(例如x1接口的卡也能工作在x4或x1 ...
- iconv将文件编码从gb2312 转换为utf-8
iconv命令用于转换指定文件的编码,默认输出到标准输出设备,亦可指定输出文件. 用法: iconv [选项...] [文件...] 有如下选项可用: 输入/输出格式规范:-f, --from-cod ...
- Oracle RMAN 恢复控制文件到指定的路径
Oracle 数据库通过RMAN恢复控制文件到指定的路径 --------------------------------------------------------- 先查询备份集信息,再指定备 ...
- (转)jquery easyui treegrid使用小结 (主要讲的是如何编辑easyui中的行信息包括添加 下拉列表等)
在实际应用中可能会碰到不同的需求,比如会根据每行不同的参数或属性设置来设置同列不同的editor类型,这时原有的例子就显的有点太过简单,不能实现我们的需求,现在应用我在项目中的操作为例,显示下实现同列 ...
- python:爬虫
模块: (1)url管理器:对url进行管理 (2)网页下载器(urllib2):将需要爬取的url指定的网页以字符串的形式下载下来 (3)网页解释器(BeautifulSoup):解析 利用urll ...
- (转)java缓存技术,记录
http://blog.csdn.net/madun/article/details/8569860 最近再ITEYE上看到关于讨论JAVA缓存技术的帖子比较多,自己不懂,所以上网大概搜了下,找到一篇 ...
- redirect和forward
1.重定向 <mvc:view-controller path="/" view-name="redirect:/admin/index"/>即如果 ...