node基础APIBuffer(二)

global对象

  1. __filename:返回当前模块文件的解析后的绝对路径,该属性其实并非全局,而是模块作用域下的

注意:__filename:是当前模块下的,不是全局的

console.log(__filename); // /Users/vlolet/Documents/study/node/module/6.js
// 不能使用全局变量访问
console.log(global.__filename)  // undefined
  1. __dirname:返回当前模块文件所在目录解析后的绝对路径,该属性也不是全局的,而是在模块作用域下
    注意:返回的是路径所在的文件夹,__filename返回的是具体文件
// 返回文件
console.log(__filename); // /Users/vlolet/Documents/study/node/module/6.js
// 返回文件夹
console.log(__dirname);  // /Users/vlolet/Documents/study/node/module

process对象(进程)

process 对象是一个全局变量,它提供有关当前 Node.js进程的信息并对其进行控制。

它是一个全局对象,可以在任何地方都能访问到它,通过这个对象提供的属性和方法,我们可以对当前运行的程序的进程进行访问和控制

argv
  • Array,一组包含命令行参数的数组
// 1.js
console.log(process.argv) 
// 结果
 [ '/usr/local/lib/node_modules/node/bin/node',
'/Users/vlolet/Documents/study/node/process/1.js' ]
  • 执行的同时,命令后面可以带参数
1-1
  • 开启当前进程的绝对路径
