Node.js学习笔记(2、File System模块)

Node.js官方API


filesystem的缩写是fs,该模块提供本地文件的读写能力。

fs.readFile(filename, [options], callback)

  • filename String
  • options Object
    • encoding String | Null default = null
    • flag String default = 'r'
  • callback Function
var fs = require('fs');

fs.readFile('./zimin/demo.txt', function (err, logData) {

  if (err) throw err;

  console.log(data);

});

上面代码使用readFile方法读取文件。readFile方法的第一个参数是文件名,第二个参数是回调函数。这两个参数中间,还可以插入一个可选参数,表示文件的编码。

fs.readFile('./zimin/demo.txt', 'utf8', function (err, logData) {
    // ...
});

可用的文件编码包括“ascii”、“utf8”和“base64”。如果这个参数没有提供,默认是utf8。


如果想要同步读取文件,可以使用readFileSync方法。

fs.readFileSync(filename, [options])

var data = fs.readFileSync('./zimin/demo.json');

写入文件要使用writeFile方法。

fs.writeFile(filename, data, [options], callback)

  • filename String
  • data String | Buffer
  • options Object
    • encoding String | Null default = 'utf8'
    • mode Number default = 438 (aka0666 in Octal)
    • flag String default = 'w'
  • callback Function
fs.writeFile('./zimin/demo.txt', data, function (err) {
    if (err) {
      console.log(err.message);
      return;
    }
    console.log('Saved successfully.');
  });

readdir方法用于读取目录,返回一个所包含的文件和子目录的数组。

fs.readdir('./zimin', function (err, files) {
  if (err) {
    console.log(err);
    return;
  }
  console.log(files);
});

Stream模式

Stream是数据处理的一种形式,可以用来取代回调函数。举例来说,传统形式的文件处理,必须先将文件全部读入内存,然后调用回调函数,如果遇到大文件,整个过程将非常耗时。Stream则是将文件分成小块读入内存,每读入一次,都会触发相应的事件。只要监听这些事件,就能掌握进展,做出相应处理,这样就提高了性能。Node内部的很多IO处理都采用Stream,比如HTTP连接、文件读写、标准输入输出。

Stream既可以读取数据,也可以写入数据。读写数据时,每读入(或写入)一段数据,就会触发一次data事件,全部读取(或写入)完毕,触发end事件。如果发生错误,则触发error事件。

fs模块的createReadStream方法用于新建读取数据流,createWriteStream方法用于新建写入数据流。使用这两个方法,可以做出一个用于文件复制的脚本copy.js。

// copy.js

var fs = require('fs');
console.log(process.argv[2], '->', process.argv[3]);

var readStream = fs.createReadStream(process.argv[2]);
var writeStream = fs.createWriteStream(process.argv[3]);

readStream.on('data', function (chunk) {
  writeStream.write(chunk);
});

readStream.on('end', function () {
  writeStream.end();
});

readStream.on('error', function (err) {
  console.log("ERROR", err);
});

writeStream.on('error', function (err) {
  console.log("ERROR", err);
});

上面代码非常容易理解,使用的时候直接提供源文件路径和目标文件路径,就可以了。

node cp.js src.txt dest.txt

Streams对象都具有pipe方法,起到管道作用,将一个数据流输入另一个数据流。所以,上面代码可以重写成下面这样:

var fs = require('fs');
console.log(process.argv[2], '->', process.argv[3]);

var readStream = fs.createReadStream(process.argv[2]);
var writeStream = fs.createWriteStream(process.argv[3]);

readStream.on('open', function () {
  readStream.pipe(writeStream);
});

readStream.on('end', function () {
  writeStream.end();
});


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值