与文件操作相关的几个API介绍:
a, Buffer(数据块)
其实我觉得称之为二进制数据缓存区更贴切:
JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。但在处理像TCP流或文件流时,必须使用到二进制数据。
因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。
b, Stream(数据流)
当内存中无法一次装下需要处理的数据时,或者一边读取一边处理时 (更加高效),我们就需要用到数据流。
NodeJS中通过各种Stream来提供对数据流的操作。
所有的 Stream 对象都是 EventEmitter 的实例。常用的事件有:
- data - 当有数据可读时触发。
- end - 没有更多的数据可读时触发。
- error - 在接收和写入过程中发生错误时触发。
- finish - 所有数据已被写入到底层系统时触发。
- 以大文件拷贝程序为例,我们可以为数据来源创建一个只读数据流,示例如下
var rs = fs.createReadStream(pathname);
rs.on(‘data‘, function (chunk) { //当有数据可读时触发此事件
doSomething(chunk);
});rs.on(‘end‘, function () { //没有更多的数据可读时触发
cleanUp();
}); - 注意:
Node.js中,Stream 有四种流类型: -
-
Readable - 可读操作。
- Writable - 可写操作。
- Duplex - 可读可写操作.
- Transform - 操作被写入数据,然后读出结果。
- PS:
- 输入输出流,在有一个参照物的情况下才能分辨是输入还是输出。
- 电脑读取F盘的文件,对于电脑来说是输入,对于文件本身来说是输出。
-
c, File System(文件系统)
NodeJS通过fs
内置模块提供对文件的操作。fs
模块提供的API基本上可以分为以下三类:
- 文件属性读写。
其中常用的有
fs.stat
、fs.chmod
、fs.chown
等等。 - 文件内容读写。
其中常用的有
fs.readFile
、fs.readdir
、fs.writeFile
、fs.mkdir
等等。 - 底层文件操作。
其中常用的有
fs.open
、fs.read
、fs.write
、fs.close
等等。
此外,fs
模块的所有异步API都有对应的同步版本,用于无法使用异步操作时,或者同步操作更方便时的情况。
同步API除了方法名的末尾多了一个Sync
之外,异常对象与执行结果的传递方式也有相应变化。
d, Path(路径)
NodeJS提供了path
内置模块来简化路径相关操作,并提升代码可读性。以下分别介绍几个常用的API。
- path.normalize
将传入的路径转换为标准路径,具体讲的话,除了解析路径中的
.
与..
外,还能去掉多余的斜杠。如果有程序需要使用路径作为某些数据的索引,但又允许用户随意输入路径时,就需要使用该方法保证路径的唯一性。以下是一个例子:var cache = {}; function store(key, value) { cache[path.normalize(key)] = value; } store(‘foo/bar‘, 1); store(‘foo//baz//../bar‘, 2); console.log(cache); // => { "foo/bar": 2 }
坑出没注意: 标准化之后的路径里的斜杠在Windows系统下是
\
,而在Linux系统下是/
。如果想保证任何系统下都使用/
作为路径分隔符的话,需要用.replace(/\\/g, ‘/‘)
再替换一下标准路径。 - path.join
将传入的多个路径拼接为标准路径。该方法可避免手工拼接路径字符串的繁琐,并且能在不同系统下正确使用相应的路径分隔符。以下是一个例子:
path.join(‘foo/‘, ‘baz/‘, ‘../bar‘); // => "foo/bar"
- path.extname
当我们需要根据不同文件扩展名做不同操作时,该方法就显得很好用。以下是一个例子:
path.extname(‘foo/bar.js‘); // => ".js"
参考:http://nqdeng.github.io/7-days-nodejs/#1.1