console.log(process.execPath)  // /usr/local/lib/node_modules/node/bin/node
env
  • 返回用户环境信息,当前系统环境
{ TERM_PROGRAM: 'vscode',
  TERM: 'xterm-256color',
  SHELL: '/bin/bash',
  TMPDIR: '/var/folders/jc/9w15wg9d1vgbvmlzg7pz4fqw0000gn/T/',
  Apple_PubSub_Socket_Render: '/private/tmp/com.apple.launchd.DGecWSVoCy/Render',
  TERM_PROGRAM_VERSION: '1.43.0',
  OLDPWD: '/Users/vlolet/Documents/study/node',
  USER: 'vlolet',
  COMMAND_MODE: 'unix2003',
  SSH_AUTH_SOCK: '/private/tmp/com.apple.launchd.Y7B5Yihfzz/Listeners',
  __CF_USER_TEXT_ENCODING: '0x1F5:0x19:0x34',  PATH:
   '/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/lib/node_modules/node/lib/node_modules/http-server/bin/:/usr/local/lib/node_modules/node/lib/node_modules/http-server/bin/',
vloletdeMacBook-Air:process vlolet$ node 1.js 
{ TERM_PROGRAM: 'vscode',
  TERM: 'xterm-256color',
  SHELL: '/bin/bash',
  TMPDIR: '/var/folders/jc/9w15wg9d1vgbvmlzg7pz4fqw0000gn/T/',
  Apple_PubSub_Socket_Render: '/private/tmp/com.apple.launchd.DGecWSVoCy/Render',
  TERM_PROGRAM_VERSION: '1.43.0',
  OLDPWD: '/Users/vlolet/Documents/study/node',
  USER: 'vlolet',
  COMMAND_MODE: 'unix2003',
  SSH_AUTH_SOCK: '/private/tmp/com.apple.launchd.Y7B5Yihfzz/Listeners',
  __CF_USER_TEXT_ENCODING: '0x1F5:0x19:0x34',
  PATH:
   '/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/lib/node_modules/node/lib/node_modules/h
ttp-server/bin/:/usr/local/lib/node_modules/node/lib/node_modules/http-server/bin/',
  PWD: '/Users/vlolet/Documents/study/node/process',
  LANG: 'zh_CN.UTF-8',
  XPC_FLAGS: '0x0',
  XPC_SERVICE_NAME: '0',
  SHLVL: '2',
  HOME: '/Users/vlolet',
  LOGNAME: 'vlolet',
  SECURITYSESSIONID: '186a7',
  COLORTERM: 'truecolor',
  _: '/usr/local/bin/node' }
version
  • 返回node版本
console.log(process.version)  //v10.16.0
versions
  • 返回node及node依赖包版本信息
console.log(process.versions)
  • 结果
1-2
pid
  • 当前进程的pid
console.log(process.pid)  // 7368
title
  • 当前进程的显示名称(Getter/Setter)
console.log(process.title)  // node
arch
  • 返回当前CPU处理器架构
console.log(process.arch) // x64
config
  • 返回一个 Object,其中包含用于编译当前 Node.js 可执行文件的配置选项的 JavaScript 表示形式。 这与运行 ./configure 脚本时生成的 config.gypi 文件相同。
console.log(process.config)
  • 结果


    1-3
platform
  • 返回当前操作系统平台
console.log(process.platform)  // darwin
cwd()
  • 返回当前进程的工作目录
console.log(process.cwd());  // /Users/vlolet/Documents/study/node/process
chdir(directory)
  • 改变当前进程的工作目录
memoryUsage()
  • 返回node进程的内存使用情况,单位是byte
console.log(process.memoryUsage())
/**{ rss: 25812992,
    heapTotal: 6537216,
    heapUsed: 4031056,
    external: 8272 } */
exit(code)
  • 退出
process.exit();
kill(pid)
  • 向进程发送信息

process对象输入输出

stdin,stdout:标准输入输出流(IO)

  • stdin:标准输入流
  • stdout:标准输出流
  • 标准输入设备:

向计算机输入数据和信息的设备。是计算机与用户或其他设备通信的桥梁。输入设备是用户和计算机系统之间进行信息交换的主要装置之一。键盘,鼠标,摄像头,扫描仪,光笔,手写输入板,游戏杆,语音输入装置等都属于输入设备。

  • 标准输出设备:

输出设备(Output Device)是计算机硬件系统的终端设备,用于接收计算机数据的输出显示、打印、声音、控制外围设备操作等。也是把各种计算结果数据或信息以数字、字符、图像、声音等形式表现出来。常见的输出设备有显示器、打印机、绘图仪、影像输出系统、语音输出系统、磁记录设备等

  • stdin和stdout提供了操作输入数据和输出数据的方法,我们也通常称为IO操作

stdout的作用:

  • console.log的内部是由它们实现的。
process.stdout.write('hello')  // hello
// 定义一个log方法,实现console的功能
function log(data){
  process.stdout.write(data)
}
log('hello')  // 输出hello

stdin的作用

  • 默认情况下输入流是关闭的,要监听处理输入流数据,首页要开启输入流
// 开启输入流
process.stdin.resume();

// 用于监听用户的输入数据
process.stdin.on('data',function(chunk){
  // chunk 是用户输入的字传进来,显示出来
  // process.stdout.write('hello')
  // 默认情况下是按下回车键
  console.log('用户输入了:'+chunk)
})
  • 用户输入完,按下回车,会将输入的值打印出来


    1-4

实现a+b的例子

// 开启输入流
process.stdin.resume();
var a;
var b;
// 先在控制台打印提示
process.stdout.write('请输入a的值:');
// 监听用户输入,并将值赋值
process.stdin.on('data',function(chunk){
  // 判断输入的是a
  if(!a){
    a = Number(chunk)
    // 输入a之后提示输入b
    process.stdout.write('请输入b的值:');
  }else{
    b = Number(chunk)
    // 输入b之后,将a+b的结果输出
    process.stdout.write('结果是:'+(a+b));
  }
})

Buffer(类)

  • 一个用于更好的操作二进制数据的类

我们在操作文件或者网络数据的时候,其实操作的就是二进制数据流,Node为我们提供了一个更加方便的去操作这种数据流的类Buffer,它是一个全局类

Buffer.alloc()/Buffer.allocUnsafe()

Buffer.alloc(size[, fill[, encoding]])

  • size 新 Buffer 的所需长度,当我们为一个Buffer对象分配空间大小以后,其长度是固定的,不能更改
  • fill | | | 用于预填充新 Buffer 的值。默认值: 0。
const buf = Buffer.alloc(5, 'a');
console.log(buf) // 
  • encoding 如果 fill 是一个字符串,则这是它的字符编码。默认值: 'utf8'。
const buf = Buffer.alloc(11, 'aGVsbG8gd29ybGQ=', 'base64');

console.log(buf);
// 打印: 

分配一个大小为 size 字节的新 Buffer。 如果 fill 为 undefined,则用零填充 Buffer。

const buf = Buffer.alloc(5);
console.log(buf)  // 
buf[6] = 10;  // 给第六个值设置为10,打印出长度还是5 这个长度不会变
console.log(buf) // 
// 修改位置为1的值
buf[1] = 2;
console.log(buf)  // 

Buffer.from(array)

const buf = Buffer.from([1, 2, 3]);
console.log(buf)  // 
buf[5] = 10;
console.log(buf) // // 

Buffer.from(string[,encoding])

  • string 要编码的字符串。
  • encoding string 的字符编码。默认值: 'utf8'。

创建一个包含 string 的新 Buffer。 encoding 参数指定 string 的字符编码。

const buf = Buffer.from('vloet');
console.log(buf)  //  注意这是16进制的

// 校验这个是不是16进制是不是对应的'vlolet’
for(var i= 0;i< buf.length;i++){
    // console.log(buf[[i]])  //  注意这是是二进制的 118 108 1111 101 116
    // 转成16进制的看看是不是一样的,结果是相等的
    // console.log(buf[i].toString(16))  // 转成16进制的 76 6c 6f 65 74
    console.log(String.fromCharCode(buf[i]))  // v l o et
}
const buf2 = Buffer.from ('free adn easy','utf-8')
console.log(buf2)  // 

注意下Buffer的长度

const str1 = 'vloet'
const buf1 = Buffer.from(str1)
console.log(str1.length)  // 5
console.log(buf1.length)  // 5

const str2 = '疏影流苏'
const buf2 = Buffer.from(str2)
console.log(str2.length)  // 4
console.log(buf2.length)  // 12
buf.length
  • 返回内存中分配给 buf 的字节数。单位bytes, 不一定反映 buf 中可用数据的字节量。

虽然 length 属性不是不可变的,但改变 length 的值可能会造成不确定的结果。 如果想改变一个 Buffer 的长度,应该将 length 视为只读的,且使用 buf.slice() 创建一个新的 Buffer。

let buf3 = Buffer.alloc(10)  
console.log(buf3)  // 
buf3 = buf3.slice(0,5);
console.log(buf3)  // 
buf[index]

获取或者设置在指定index索引位置的8为字节内容

buf.write(string[, offset[, length]][, encoding])
  • buf.write(要写入的字符串,从BUffer的对象中的第几位开始写入,写入字符串的长度,写入字符串的编码)

根据参数offset偏移量和指定的encodeing编码方式,将参数strings数据写入buffer

const str = 'vlolet'
// 创建一个长度为5的Buffer类
console.log(Buffer.from(str))  // 
const buf = Buffer.alloc(5)
// 将字符串写入buf类,注意字符截取
buf.write(str);  
console.log(buf)  // 
  • 其他参数含义

offset 偏移量是Buffer的,意思是将从buf对象的第一位写入字符串,Buffer是从零为开始的

const str = 'vlolet'
const buf = Buffer.alloc(5)
// 将字符串写入buf类,注意字符截取
//offset 偏移量是Buffer的,意思是将从buf对象的第一位写入字符串,Buffer是从零为开始的 


buf.write(str,1)  // 零位就是以00 填充的
console.log(buf)  // 
  • length:写多少位字符串到Buffer中
const str = 'vlolet'
const buf = Buffer.alloc(5)
// 将字符串写入buf类,注意字符截取
//offset 偏移量是Buffer的,意思是将从buf对象的第一位写入字符串,Buffer是从零为开始的 
buf.write(str,1,3)  // 零位就是以00 填充的,写入3个字符串
console.log(buf) // 
buf.toString([encoding[, start[, end]]])
const buf = Buffer.from('vlolet');
console.log(buf.toString())  // vlolet
console.log(buf.toString('utf-8',1,3));  // 从第一位且长度为3 lo

let buf2 = Buffer.from('疏影流苏');
console.log(buf2)  // 
console.log(buf2.toString('utf-8',1))  // ��影流苏 因为疏字是从第一位开始的,不完整所以乱码

根据encodeing参数(默认是'utf8')返回一个解码的string类型

buf.toJSON()

返回一个JSON标识的Buffer实例。JSON.stringify将会默认调用来字符串序列化这Buffer实例。

const buf = Buffer.from('vlolet');
console.log(buf.toJSON()) // { type: 'Buffer', data: [ 118, 108, 111, 108, 101, 116 ] } json对象
buf.slice([start[, end]])

返回一个新的buffer,这个buffer将会和老的buffer引用相同的内存地址。
注意:修改这个新的buffer实例slice切片,也会改变原来的buffer

  • start 新 Buffer 开始的位置。默认值: 0。
  • end 新 Buffer 结束的位置(不包含)。默认值: buf.length。
  • 返回:
let buf = Buffer.from('vlolet')
console.log(buf)  // 
let buf1 = buf.slice()
console.log(buf1)  // 
 let buf2 = buf.slice(2,4)   // 从第二位开始截取到第四位,不包含第四位 
 console.log(buf2)
 // 指向内存相同,改变的话会影响截取前的Buffer实例的值
buf2[0] = 2;
console.log(buf2)  //  第0个变成2
console.log(buf)  //   对应buffer的第2位也开始变成2了
buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])

