Node fs创建可读流与可写流

23 min read

fs模块提供了创建文件可读流与创建文件可写读的方法:fs.createReadStream()fs. createWriteStream(),这两个方法分别分返回一个Readable Stream对象和Writable Stream对象。通过这两个对象,我们可以基于流的文件处理,在读写大文件及基于流的转接、暂停、读取等操作方面有很大的作用。

  1. fs.createReadStream()创建可读流

  2. fs.createWriteStream()创建可写流

1. fs.createReadStream()创建可读流

fs.createReadStream(path[, options])

该方法会读取指定文件,并返回一个ReadStream对象。

path是要创建可读流的文件的路径。

要知道,通过方法返回的可读流,其默认的highWaterMark值是64K,不同于一般可读流的16K。

options是创建选项,可是一个字符串或对象。其默认值如下:

{ flags: 'r',
  encoding: null,
  fd: null,
  mode: 0o666,
  autoClose: true
}

options选项中还可以包含startend 选项,用于设置读取文件的位置范围,而不是读取整个文件。

encoding可以是:'utf8''ascii''base64'

如果提供了文件描述符fd 值,ReadStream 将会忽略path 参数并从文件描述创建可读流。但种创建方法不会触发任何'open'事件。

Class: fs.ReadStream简单介绍

该对象由fs.createReadStream()创建返回,是一个ReadStream。该可读流对象不同于其它可读流不是的一点是,该对象包含一个'open'事件。

如果options为字符串,其值表示编码方式。

Event:'open',该事件会在创建文件ReadStream时触发,其回调函数参数是一个文件描述。

  • fd {Integer} ReadStream 所使用的文件描述符。

例如,以流的方法读取/etc/passwd文件内容:

var fs = require('fs');

var readStream = fs.createReadStream('/etc/passwd')

readStream.on('open', function(fd){
    console.log('文件已打开');
});

readStream.on('data', function(data){
    console.log('收到文件数据');
    console.log(data.toString());
});

2. fs.createWriteStream()创建可写流

fs.createWriteStream(path[, options])

创建一个WriteStream对象。

options是创建选项,可是一个字符串或对象。其默认值如下:

{ flags: 'w',
  defaultEncoding: 'utf8',
  fd: null,
  mode: 0o666 }

options 中也可以包含一个start的可选项,该选项用于指定在文件中开始写入数据的位置。

如果只想修改而不替换文件,只需将flags值修改为r+即可。

encoding可以是:'utf8''ascii''base64'

ReadStream一样,如果提供了文件描述符fd 值,WriteStream 将会忽略path 参数并从文件描述创建可读流。但种创建方法不会触发任何'open'事件。

如果options为字符串,其值表示编码方式。

fs.WriteStream简单介绍

该对象由fs.WriteStream()创建返回,是一个WriteStream

Event:'open',该事件会在创建文件ReadStream时触发,其回调函数参数是一个文件描述。

  • fd {Integer} ReadStream 所使用的文件描述符。

例如,读取/etc/passwd文件内容,并将其写入./myFile.txt文件:

var fs = require('fs');

var readStream = fs.createReadStream('/etc/passwd')
var writeStream = fs.createWriteStream('./myFile.txt')

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