nodejs+mongodb笔记------第二章(Buffer缓冲器、node中的文件操作)

1.Buffer缓冲器

1.Buffer是什么?

  • 1.它是一个类似于数组的对象,用于存储数据(存储的是二进制数据)。
  • 2.Buffer的效率很高,存储和读取很快,直接对计算机的内存进行操作。
  • 3.Buffer的大小一旦确定了,不可修改。
  • 4.每个元素占用内存的大小为1字节。
  • 5.Buffer是Node中的非常核心的模块,无需下载、无需引入即可使用

2.进制:

  • 十六进制:00 ----- ff
  • 十进制: 00 ----- 255
  • 二进制: 00000000 ------- 11111111

3.换算

  • 8 bit(位) = 1 byte(字节)
  • 1024byte = 1KB
  • 1024Kb = 1MB
  • 1024Mb = 1Gb
  • 1024GB = 1TB
  • 1024TB = 1PB
//1.将一个字符串存入Buffer中
let str = 'HELLO WORLD'
let buf = Buffer.from(str)
console.log(buf) //<Buffer 48 45 4c 4c 4f>

//2.alloc这种方式去创建Buffer实例---效率一般
let buf2 = Buffer.alloc(10)
console.log(buf2) //<Buffer 00 00 00 00 00 00 00 00 00 00> 00占位代表(空内存)

//3.allocUnsafe这种方式去创建Buffer实例---效率很好,但是存在一些安全问题
let buf3 = Buffer.allocUnsafe(10) 
console.log(buf3) //<Buffer 0e 00 00 00 06 02 00 00 06 00> 使用没有被引用的内存,可能残留一些信息

//4.使用new关键字创建一个Buffer实例(即将被弃用)-----效率很低
let buf4 = new Buffer(10)
console.log(buf4) // <Buffer 00 00 00 00 00 00 00 00 00 00>

2.Node中的文件操作(写入)

Node中的文件系统:

  • 在NodeJs中有一个文件系统,所谓的文件系统,就是对计算机中的文件进行增删改查等操作。
  • 在NodeJs中,给我们提供了一个模块,叫做fs模块,专门用户操作文件。
  • fs模块是Node的核心模块,使用的时候,要引入进来,不用下载安装。

简单文件写入(异步):

fs.writeFile(file, data[, options], callback)
        --file:文件路径+文件名
        --data:要写入的数据
        --options:配置选项(可选参数)
              --flag:打开文件要进行的操作,默认是w
                    'w':直接写入
                    'a':追加
              --mode:文件权限的限制,默认值是0o666
                    --0o111:文件可被执行
                    --0o222:文件可被写入
                    --0o444:文件可被读取
              --encoding:默认值utf8
        --callback:回调函数
              --err

备注:在Node中有一个设计原则:错误优先。
不足之处:简单文件写入是一次性把所有要写入的数据加载到内存中,对于比较大的文件容易产生内存溢出,适用于较小的文件写入。

//1.引入fs模块
let fs = require('fs')

//2.进行简单文件写入
fs.writeFile('./720.txt','哈哈',{
  flag:'w',
  mode:0o666,
  encoding:'utf8'
},(err)=>{
    if(!err){
      console.log('文件写入成功了!')
    }else{
      console.log(err)
  }
})

流式文件写入:

fs.createWriteStream(path[, options])
    --path:文件路径+文件名
    --options:配置对象(可选)
        --flags:打开文件要进行的操作,默认是w
                    'w':直接写入
                    'a':追加
        --mode:文件权限的限制,默认值是0o666
                    --0o111:文件可被执行
                    --0o222:文件可被写入
                    --0o444:文件可被读取
          --encoding:默认值utf8
          --fd:文件的唯一标识。(了解)
          --autoClose:自动关闭,当数据操作完毕,自动关闭文件,默认是true
          --start:文件写入的起始位置
//1.引入fs模块
let fs = require('fs')

//2.创建一个可写流
let ws = fs.createWriteStream('./demo.txt',{
  start:20
})

//只要使用了流,必须给流加监听
ws.on('open',()=>{
   console.log('可写流打开了')
})
ws.on('close',()=>{
  console.log('可写流关闭了')
})

//3.开始写入数据
ws.write('马上晚上放学了\n')
ws.write('我饿了\n')
ws.write('饿了你就忍着吧\n')
ws.close() //如果用的是Node的8版本一下(包含8版本),用此种方式关闭流,容易造成数据丢失。
//ws.end()

3.Node中的文件操作(读取)

简单文件读取:

fs.readFile(path[, options], callback)
    --path:文件路径+文件名
    --options:配置对象
        --encoding:文件编码
        --flag:打开文件要进行的操作
    --callback:回调函数
        --err:错误对象
        --data:数据
//1.引入fs模块
let fs = require('fs')

//2.简单文件读取
fs.readFile('./music.mp3',(err,data)=>{
    if(!err){
      //思考?为什么读取出来的是Buffer类型(看不懂),因为读取出来的数据不一定是文本,可能是媒体文件。
      //console.log(data.toString())
      fs.writeFile('../demo.mp3',data,(err)=>{
          if(!err){
            console.log('ok')
          }else{
            console.log(err)
          }
      })
    }else{
      console.log(err)
    }
})

流式文件读取:

fs.createReadStream(path[, options])
  --path:文件路径+文件名
  --options:配置对象(可选)
      --flags:打开文件要进行的操作,默认是w
                  'w':直接写入
                  'a':追加
      --mode:文件权限的限制,默认值是0o666
                  --0o111:文件可被执行
                  --0o222:文件可被写入
                  --0o444:文件可被读取
      --encoding:默认值utf8
      --start:读取的起始点
      --end:读取的结束点
      --highWaterMark:每次读取数据的大小 默认值是:64 * 1024
//1.引入fs模块
let fs = require('fs')

//2.创建一个可读流,对于可读流来说,当没有数据可继续读取的时候,会自动关闭可读流。
let rs = fs.createReadStream('./music.mp3',{
  //start:2000,
  //end:90000,
  highWaterMark:1024 * 1024
})
let ws = fs.createWriteStream('../demo.mp3')

//使用了流,必须给流加监听(为了确保每个流都能够在使用完毕后关闭)
rs.on('open',()=>{
  console.log('可读流打开了')
})
rs.on('close',()=>{
  console.log('可读流关闭了')
  ws.close()
})
ws.on('open',()=>{
  console.log('可写流打开了')
})
ws.on('close',()=>{
  console.log('可写流关闭了')
})

//3.给可读流绑定一个data事件,会自动触发流读取文件
rs.on('data',(data)=>{
    //输出Buffer实例的length的时候,输出的不是长度,输出的是占用内存的大小
    //console.log(data.length)
    ws.write(data)
})

关于环境变量的说明

什么是环境变量?

    1. 定义:是系统执行命令时候会读取的变量
    1. 分为两种:系统环境变量、用户环境变量
    1. 配置方法:我的电脑 -> 高级系统设置 -> 环境变量 ->用户环境变量
    1. 配置原则:优先修改用户环境变量,如不能完成目的,再修改系统环境变量。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。