进行buffer的拷贝

  • target , 要拷贝进的 Buffer 。
  • targetStart target 中开始写入之前要跳过的字节数。默认值: 0。
  • sourceStart buf 中开始拷贝的偏移量。默认值: 0。
  • sourceEnd buf 中结束拷贝的偏移量(不包含)。默认值: buf.length。
const buf = Buffer.from('vlolet')
let buf4 = Buffer.alloc(10)
 console.log(buf)  // 
// 从buf4第一位插入,由被拷贝的buffer中,第2位开始,到第四位结束,但不包含四四位
 buf.copy(buf4,1,2,4)  
 console.log(buf4)  // 
  • 返回: 拷贝的字节数。
const buf = Buffer.from('vlolet')
let buf4 = Buffer.alloc(10)
// 将buf拷贝到buf4
buf.copy(buf4)
 console.log(buf4)  //  
 // 修改buf4,不会影响到被拷贝的buf的值
 buf4[0] = 2
 console.log(buf4)  // 
 console.log(buf)  // 

类方法,静态方法,不需要生成实例的

Buffer.isEncoding(encoding)

encoding 要检查的字符编码名称。
如果给定的编码encodeing是有效的,返回true,否则返回false

  • 返回:
console.log(Buffer.isEncoding('utf-8'))  // Buffer是支持UTF-8的,所以返回true
console.log(Buffer.isEncoding('gbk'))  // 不支持十六进制,返回false
console.log(Buffer.isEncoding('hex'))   // true
Buffer.isBuffer(obj)

