详解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的模块写法入门(实例代码)
Mar 07 NodeJs
Windows系统下使用Sublime搭建nodejs环境
Apr 13 NodeJs
实例详解Nodejs 保存 payload 发送过来的文件
Jan 14 NodeJs
Nodejs实现短信验证码功能
Feb 09 NodeJs
nodejs根据ip数组在百度地图中进行定位
Mar 06 NodeJs
nodejs个人博客开发第二步 入口文件
Apr 12 NodeJs
理解nodejs的stream和pipe机制的原理和实现
Aug 12 NodeJs
NodeJS 中Stream 的基本使用
Jul 30 NodeJs
Nodejs模块的调用操作实例分析
Dec 25 NodeJs
详解NodeJS Https HSM双向认证实现
Mar 12 NodeJs
nodejs各种姿势断点调试的方法
Jun 18 NodeJs
nodejs中使用worker_threads来创建新的线程的方法
Jan 22 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入门小知识
2008/03/24 PHP
PHP数据过滤的方法
2013/10/30 PHP
php实现aes加密类分享
2014/02/16 PHP
PHP中的命名空间相关概念浅析
2015/01/22 PHP
Zend Framework教程之MVC框架的Controller用法分析
2016/03/07 PHP
JavaScript 继承详解(四)
2009/07/13 Javascript
让图片旋转任意角度及JQuery插件使用介绍
2013/03/20 Javascript
基于JavaScript自定义构造函数的详解说明
2013/04/24 Javascript
使用javascript:将其它类型值转换成布尔类型值的解决方法详解
2013/05/07 Javascript
js获取URL的参数的方法(getQueryString)示例
2013/09/29 Javascript
Jquery 切换不同图片示例代码
2013/12/05 Javascript
jquery map方法使用示例
2014/04/23 Javascript
21个JavaScript事件(Events)属性汇总
2014/12/02 Javascript
15款jQuery分布引导插件分享
2015/02/04 Javascript
JavaScript实现select添加option
2015/07/03 Javascript
jQuery弹出遮罩层效果完整示例
2016/09/13 Javascript
jQuery基于排序功能实现上移、下移的方法
2016/11/26 Javascript
纯JS实现只能输入数字的简单代码
2017/06/21 Javascript
jquery实现一个全局计时器(商城可用)
2017/06/30 jQuery
浅谈在node.js进入文件目录的问题
2018/05/13 Javascript
解决axios发送post请求返回400状态码的问题
2018/08/11 Javascript
Django 限制用户访问频率的中间件的实现
2018/08/23 Python
Python爬虫小技巧之伪造随机的User-Agent
2018/09/13 Python
Python产生Gnuplot绘图数据的方法
2018/11/09 Python
Python 微信之获取好友昵称并制作wordcloud的实例
2019/02/21 Python
使用Python代码实现Linux中的ls遍历目录命令的实例代码
2019/09/07 Python
Python3变量与基本数据类型用法实例分析
2020/02/14 Python
Keras SGD 随机梯度下降优化器参数设置方式
2020/06/19 Python
用canvas实现图片滤镜效果附演示
2013/11/05 HTML / CSS
机电一体化专业应届本科生求职信
2013/09/27 职场文书
幼儿园大班区域活动总结
2014/07/09 职场文书
爱的奉献演讲稿
2014/09/10 职场文书
中学生旷课检讨书模板
2014/10/08 职场文书
七年级英语教学反思
2016/02/15 职场文书
jdbc使用PreparedStatement批量插入数据的方法
2021/04/27 MySQL
MySQL之MyISAM存储引擎的非聚簇索引详解
2022/03/03 MySQL