node-Buffer(缓冲区)&文件写入

2 篇文章 0 订阅

Node

Buffer(缓冲区)

  • Buffer的结构和数组很像,操作的方法也和数组类似
    数组不能存储二进制文件,而buffer就是专门用来存储二进制文件
    使用buffer不需要引入模块,直接使用即可
    在buffer中存储的都是二进制数据,但是在显示时都是以16进制显示
    buffer中每一个元素的范围是从00 - ff 0 - 255
    00000000 - 11111111

    计算机 一个0 或一个1 我们称为1位(bit)
    8bit=1Byte(字节)
    1024byte=1KB
    1024KB=1MB
    1024MB=1GB
    1024GB=1TB
    buffer中的一个元素占用内存的一个字节
    Buffer的大小一旦确定,则不能修改,Buffer实际上是对底层内存的直接操作

  • Buffer.from(str) 将一个字符串转换为buffer

    • var str="Hello 雪风";
      //将一个字符串保存到buffer中
      var buf=Buffer.from(str);
      console.log(buf.length);//12 占用内存的大小
      console.log(str.length);//8 字符串的长度
      console.log(buf);//<Buffer 48 65 6c 6c 6f 20 e9 9b aa e9 a3 8e>
      
  • Buffer.alloc(size) 创建一个指定大小的Buffer

    • /创建一个指定大小的buffer
      //buffer的构造函数都是不推荐使用的(new Buffer)
      //var buf2=new Buffer(1024);//1024个字节 1KB 的buffer
      var buf2=Buffer.alloc(10);
      //通过索引来操作buf中的元素
      buf2[0]=255;
      buf2[1]=0xaa;
      buf2[2]=556;//最大保存为255  556二进制1000101100
      //<Buffer ff aa 2c 00 00 00 00 00 00 00>   2c的十进制为00101100 明显超过范围只取二进制后八位
      console.log(buf2);
      //只要数字在控制台或页面中输出一定是10进制
      console.log(buf2[1]);//170
      console.log(buf2[1].toString(16));//但是字母可以指定在控制台显示的进制
      for(var i=0;i<buf2.length;i++){
          console.log(buf2[i]);
      }//buffer遍历和数组遍历一样
      
  • Buffer.alloUnsafe(size) 创建一个指定大小的Buffer,但是可能包含敏感数据

    • //Buffer.allocUnsafe(size) 创建一个指定大小的buffer,但是buffer中可能含有敏感数据
      /*var buf3 = Buffer.allocUnsafe(10);
      console.log(buf3);*/
      
  • Buffer.toString() 将缓冲区中的数据转换为字符串

    • var buf4 = Buffer.from("我是一段文本数据");
      
      console.log(buf4.toString());//我是一段文本数据
      

文件系统(File System)