测试或者判断这个obj是否是一个Buffer

let arr = [1,2,3]
const buf = Buffer.alloc(10)
console.log(Buffer.isBuffer(arr))  // false
console.log(Buffer.isBuffer(buf))  //true
Buffer.byteLength(string[, encoding])

将会返回这个字符串真实byte长度。encoding默认编码是utf-8

let str1 = 'vlolet'
console.log(str1.length)  // 6
console.log(Buffer.byteLength(str1)) // 6

let str2 = '疏影流苏'
console.log(str2.length)  // 4
console.log(Buffer.byteLength(str2,'utf-8'))  // 12
console.log(Buffer.byteLength(str2,'ascii'))  // 4
Buffer.concat(list[, totalLength])

返回一个保存着将传入buffer数组中所有buffer对象拼接在一起的buffer对象

let str1 = 'vlolet'
let str2 = '疏'
let str3 = '水'

let list = [Buffer.from(str1),Buffer.from(str2),Buffer.from(str3)]
console.log(list)  //[ ,, ]
// 会把数组拼接成一个buffer
console.log(Buffer.concat(list))  //   
console.log(Buffer.concat(list,11))  // 
Buffer类总结:

输入输出流对应的用户数据其实就是一个Buffer类

process.stdout.write('请输入内容:');
// 开启输入流
process.stdin.resume()
// 监听用户行为
process.stdin.on('data',function(chunk){
    console.log(chunk)  // 
    console.log(chunk.toString())  // a
    // 当字符串拼接时,会自动调取toString()转换
    console.log(`输入的内容是${chunk}`)  // 输入的内容是b
 })
  • 结果


    1-5

你可能感兴趣的:(node基础APIBuffer(二))