今天我们来了解Node.js中的Buffer对象以及文件系统(fs
)模块的相关操作。下面是对每个部分的总结和解析:
Buffer缓冲区
Buffer
是Node.js中用于处理二进制数据的对象。它具有以下特点:
- 结构和操作方法类似于数组。
- 专门用于存储二进制数据。
- 每个元素是一个16进制的两位数,表示一个字节。
Buffer
对象的内存是由C++层直接管理的。- 可以直接通过
Buffer
创建内存空间。 Buffer
大小一旦确定就不能改变。
常用的方法包括:
Buffer.from(string)
: 将字符串转换为Buffer
。Buffer.alloc(size)
: 创建一个固定大小的Buffer
并初始化为0。Buffer.allocUnsafe(size)
: 创建一个固定大小的Buffer
,不进行初始化,可能存在敏感数据。buf.fill(0)
: 用0填充Buffer
。
文件系统模块
fs
模块提供了Node.js中文件系统的API,用于读取、写入和操作文件。
文件写入
- 同步文件写入:
- 使用
fs.openSync
打开文件。 - 使用
fs.writeSync
写入数据。 - 使用
fs.closeSync
关闭文件。
- 使用
const fs = require('fs');
let fd1 = fs.openSync('hello.txt', 'w');
let fw1 = fs.writeSync(fd1, 'hello node');
fs.closeSync(fd1);
- 异步文件写入:
- 使用
fs.open
异步打开文件。 - 使用
fs.write
写入数据。 - 使用
fs.close
关闭文件。
- 使用
fs.open('hello2.txt', 'a', (err, fd) => {
if (!err) {
console.log(fd);
fs.write(fd, '异步写入', (err, written, string) => {
if (!err) {
console.log(written);
console.log(string);
fs.close(fd, (err) => {
if (!err) {
console.log('异步文件写入已关闭...');
}
});
}
});
}
});
- 简单文件写入:
- 使用
fs.writeFile
直接写入文件。
- 使用
fs.writeFile('hello3.txt', '简单文件写入', { flag: 'a' }, (err) => {
if (err) throw err;
console.log('The file has been saved!');
});
- 流式文件写入:
- 使用
fs.createWriteStream
创建一个写入流。 - 监听打开和关闭事件。
- 使用
.write()
方法写入数据。 - 使用
.end()
方法结束写入。
- 使用
const ws = fs.createWriteStream('hello4.txt');
ws.once('open', () => {
console.log('监听写入流的打开');
});
ws.once('close', () => {
console.log('监听写入流的关闭');
});
ws.write('通过写入流进行文件内容的写入...');
ws.write('111');
ws.write('222');
ws.write('333');
ws.end();
文件读取
- 简单文件读取:
- 使用
fs.readFileSync
同步读取文件。 - 使用
fs.readFile
异步读取文件。
- 使用
const fs = require('fs');
let fr1 = fs.readFileSync('hello4.txt');
console.log(fr1);
let fr2 = fs.readFileSync('hello3.txt', 'utf-8');
console.log(fr2);
fs.readFile('hello.txt', (err, data) => {
if (!err) {
console.log(data.toString());
} else {
throw err;
}
});
fs.readFile('moon.png', (err, data) => {
if (!err) {
console.log(data);
fs.writeFile('moon2.png', data, (err) => {
if (!err) {
console.log('复制图片成功');
}
});
} else {
throw err;
}
});
- 流式文件读取:
- 使用
fs.createReadStream
创建一个读取流。 - 监听
'data'
事件来处理读取的数据。 - 使用
pipe()
方法将读取流直接连接到写入流。
- 使用
const rs = fs.createReadStream('moon.png');
const ws = fs.createWriteStream('moon3.png');
rs.once('open', () => {
console.log('可读流打开');
});
rs.once('close', () => {
console.log('可读流关闭');
ws.end();
});
ws.once('open', () => {
console.log('可写流打开');
});
ws.once('close', () => {
console.log('可写流关闭');
});
rs.on('data', (data) => {
console.log(data);
console.log(data.length);
ws.write(data);
});
rs.pipe(ws);
其他文件操作
- 验证路径是否存在: 使用
fs.existsSync(path)
. - 获取文件信息: 使用
fs.stat(path, callback)
或fs.statSync(path)
. - 删除文件: 使用
fs.unlink(path, callback)
或fs.unlinkSync(path)
.
路径动态拼接问题
在Node.js中,文件路径通常是相对于执行脚本所在目录的。为了避免动态拼接路径的问题,可以使用绝对路径,或者使用 __dirname
来获取当前文件所在的目录。
fs.readFile(__dirname + '/file/成绩.txt', (err, data) => {});
文件转换练习
const fs = require('fs');
fs.readFile('./file/成绩.txt', 'utf-8', (err, data) => {
if (err) throw err;
let str = data.replace(/\s/g, '\r\n');
str = str.replace(/=/g, ':');
fs.writeFile('./file/成绩_copy', str, (err) => {
if (err) throw err;
console.log('转换成功~');
});
});
这段代码从 成绩.txt
文件中读取数据,将等号替换为冒号,并将每一行数据分割为单独的行,然后将转换后的内容写入 成绩_copy
文件。
希望这些信息能够帮助你更好地理解Node.js中的Buffer对象和文件系统模块的使用。如果你有任何更具体的问题或需要进一步的帮助,请随时提问哦。