在这里插入图片描述

  • 文件系统简单来说就是通过Node来操作系统中的文件

  • 使用文件系统,需要先引入fs模块,fs是核心模块,直接引入不需要下载

    在这里插入图片描述

    同步文件的写入

    手动操作的步骤

    ​ 1.打开文件
    fs.openSync(path, flags[, mode])

    ​ path 要打开文件的路径

    ​ flags 打开文件要做的操作的类型
    r 只读的
    w 可写的

    ​ mode 设置文件的操作权限,一般不传
    ​ 返回值:

    ​ 该方法会返回一个文件的描述符作为结果,我们可以通过该描述符来对文件进行各种操作

    ​ 2.向文件中写入内容
    fs.writeSync(fd, string[, position[, encoding]])

    ​ fd 文件的描述符,需要传递要写入的文件的描述符

    ​ string 要写入的内容

    ​ position 写入的起始位置

    ​ encoding 写入的编码,默认utf-8

    ​ 3.保存并关闭文件
    fs.closeSync(fd)

    ​ fd 要关闭的文件的描述符

            var fs=require("fs");
    
            var fd=fs.openSync("text.txt","w");
    
            fs.writeSync(fd,"雪风",0);
    
            fs.closeSync(fd);
            //Process finished with exit code 0代表成功运行
    

    异步文件写入

    • //引入fs模块
      var fs=require("fs");
      var f;
      //打开文件   异步文件打开,回调函数不能省略
      fs.open("text2.txt","w",function (err,fd) {
          //判断是否出错
          if(!err){
             f=fd;
          }else{
              console.log(err);
          }
      });
      console.log("open下的代码先执行,异步文件写入不会阻塞下面的代码,回调函数交给I/O执行")

    在这里插入图片描述

    • 方法
      fs.open(path, flags[, mode], callback)

      ​ 用来打开一个文件
      ​ 异步调用的方法,结果都是通过回调函数的参数返回的

      ​ 回调函数两个参数:
      ​ err 错误对象,如果没有错误则为null
      ​ fd 文件的描述符
      fs.write(fd, string[, position[, encoding]], callback)

      ​ 用来异步写入一个文件

      fs.close(fd, callback)
      ​ 用来关闭文件

    • //引入fs模块
      var fs=require("fs");
      
      //打开文件   异步文件打开,回调函数不能省略
      fs.open("text2.txt","w",function (err , fd) {
          //判断是否出错
          if(!err){
              //如果没有出错,则对文件进行写入操作
              fs.write(fd,"这是异步写入的内容",function (err) {
                  if(!err){
                      console.log("写入成功~~");
                  }
                  //关闭文件
                  fs.close(fd , function (err) {
                      if(!err){
                          console.log("文件已关闭~~~");
                      }
                  });
              });
          }else{
              console.log(err);
          }
      });
      console.log("open下的代码先执行,异步文件写入不会阻塞下面的代码,回调函数交给I/O执行");
      

    打开状态

    在这里插入图片描述

    简单文件写入

    简单文件写入
    fs.writeFile(file, data[, options], callback)
    fs.writeFileSync(file, data[, options])
    file 要操作的文件的路径
    data 要写入的数据
    options 选项,可以对写入进行一些设置
    callback 当写入完成以后执行的函数

    ​ flag
    ​ r 只读
    ​ w 可写
    ​ a 追加

    var fs=require("fs");
    
    //F:\WebStorm-workspace\node\02.文件系统\hello.txt
    //F:/WebStorm-workspace/node/02.文件系统/hello.txt
    fs.writeFile("F:/WebStorm-workspace/node/02.文件系统/hello.txt","这是通过writeFile写入的内容",{flag:"w"} , function (err) {
        if(!err){
            console.log("写入成功~~~");
        }else{
            console.log(err);
        }
    });
    

流式文件写入

应用背景: 同步、异步、简单文件的写入都不适合大文件的写入,性能较差,容易导致内存溢出

  • fs.createWriteStream(path[, options])
    可以用来创建一个可写流
    path,文件路径
    options 配置的参数

    • on(事件字符串,回调函数)
      可以为对象绑定一个事件

    • once(事件字符串,回调函数)

      ​ 可以为对象绑定一个一次性的事件,该事件将会在触发一次以后自动失效

    //流式文件写入
    //创建一个可写流
    var fs = require("fs");
    var ws = fs.createWriteStream("F:/WebStorm-workspace/node/02.文件系统/hello2.txt");
    
    ws.once("open",function () {
        console.log("流打开了~~~");
    });
    
    ws.once("close",function () {
        console.log("流关闭了~~~");
    });
    
    //通过ws向文件中输出内容
    ws.write("通过可写流写入文件的内容");
    ws.write("今天天气真不错");
    ws.write("锄禾日当午");
    ws.write("红掌拨清清");
    ws.write("清清真漂亮");
    
    //关闭流  这里不能用ws.close(); close代表的是从A往B里刚传第一个内容后,就在B中把传输线给剪短了,这样的话文件传输不全的
    //用end的话 就代表当A中所有内容传输完毕后,在A中把传输线给剪了,这样传输内容能保证全运输过去
    ws.end();
    

文件的读取

​ 1.同步文件读取
​ 2.异步文件读取
3.简单文件读取
fs.readFile(path[, options], callback)
fs.readFileSync(path[, options])

​ path 要读取的文件的路径

​ options 读取的选项

​ callback回调函数,通过回调函数将读取到内容返回(err , data)
​ err 错误对象
data 读取到的数据,会返回一个Buffer

var fs = require("fs");

fs.readFile("F:\\WebStorm-workspace\\node\\02.文件系统\\an.jpg" , function (err , data) {
	if(!err){
		//console.log(data);
		//将data写入到文件中
		fs.writeFile("C:\\Users\\郭帅\\Desktop\\helloNpm\\hello.jpg",data,function(err){
			if(!err){
				console.log("文件写入成功");
			}
		} );
	}
});

