1. 监听文件变化
跟文件相关的内容被包含在node.js内置的文件模块‘fs’中。
const fs = require('fs');
监听文件变化的方法是watch(),其中包含两个参数,第一个参数string,代表文件名,第二个参数是文件变化时需要执行的回调函数。
fs.watch('filename',() => console.log('file changed!'));
接收命令行参数
process是一个全局对象,argv是一个数组,保存命令行输入的参数。
node app.js target.txt
const filename = process.argv[2]; //target.txt
创建子进程
require(‘child_process’)语句返回一个child process模块。
1.spawn()方法
spawn()的第一个参数是需要执行命令的名称,第二个参数是命令行的参数数组。返回一个ChildProcess 对象。
它的stout、stdin、stderr属性都是Stream,可以用作输入和输出。
const spawn = require('child_process').spawn;
const ls = spawn('ls',['-l','-h','filename']);
2.pipe()方法
pipe()方法可以把子进程的输出内容直接传送到标准输出流。
ls.stdout.pipe(process.stdout);
使用EventEmitter获取数据
可以通过EventEmitter触发事件或响应事件。Stream类继承自EventEmitter。
ls.stdout.on('data',chunk => output += chunk);
由于Stream类继承自EventEmitter,所以能够监听到子进程标准输出流事件。on方法用于给指定事件添加事件监听函数。上述语句说明监听的是data事件。
data事件会将buffer对象作为参数传给回调函数,每拿到一份数据,就把buffer(chunk)里的数据添加到output变量。
注:
由于把数据从二进制复制到Node.js非常费时,尽管string操作更便捷,但还是应该尽可能直接操作buffer。
2. 异步读/写文件
Node.js有多种读写方式,最简单的是一次性读取或写入整个文件。另外的方式是通过Stream读/写流和使用Buffer存储内容。
一次性读写
readFile()方法可以一次性读取文件内容,第一个参数是文件名(string),第二个参数是data(一个buffer对象)。
const fs = require('fs');
fs.readFile('target.txt',(err,data) =>{
if(err){
throw err;
}
console.log(data.toString());
});
写入数据是writeFile(),共三个参数,第一个是文件名,第二个是字符串数据,第三个是err。
const fs = require('fs');
fs.writeFile('target.txt','hello world',(err) => {
throw err;
}
});
创建读/写流
分别用fs.creatReadStream()和fs.fs.creatWriteStream()来创建读、写流。
fs.createReadStream(process.argv[2]).pipe(process.stdout);
process.stdout.write()同样也是一个数据输出方式,等同于console.log。
fs.createReadStream(process.argv[2]).on('data',chunk=>process.stdout.write(chunk));