在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的理解的更多相关文章

  1. nodejs中stream相关资料

    nodejs中流(stream)的理解 nodejs stream 手册完整中文版本 nodejs stream详细使用介绍

  2. nodejs中流(stream)的理解

    nodejs的fs模块并没有提供一个copy的方法,但我们可以很容易的实现一个,比如: var source = fs.readFileSync('/path/to/source', {encodin ...

  3. nodejs基础 -- Stream流

    nodejs 的 Stream 是一个抽象接口,node中有很多对象实现了这个接口.例如,对http服务器发起请求的request对象就是一个Stream,还有stdout(标准输出)也是一个Stre ...

  4. 理解nodejs中的stream(流)

    阅读目录 一:nodeJS中的stream(流)的概念及作用? 二:fs.createReadStream() 可读流 三:fs.createWriteStream() 可写流 回到顶部 一:node ...

  5. 关于java中Stream理解

    关于java中Stream理解 Stream是什么 Stream:Java 8新增的接口,Stream可以认为是一个高级版本的Iterator.它代表着数据流,流中的数据元素的数量可以是有限的, 也可 ...

  6. [NodeJs系列][译]理解NodeJs中的Event Loop、Timers以及process.nextTick()

    译者注: 为什么要翻译?其实在翻译这篇文章前,笔者有Google了一下中文翻译,看的不是很明白,所以才有自己翻译的打算,当然能力有限,文中或有错漏,欢迎指正. 文末会有几个小问题,大家不妨一起思考一下 ...

  7. 深入理解nodejs中的异步编程

    目录 简介 同步异步和阻塞非阻塞 javascript中的回调 回调函数的错误处理 回调地狱 ES6中的Promise 什么是Promise Promise的特点 Promise的优点 Promise ...

  8. 大熊君大话NodeJS之------Stream模块

    一,开篇分析 流是一个抽象接口,被 Node 中的很多对象所实现.比如对一个 HTTP 服务器的请求是一个流,stdout 也是一个流.流是可读,可写或兼具两者的. 最早接触Stream是从早期的un ...

  9. 详解Java 8中Stream类型的“懒”加载

    在进入正题之前,我们需要先引入Java 8中Stream类型的两个很重要的操作: 中间和终结操作(Intermediate and Terminal Operation) Stream类型有两种类型的 ...

随机推荐

  1. 初学c# -- 学习笔记(五) winfrom自定义滚动条

    找了些例子,要么庞大.要么搞个安装组件什么的,我要求能用就行了.实在找例子修改麻烦,就做了一个.其实实现挺简单,就是panel或图片什么的跟着鼠标走就行了. 这里panel自己可以加背景图或直接搞个图 ...

  2. jquery 时间控件怎么能禁止输入只能选择日期?

    jsp一个input输入框用的是easyui时间控件,现在问题是如何是这个input只能点击选择日期,而禁止手动输入 解决方法::: 在日期的input标签里面添加::::editable=" ...

  3. 利用GCTA工具计算复杂性状/特征(Complex Trait)的遗传相关性(genetic correlation)

    如文章"Genome-wide Complex Trait Analysis(GCTA)-全基因组复杂性状分析"中介绍的GCTA,是一款基于全基因组关联分析发展的分析工具,除了计算 ...

  4. Volley简单封装

    public interface IRequest { /** * 获取头部信息 * * @return */ public Map<String, String> getHeaderMa ...

  5. linux学习之——vim简明教程

    摘自  http://blog.csdn.net/niushuai666/article/details/7275406 ——————————正文开始—————————— 你想以最快的速度学习人类史上 ...

  6. redis集群安装

    1.普通安装 安装环境 centos 6.8 1.安装必要包 yum install gcc yum -y install wget 2.下载解压 wget http://download.redis ...

  7. 深入理解display属性

    display 属性在网页布局中很常见,但是之前一直不了解他的各个属性的区别,只是简单的使用block.none属性,对于其他属性都不清楚,今天详细的学习和实践display属性的各个方面 定义 di ...

  8. C#实现自动单击

    最新玩了一下上学时候玩的游戏,但游戏里面变化太多了,进去后等级就很高,要不停地点击鼠标加技能. 所以利用工作中常用的C#调用 API不停地点击鼠标. 如图: 为方便在基础上修改,我把整个解决方案放到百 ...

  9. Flask备注二(Configurations, Signals)

    Flask备注二(Configuration, Signals) Flask是一个使用python开发Web程序的框架.依赖于Werkzeug提供完整的WSGI支持,以及Jinja2提供templat ...

  10. Winform打砖块游戏制作step by step第6节---双缓冲应用

    一 引子 为了让更多的编程初学者,轻松愉快地掌握面向对象的思考方法,对象继承和多态的妙用,故推出此系列随笔,还望大家多多支持. 二 本节内容---双缓冲应用 1.  主界面截图如下: 2.  什么是双 ...