详解nodeJs文件系统(fs)与流(stream)


Posted in NodeJs onJanuary 24, 2018

一、简介

本文将介绍node.js文件系统(fs)和流(stream)的一些API已经参数使用情况。

二、目录

文件系统将介绍以下方法:

1.fs.readFile

2.fs.writeFile

3.fs.open

4.fs.read

5.fs.stat

6.fs.close

7.fs.mkdir

8.fs.rmdir

9.fs.readdir

10.fs.unlink

stream流的四种类型readable,writable,duplex,transform以及stream对象的事件。

三、文件系统fs主要方法介绍

1、fs.readFile

readFile方法主要是读取文件内容,异步操作。

var fs = require('fs')
fs.readFile('a.txt',function(err,data){
  if (err){
    return console.error(err);
  }else{
    console.log("异步读取: " + data.toString());
  }
})

2、fs.writeFile

writeFile以异步的方式写入文件,fs.writeFile(file, data[, options], callback)

var fs = require('fs')
console.log("准备写入文件")
fs.writeFile('input.txt',"写入的内容",function(err){
  if (err){
    return console.error(err);
  }else{
    console.log("写入成功");
  }
})

3、fs.open()

在异步方式下打开文件,fs.open(path, flags[, mode], callback)

var fs = require("fs");
// 异步打开文件
console.log("准备打开文件");
fs.open('a.txt', 'r+', function(err, fd) {//r+是以读写模式打开,fd为返回的文件描述符
  if (err) {
    return console.error(err);
  }
 console.log("文件打开成功!");   
});

4、fs.read()

此方法为异步方式下读取文件,格式:fs.read(fd, buffer, offset, length, position, callback)

var fs = require("fs");
var buf = new Buffer(1024);

console.log("准备打开文件!");
fs.open('at.txt', 'r+', function(err, fd) {
  if (err) {
    return console.error(err);
  }
  fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){
   if (err){
     console.log(err);
   }
   // 仅输出读取的字节
   if(bytes > 0){
     console.log(buf.slice(0, bytes).toString());
   }
  });
});

5、fs.stat()

此方法为异步方式获取文件信息,格式:fs.stat(path, callback)

fs.stat('fs.js', function (err, stats) {
  console.log(stats.isFile());     //true
})

异步返回的stats类的实例有很多方法,比如stats.isFile()判断是否是文件,stats.isDirectory()判断是否是目录,。。。。。。

6、fs.close()

fs.close()是以异步的方式关闭文件,语法格式:fs.close(fd, callback),参数如下:

d - 通过 fs.open() 方法返回的文件描述符。

callback - 回调函数,没有参数。

7、fs.mkdir()

此方法为创建目录,格式:fs.mkdir(path[, mode], callback),参数如下:

path:路径。

mode:目录权限,默认0777.。

callback:回调,没有参数。

var fs = require("fs");
console.log("创建目录/test/");
fs.mkdir("/test/",function(err){
  if (err) {
    return console.error(err);
  }
  console.log("创建/test目录成功。");
});

8、fs.rmdir()

删除目录,语法格式:fs.rmdir(path,callback)

9、fs.readdir()

此方法为读取目录,语法格式:fs.readdir(path, callback),callback回调函数有两个参数,第一个是err,第二个为目录下的文件数组files。

var fs = require("fs");

console.log("查看 /tmp 目录");
fs.readdir("/tmp/",function(err, files){
  if (err) {
    return console.error(err);
  }
  files.forEach( function (file){
    console.log( file );
  });
});

10、fs.unlink()

此方法作用为删除文件,格式:fs.unlink(path, callback)

var fs = require("fs");

console.log("准备删除文件!");
fs.unlink('input.txt', function(err) {
  if (err) {
    return console.error(err);
  }
  console.log("文件删除成功!");
});

四、stream流类型与事件介绍

1、 stream:流是一个抽象接口,有四种流类型:

  1. readable :可读;
  2. writable :可写操作;
  3. duplex :可读可写操作;
  4. transform :操作被写入数据,然后读出结果。

所有的stream对象都是EventEmitter 的实例,常用事件有:

  1. data:当有数据可读触发,
  2. end:没有数据可读触发,
  3. error:发生错误时触发,
  4. finish:完成触发。

2、从流中读数据

var fs = require("fs");
var data = '';

// 创建可读流
var readerStream = fs.createReadStream('input.txt');

// 设置编码为 utf8。
readerStream.setEncoding('UTF8');

// 处理流事件 --> data, end, and error
readerStream.on('data', function(chunk) {
  data += chunk;
});

readerStream.on('end',function(){
  console.log(data);
});

readerStream.on('error', function(err){
  console.log(err.stack);
});

console.log("程序执行完毕");

3、写入流:

var fs = require("fs");
var data = '写入流数据';

// 创建一个可以写入的流,写入到文件 output.txt 中
var writerStream = fs.createWriteStream('output.txt');

// 使用 utf8 编码写入数据
writerStream.write(data,'UTF8');

// 标记文件末尾
writerStream.end();

// 处理流事件 --> data, end, and error
writerStream.on('finish', function() {
  console.log("写入完成。");
});

writerStream.on('error', function(err){
  console.log(err.stack);
});

console.log("程序执行完毕");

4、管道流(pipe)

var fs = require("fs");

// 创建一个可读流
var readerStream = fs.createReadStream('input.txt');

