Node.js中文件的读取与写入

Buffer概念

Buffer是一个类似于数组的对象,用于表示固定长度的字节序列

Buffer本质是一段内存空间,专门来处理二进制数据。

在这里插入图片描述

Buffer特点

  • 大小固定且无法调整
  • 性能较好,可直接对计算机内存进行操作
  • 每个元素的大小为1字节(byte),也就是8比特(bit)

Buffer的使用

Node.js 中创建 Buffer 的方式主要如下几种:

  1. Buffer.alloc()

    // 创建长度为 10 字节的Buffer,相当于申请了10字节的空间
    // alloc() 在申请空间的同时会将每个字节值置为0
    let buf = Buffer.alloc(10);
    // <Buffer 00 00 00 00 00 00 00 00 00 00>
    
  2. Buffer.allocUnsafe()

    // 创建了一个长度为 10 字节的Buffer,在创建的过程中不会将每个字节值置为0,那么也就意味着buffer中可能存在脏数据,所以这里是 Unsafe
    let buf = Buffer.allocUnsafe(10);
    
  3. Buffer.from()

    // 可以通过字符串或者数据创建Buffer
    // 通过字符串创建Buffer
    let buf = Buffer.from("hello");
    // <Buffer 68 65 6c 6c 6f>
    // 通过数组创建Buffer
    let buf= Buffer.from([105, 108, 111, 118, 101, 121, 111, 117]);
    //<Buffer 69 6c 6f 76 65 79 6f 75>  十六进制
    

Buffer 与字符串的转化

调用toString()的方法将Buffer转换为字符串

let buf= Buffer.from([105, 108, 111, 118, 101, 121, 111, 117]);
console.log(buf.toString());

toString()默认是按照utf-8 编码方式进行转换

Buffer的读写

由于buffer是一个类似于数组的对象,所以可以通过[] 的方式对数据进行处理

// 读取
console.log(buf[0]);
// 修改
buf[1] = 97;

注意:

如果修改的数值超过 255 ,则超过的8位数据会被舍弃

一个utf-8的字符一般占3个字节

buf[0] = 361;// 舍弃高位的数字  0001 0110 1001  => 0110 1001
let buf = Buffer.from('你好');
console.log(buf);
// <Buffer e4 bd a0 e5 a5 bd> ===> 三个字节

fs模块

fs全称为file system,称之为文件系统,是Node.js 中的内置模块,可以对计算机的磁盘进行操作。

文件的写入

文件写入就是将 数据 保存到 文件 中,我们可以使用如下几个方法来实现该效果

方法说明
writeFile()异步写入
writeFileSync()同步写入
appendFile()/appendFileSync()追加写入
createWriteStreame()流式写入
writeFile()异步写入

JavaScript 主线程不会等待 writeFile() 的执行完成,也就是不会阻塞JavaScript主线程

语法: writeFile(file, data[, options], callback)

参数说明:

  • file 文件名
  • data 待写入的数据
  • option 选项设置(可选)
  • callback 写入的回调函数

返回值: undefined

// require 是 Node.js 环境中的 ‘全局’ 变量,用来导入模块
//将 『三人行,必有我师焉。』 写入到当前文件夹下的『座右铭.txt』文件中
const fs = require('fs');
fs.writeFile('./data.txt','三人行,必有我师焉。',err => {
  //如果写入失败,则回调函数调用时,会传入错误对象,如写入成功,会传入 null
  if (err) {
    console.log(err);
    return;
  }
  console.log("写入成功");
})
writeFileSync()同步写入

JavaScript 主线程会等待 writeFileSync() 的执行完成,也就是会阻塞JavaScript主线程

语法: fs.writeFileSync(file, data[, options])

返回值:undefined

const fs = require('fs');
fs.writeFileSync('./data.text','hello');
appendFile / appendFileSync追加写入

writeFileSync() 与 writeFile() 对相同文件进行内容的写入时会对原有的数据进行覆盖,而不是追加数据

语法:

fs.appendFile(file, data[, options], callback)

fs.appendFileSync(file, data[, options])

返回值: 二者都为 undefined

// 异步追加
fs.appendFile('./data.txt','smart',err => {
  if (err) {
    console.log(err);
    return;
  }
  console.log("追加成功")
})
// 同步追加
fs.appendFileSync('./data.txt','phone');
createWriteStream 流式写入

语法: fs.createWriteStream(path[, options])

参数说明:

  • path 文件路径
  • option 选项配置(可选)

返回值: Object

let ws = fs.createWriteStream('./data.txt');
ws.write('半亩方塘一鉴开\r\n');
ws.write('天光云影共徘徊\r\n');
ws.write('问渠那得清如许\r\n');
ws.write('为有源头活水来\r\n');
// 关闭通道
ws.close();

程序打开一个文件时非常消耗资源的,而流式写入会创建一个通道,直到写入完毕才关闭通道ws.close(),以此来减少文件打开与关闭的次数。流式写入方式适用于 大文件写入或者频繁写入 的场景, writeFile 适合于 写入频率较低的场景

文件的读取

通过程序,从文件中读取数据

方法说明
readFile()异步读取
readFileSync()同步读取
createReadStream()流式读取
readFile()异步读取

语法: fs.readFile(path[, options], callback)

参数说明:

  • path 被读取的文件路径
  • option 选项配置 (可选)
  • callback 回调函数

返回值: undefined

const fs = require('fs');
fs.readFile('./data.txt',(err,data) => {
  if (err) {
    console.log("读取失败");
    return;
  }
  // data 是成功读取文件数据,此时data是一个Buffer
  // 所以应调用toString() 方法,将其转会为字符串格式
  console.log(data.toString());
})
readFileSync 同步读取

语法: fs.readFileSync(path[, options])

参数说明:

  • path 文件路径

  • options 选项配置

返回值:String || Buffer

let data = fs.readFileSync('./data.txt');
// 返回值 data 是一个 Buffer 
// 要想得到字符串的形式需调用 toString() 方法
console.log(data.toString()); 
createReadStream流式读取

语法: fs.createReadStream(path[, options])

参数说明:

  • path 文件路径

  • options 选项配置

返回值: Object

// 创建流式读取对象
let rs = fs.createReadStream('./data.txt');
// 每次取出 65536Byte ≈ 64 KB 数据后执行一次data事件
rs.on('data',message => {
  // 所得到的message依旧是Buffer ,所以想要得到字符串仍需调用 toString() 方法
  console.log(message.toString());
})
// end 事件,此事件是可选事件,用来监听流式读取的结束
rs.on('end',() => {
  console.log('读取完成');
})
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

读书的小蜗牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值