4.流式文件读取

​ 流式文件读取也适用于一些比较大的文件,可以分多次将文件读取到内存中

        var fs = require("fs");
        //创建一个可读流
        var rs = fs.createReadStream("F:\\WebStorm-workspace\\node\\02.文件系统\\a.mp3");
        //创建一个可写流
        var ws = fs.createWriteStream("b.mp3");
        //监听流的开启和关闭
        rs.once("open",function () {
            console.log("可读流打开了~~");
        });

        rs.once("close",function () {
            console.log("可读流关闭了~~");
            //数据读取完毕,关闭可写流

            ws.end();
        });
        ws.once("open",function () {
            console.log("可写流打开了~~");
        });

        ws.once("close",function () {
            console.log("可写流关闭了~~");
        });

        //如果要读取一个可读流中的数据,必须要为可读流绑定一个data事件,data事件绑定完毕,它会自动开始读取数据
        rs.on("data", function (data) {
            // console.log(data.length);
            // 将读取到的数据写入到可写流中
            ws.write(data);
        });

pipe()可以将可读流中的内容,直接输出到可写流中

        var fs = require("fs");
        //创建一个可读流
        var rs = fs.createReadStream("F:\\WebStorm-workspace\\node\\02.文件系统\\a.mp3");
        //创建一个可写流
        var ws = fs.createWriteStream("c.mp3");

        //pipe()可以将可读流中的内容,直接输出到可写流中
        rs.pipe(ws);

fs模块的其他方法

在这里插入图片描述

  • fs.existsSync(path) 检查一个文件是否存在

    var isExists=fs.existsSync("123.mp3");
    //console.log(isExists); false
    
  • fs.stat(path,callback)
    fs.statSync(path)
    获取文件的状态
    它会给我们返回一个对象,这个对象中保存了当前对象状态的相关信息

    fs.stat("F:\\WebStorm-workspace\\node\\02.文件系统\\a.mp3",function (err,stat) {
        console.log(stat.size);
    });
    
  • fs.readdir(path[,options],callback)
    fs.readdirSync(path[,options])

    读取一个目录的目录结构
    ​ files是一个字符串数组,每一个元素就是一个文件夹或文件的名字

    fs.readdir(".",function (err,files) {
         if(!err){
            console.log(files);
         }
    });
    
  • fs.truncate(path,len,callback)
    fs.truncateSync(path,len)

    截断文件,将文件修改为指定的大小

    fs.truncateSync("F:\\WebStorm-workspace\\node\\02.文件系统\\text2.txt",10);
    
  • fs.mkdir(path[,mode],callback)
    fs.mkdirSync(path[,mode])
    创建一个目录
    fs.rmdir(path[,mode],callback)
    fs.rmdirSync(path[,mode])
    删除一个目录

    fs.mkdirSync("hello");
    fs.rmdirSync("hello");
    
  • fs.rename(oldPath,newPath,callback)
    fs.renameSyna(oldPath,newPath)

    对文件进行重命名
    ​ 参数:
    ​ oldPath 旧的路径
    ​ enwPath 新的路径
    ​ callback 回调函数

    fs.renameSync("F:\\WebStorm-workspace\\node\\c.mp3","d.mp3",function (err) {
        if(!err){
            console.log("修改成功");
        }
    });修改名字
    fs.renameSync("F:\\WebStorm-workspace\\node\\d.mp3","C:\\Users\\郭帅\\Desktop\\helloNpm\\d.mp3",function (err) {
        if(!err){
            console.log("修改成功");
        }
    });修改位置
    
  • fs.watchFile(filename[,options],listener)

    监视文件的修改
    ​ 参数:
    filename 要监视的文件的名字
    ​ options配置选项
    ​ listener 回调函数,当文件发生变化时,回调函数会执行

    ​ 在回调函数中会有两个参数:
    curr 当前文件的状态
    ​ prev 修改前文件的状态

    ​ -这两个对象都是stats对象

    fs.watchFile("F:\\WebStorm-workspace\\node\\02.文件系统\\hello.txt",{interval:1000},function (curr,prev) {
        console.log("修改前文件大小"+prev.size);
        console.log("修改后文件大小"+curr.size);
    });
    
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值