// 创建一个可写流
var writerStream = fs.createWriteStream('output.txt');

// 管道读写操作
// 读取 input.txt 文件内容,并将内容写入到 output.txt 文件中
readerStream.pipe(writerStream);
console.log("程序执行完毕");

5、链式流

链式是通过连接输出流到另外一个流并创建多个流操作链的机制。链式流一般用于管道操作。

接下来我们就是用管道和链式来压缩和解压文件。

//压缩
var fs = require("fs");
var zlib = require('zlib');

// 压缩 input.txt 文件为 input.txt.gz
fs.createReadStream('input.txt')
 .pipe(zlib.createGzip())
 .pipe(fs.createWriteStream('input.txt.gz'));
console.log("文件压缩完成。");

//解压
var fs = require("fs");
var zlib = require('zlib');
// 解压 input.txt.gz 文件为 input.txt
fs.createReadStream('input.txt.gz')
 .pipe(zlib.createGunzip())
 .pipe(fs.createWriteStream('input.txt'));
console.log("文件解压完成。");

五、总结

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
跟我学Nodejs(二)--- Node.js事件模块
May 21 NodeJs
跟我学Nodejs(三)--- Node.js模块
May 25 NodeJs
nodejs中实现路由功能
Dec 29 NodeJs
Nodejs学习笔记之入门篇
Apr 16 NodeJs
nodejs实现bigpipe异步加载页面方案
Jan 26 NodeJs
nodejs批量下载图片的实现方法
May 19 NodeJs
nodejs socket服务端和客户端简单通信功能
Sep 14 NodeJs
Nodejs模块载入运行原理
Feb 23 NodeJs
nodejs简单访问及操作mysql数据库的方法示例
Mar 15 NodeJs
nodejs检测因特网是否断开的解决方案
Apr 17 NodeJs
nodejs中各种加密算法的实现详解
Jul 11 NodeJs
使用nodeJS中的fs模块对文件及目录进行读写,删除,追加,等操作详解
Feb 06 NodeJs
nodejs 最新版安装npm 的使用详解
Jan 18 #NodeJs
使用npm安装最新版本nodejs
Jan 18 #NodeJs
nodejs结合socket.io实现websocket通信功能的方法
Jan 12 #NodeJs
nodejs结合Socket.IO实现的即时通讯功能详解
Jan 12 #NodeJs
nodejs基于WS模块实现WebSocket聊天功能的方法
Jan 12 #NodeJs
nodejs使用http模块发送get与post请求的方法示例
Jan 08 #NodeJs
nodejs基于mssql模块连接sqlserver数据库的简单封装操作示例
Jan 05 #NodeJs
You might like
mysql建立外键
2006/11/25 PHP
攻克CakePHP系列二 表单数据显示
2008/10/22 PHP
php程序效率优化的一些策略小结
2010/07/17 PHP
深入理解curl类,可用于模拟get,post和curl下载
2013/06/08 PHP
PHP和JavaScrip分别获取关联数组的键值示例代码
2013/09/16 PHP
Ajax PHP JavaScript MySQL实现简易无刷新在线聊天室
2016/08/17 PHP
Javascript valueOf 使用方法
2008/12/28 Javascript
TimergliderJS 一个基于jQuery的时间轴插件
2011/12/07 Javascript
js的2种继承方式详解
2014/03/04 Javascript
JavaScript中的Math 使用介绍
2014/04/21 Javascript
jQuery中:submit选择器用法实例
2015/01/03 Javascript
原生JS和JQuery动态添加、删除表格行的方法
2015/05/28 Javascript
BootStrap Fileinput的使用教程
2016/12/30 Javascript
npm ci命令的基本使用方法
2020/09/20 Javascript
解决Vue大括号字符换行踩的坑
2020/11/09 Javascript
jquery实现加载更多"转圈圈"效果(示例代码)
2020/11/09 jQuery
[14:24]Optic Gaming vs PSG LGD BO3
2018/06/07 DOTA
[48:27]EG vs Liquid 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
在Linux中通过Python脚本访问mdb数据库的方法
2015/05/06 Python
实例解析Python的Twisted框架中Deferred对象的用法
2016/05/25 Python
Python selenium 三种等待方式解读
2016/09/15 Python
Python处理XML格式数据的方法详解
2017/03/21 Python
python 实现在txt指定行追加文本的方法
2018/04/29 Python
Python工厂函数用法实例分析
2018/05/14 Python
python与caffe改变通道顺序的方法
2018/08/04 Python
Python 实现数据结构-堆栈和队列的操作方法
2019/07/17 Python
python爬虫数据保存到mongoDB的实例方法
2020/07/28 Python
浅谈Python3中print函数的换行
2020/08/05 Python
css3+伪元素实现鼠标移入时下划线向两边展开的效果
2017/04/25 HTML / CSS
详解HTML5 canvas绘图基本使用方法
2018/01/29 HTML / CSS
MATCHESFASHION.COM法国官网:英国奢侈品零售商
2018/01/04 全球购物
军训教官感言
2014/03/02 职场文书
药剂专业毕业生求职信
2014/06/24 职场文书
工资收入证明
2014/10/07 职场文书
银行求职信范文怎么写
2015/03/20 职场文书
关于Nginx中虚拟主机的一些冷门知识小结
2022/03/03 Servers