在前端JavaScript时代,关于文件I/O这一块是没有的。但是,从前端到后端,这种文件I/O的需求自然而然成为必须,所以Node.js也增加了文件模块。
Buffer
在正式介绍Node.js文件模块之前,我想先聊一聊Node.js中的Buffer。
为什么需要Buffer
JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。但在处理像TCP流或文件流时,必须使用到二进制数据。因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。
Buffer是什么
Buffer是一个由JavaScript和C++结合的模块,性能相关部分由C++实现,非性能相关部分由JavaScript实现。一个 Buffer 类似于一个整数数组,但它对应于 V8 堆内存之外的一块原始内存。Buffer的元素为16进制,即0-255的数值。
如何使用Buffer
创建 Buffer 类
- 创建长度为 10 字节的 Buffer 实例:
var buf = new Buffer(10);
- 通过给定的数组创建 Buffer 实例:
var buf = new Buffer([10, 20, 30, 40, 50]);
- 通过一个字符串来创建 Buffer 实例:
var buf = new Buffer("Hello world", "utf-8");
utf-8 是默认的编码方式,此外它同样支持以下编码:"ascii", "utf8", "utf16le", "ucs2", "base64" 和 "hex"。
写入缓冲区
语法buf.write(string[, offset[, length]][, encoding])
实例:
buf = new Buffer(1 * 1024); // 创建1KB大小的Buffer对象
len = buf.write("Hello world"); // 写入内容到Buffer对象中
console.log("写入字节数 : "+ len);
Buffer转字符串
buf.toString([encoding[, start[, end]]])
Node.js 文件系统
说完Buffer,我开始了解Node.js 文件系统。
简介
文件 I/O 是由简单封装的标准 POSIX 函数提供。 通过 require('fs') 使用该模块。 所有的方法都有异步和同步的形式。
异步方法的最后一个参数都是一个回调函数。 传给回调函数的参数取决于具体方法,但回调函数的第一个参数都会保留给异常。 如果操作成功完成,则第一个参数会是 null 或 undefined。
当使用同步方法时,任何异常都会被立即抛出。 可以使用 try/catch 来处理异常,或让异常向上冒泡。
如何使用
打开文件
open(path, flags[,mode] callback)
fs.open('input.txt', 'r+', function(err, fd) {
if (err) {
return console.error(err);
}
console.log("文件打开成功!");
});获取文件信息
stat(path, callback)
fs.stat('/Users/liuht/code/itbilu/demo/fs.js', function (err, stats) {
console.log(stats.isFile());
})写入文件
write(fd, buffer, offset, length[, position], callback)
writeFile(path, data[, options], callback)读取文件
read(fd, buffer, offset, length, position, callback)
readFile(path[, options], callback)关闭文件
close(fd, callback)截取文件
ftruncate(fd, len, callback)删除文件
unlink(path, callback)创建目录
mkdir(path[, mode], callback)读取目录
readdir(path, callback)删除目录
rmdir(path, callback)删除文件
unlink(path, callback)创建目录
mkdir(path[, mode], callback)