在nodejs中所有与文件相关的操作都在fs模块中,而读写操作又是我们会经常用到的操作。
nodejs的fs模块针对读操作为我们提供了readFile,read, createReadStream三个方法,针对写操作为我们提供了writeFile,write, createWriteStream三个方法。
fs模块的引用
fs模块必须在node.js安装之后才能使用,所以首先必须安装node.js。
官网安装地址:戳一下。
在js文件中导入文件系统模块
const fs = require('fs');
readFile和readFileSync
readFile的使用
readFile
方法是通过异步的方式将要读取的文件内容完整读入缓存区,再从该缓存区中读取文件内容,且没有返回值,具体语法:readFile(path[, options], callback)
。
path
表示文件名或文件描述符,可选参数的类型为:String
、Buffer
、URL
、integer
等类型。当值是一个目录时在 macOS、Linux 和 Windows 系统上,会返回错误。options
是一个对象,包含两个属性encoding
表示字符编码和flag
表示文件系统标志。当没有指定字符编码时,则返回原始的 buffer,当为字符串时只能表示字符编码callback
表示一个回调函数,会传入两个参数 (err, data),其中 data 是文件的内容,err是错误信息,没有则为空。
fs.readFile('input.txt', "utf-8", (err, data) => {
console.log("---------开始使用readFile读取---------");
console.log("异步读取:" + data);
});
在上述案例中,我们使用了readFile读取了input。
readFileSync的使用
readFileSync
和readFile
基本一致,唯一的区别是readFileSync
使用同步的方式读取数据,且读取的内容通过返回值获取。具体语法:fs.readFileSync(path[, options])
,参数具体含义同上。在使用过程中,如果指定了 encoding 选项,则此函数返回字符串。 否则,返回 buffer。
let data = fs.readFileSync('input.txt', "utf-8");
console.log("同步读取:" + data);
通过Promise实现readFile
如何调用Promise
在js中我们通过require('fs').promises
或require('fs/promises')
调用
通过Promise实现
想要通过Promise
实现readFile
,那就必须要有Promise
对象。在fs模块中可以使用fs.promises
得到。具体语法:fsPromises.readFile(path[, options]);
,其中参数同上。具体的使用情况:
async function print(path) {
const read = await fs.promises.readFile(path);
console.log(read.toString());
}
print('input.txt').catch(console.error);
通过Filehandle实现
FileHandle
对象是数字文件描述符的包装器,由fsPromises.open()
方法在内部创建。具体语法是:filehandle.readFile(encoding);
,执行语句返回值就是我们读取的内容。
async function print_1(path) {
let filehandle;
try {
filehandle = await fsPromises.open(path, 'r');
const data = await filehandle.readFile('utf-8');
console.log(data);
} finally {
}
}
print_1('input.txt');
在上述案例中出现的filehandle
就是FileHandle
对象。
read和readSync
read的使用
read
方法读取文件内容是通过异步的方法不断地将文件中的一小块内容读入缓存区,最后从该缓存区中读取文件内容,且没有返回值。具体语法:fs.read(fd, buffer, offset, length, position, callback)
或将参数换成对象形式:fs.read(fd[,options],callback)
。
fd
表示通过 fs.open() 方法返回的文件描述符buffer
表示数据写入的缓冲区offset
表示buffer
中开始写入的偏移量length
表示要从文件中读取的字节数position
表示文件读取的起始位置callback
表示回调函数,有三个参数:err 为错误信息, bytesRead 表示读取的字节数,buffer 为缓冲区对象
var buf = new Buffer.alloc(1024);
fs.open('input.txt', 'r+', function(err, fd) {
if (err) {
return console.error(err);
}
let date = fs.readSync(fd, buf, 0, buf.length, 0);
console.log("同步读取:" + buf.slice(0, date).toString());
fs.read(fd, buf, 0, buf.length, 0, function(err, bytes) {
if (err) {
console.log(err);
}
// 仅输出读取的字节
if (bytes > 0) {
console.log("异步读取:" + buf.slice(0, bytes).toString());
}
});
});
readSync的使用
readSync
和read
基本一致,唯一的区别是readSync
使用同步的方式读取数据,且读取的内容通过返回值获取。具体语法:fs.readSync(fd, buffer, offset, length, position);
或fs.readSync(fd, buffer, offset[,options]);
,参数具体含义同上。在使用过程中,如果指定了 encoding 选项,则此函数返回字符串。 否则,返回 buffer。
var buf = new Buffer.alloc(1024);
fs.open('input.txt', 'r+', function(err, fd) {
if (err) {
return console.error(err);
}
let date = fs.readSync(fd, buf, 0, buf.length, 0);
console.log("同步读取:" + buf.slice(0, date).toString());
});
});
通过Promise实现read
通过Filehandle实现
具体语法:filehandle.read(buffer, offset, length, position);
,其中参数同上,返回一个对象包含bytesRead
属性表示字节数和buffer
属性表示读取到的内容,包含具体的使用情况:
buf = new Buffer.alloc(1024);
async function print_1(path) {
let filehandle;
try {
filehandle = await fsPromises.open(path, 'r');
const read = await filehandle.read(buf, 0, 6, 0);
console.log(read.buffer.toString());
} finally {
}
}
print_1('input.txt');