了解node基础——为你的项目上线准备

169 阅读3分钟

今天我们来了解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对象和文件系统模块的使用。如果你有任何更具体的问题或需要进一步的帮助,请随时提问哦。