详解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学习笔记之Connect中间件模块(二)
Jan 27 NodeJs
NodeJS实现阿里大鱼短信通知发送
Jan 17 NodeJs
使用NodeJs 开发微信公众号(三)微信事件交互实例
Mar 02 NodeJs
在windows上用nodejs搭建静态文件服务器的简单方法
Aug 11 NodeJs
浅谈Nodejs应用主文件index.js
Aug 28 NodeJs
NodeJS实现微信公众号关注后自动回复功能
May 31 NodeJs
nodeJS实现简单网页爬虫功能的实例(分享)
Jun 08 NodeJs
nodeJS(express4.x)+vue(vue-cli)构建前后端分离实例(带跨域)
Jul 05 NodeJs
Nodejs实现多文件夹文件同步
Oct 17 NodeJs
nodeJS进程管理器pm2的使用
Jan 09 NodeJs
Nodejs中怎么实现函数的串行执行
Mar 02 NodeJs
基于NodeJS开发钉钉回调接口实现AES-CBC加解密
Aug 20 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
PHP与MYSQL中UTF8编码的中文排序实例
2014/10/21 PHP
php析构函数的简单使用说明
2015/08/24 PHP
分享ThinkPHP3.2中关联查询解决思路
2015/09/20 PHP
php通过smtp邮件验证登陆的方法
2016/05/11 PHP
总结PHP删除字符串最后一个字符的三种方法
2016/08/30 PHP
分享JavaScript获取网页关闭与取消关闭的事件
2013/12/13 Javascript
javascript实现youku的视频代码自适应宽度
2015/05/25 Javascript
javascript简单实现类似QQ头像弹出效果的方法
2015/08/03 Javascript
jQuery javascript获得网页的高度与宽度的实现代码
2016/04/26 Javascript
javascript时间差插件分享
2016/07/18 Javascript
基于jQuery实现表格的查看修改删除
2016/08/01 Javascript
Bootstrap中glyphicons-halflings-regular.woff字体报404错notfound的解决方法
2017/01/19 Javascript
基于vue.js轮播组件vue-awesome-swiper实现轮播图
2017/03/17 Javascript
vue之数据交互实例代码
2017/06/20 Javascript
原生JS实现隐藏显示图片 JS实现点击切换图片效果
2021/01/27 Javascript
vue路由跳转时判断用户是否登录功能的实现
2017/10/26 Javascript
总结JavaScript在IE9之前版本中内存泄露问题
2018/04/28 Javascript
JS中实现隐藏部分姓名或者电话号码的代码
2018/07/17 Javascript
微信小程序url传参写变量的方法
2018/08/09 Javascript
详解vue项目接入微信JSSDK的坑
2018/12/14 Javascript
简单了解TypeScript中如何继承 Error 类
2019/06/21 Javascript
vue 实现cli3.0中使用proxy进行代理转发
2019/10/30 Javascript
在Mac OS系统上安装Python的Pillow库的教程
2015/11/20 Python
python 每天如何定时启动爬虫任务(实现方法分享)
2018/05/21 Python
用Python写一个自动木马程序
2019/09/17 Python
python DES加密与解密及hex输出和bs64格式输出的实现代码
2020/04/13 Python
python中upper是做什么用的
2020/07/20 Python
python 字符串格式化的示例
2020/09/21 Python
PyCharm安装PyQt5及其工具(Qt Designer、PyUIC、PyRcc)的步骤详解
2020/11/02 Python
css3一款3D字体带阴影效果的实现步骤
2013/03/20 HTML / CSS
新加坡网上花店:FlowerAdvisor新加坡
2018/10/05 全球购物
养殖项目策划书范文
2014/01/13 职场文书
2014年副班长工作总结
2014/12/10 职场文书
2015年党员干部承诺书
2015/01/21 职场文书
公司承诺书格式范文
2015/04/28 职场文书
python index() 与 rindex() 方法的使用示例详解
2022/12/24 Python