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. 配置原则:优先修改用户环境变量,如不能完成目的,再修改系统环境变量。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353