详解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 相关文章推荐
golang、python、php、c++、c、java、Nodejs性能对比
Mar 12 NodeJs
如何正确使用Nodejs 的 c++ module 链接到 OpenSSL
Aug 03 NodeJs
Nodejs全栈框架StrongLoop推荐
Nov 09 NodeJs
NodeJS学习笔记之MongoDB模块
Jan 13 NodeJs
nodeJs链接Mysql做增删改查的简单操作
Feb 04 NodeJs
Windows下使用Nodejs运行js的方法
Sep 02 NodeJs
浅谈NodeJs之数据库异常处理
Oct 25 NodeJs
nodejs实现截取上传视频中一帧作为预览图片
Dec 10 NodeJs
nodejs操作mongodb的填删改查模块的制作及引入实例
Jan 02 NodeJs
nodejs高大上的部署方式(PM2)
Sep 11 NodeJs
nodejs 递归拷贝、读取目录下所有文件和目录
Jul 18 NodeJs
ubuntu系统下使用pm2设置nodejs开机自启动的方法
May 12 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
东芝TOSHIBA RP-F11电路分析
2021/03/02 无线电
php获取qq用户昵称和在线状态(实例分析)
2013/10/27 PHP
php+highchats生成动态统计图
2014/05/21 PHP
php实现获取及设置用户访问页面语言类
2014/09/24 PHP
php cookie名使用点号(句号)会被转换
2014/10/23 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
2018/02/06 PHP
PHP中使用CURL发送get/post请求上传图片批处理功能
2018/10/15 PHP
详细分析PHP 命名空间(namespace)
2020/06/30 PHP
javascript实现根据时间段显示问候语的方法
2015/06/18 Javascript
js+css绘制颜色动态变化的圈中圈效果
2016/01/27 Javascript
AngularJS 表达式详细讲解及实例代码
2016/07/26 Javascript
老生常谈javascript的类型转换
2016/10/12 Javascript
AngularJS实现的输入框字数限制提醒功能示例
2017/10/26 Javascript
解决layui上传文件提示上传异常,实际文件已经上传成功的问题
2018/08/19 Javascript
JavaScript学习笔记之DOM基础操作实例小结
2019/01/09 Javascript
Windows安装Python、pip、easy_install的方法
2017/03/05 Python
简单易懂的python环境安装教程
2017/07/13 Python
使用EduBlock轻松学习Python编程
2018/10/08 Python
django 将model转换为字典的方法示例
2018/10/16 Python
Django实现基于类的分页功能
2019/10/31 Python
opencv python图像梯度实例详解
2020/02/04 Python
PyCharm License Activation激活码失效问题的解决方法(图文详解)
2020/03/12 Python
Python DES加密实现原理及实例解析
2020/07/17 Python
Django路由层URLconf作用及原理解析
2020/09/24 Python
纯CSS3编写的的精美动画进度条(无flash/无图像/无脚本/附源码)
2013/01/07 HTML / CSS
 Alo Yoga官网:购买瑜伽服装
2018/06/17 全球购物
个人自我鉴定
2013/11/07 职场文书
厨师岗位职责
2013/11/12 职场文书
仓库理货员岗位职责
2013/12/18 职场文书
教师评语大全
2014/04/28 职场文书
工商局局长个人对照检查材料思想汇报
2014/09/23 职场文书
个人学习党的群众路线教育实践活动心得体会
2014/11/05 职场文书
公司文体活动总结
2015/05/07 职场文书
2016年优秀班主任先进事迹材料
2016/02/26 职场文书
Matlab如何实现矩阵复制扩充
2021/06/02 Python
css3 选择器
2022/05/11 HTML / CSS