<node.js中的buffer.fill方法使用说明_node.js
您的当前位置:首页正文

node.js中的buffer.fill方法使用说明_node.js

2023-12-05 来源:六三科技网

方法说明:

将制定数据填充到buffer中。

语法:

代码如下:buffer.fill(value, [offset], [end])

接收参数:

value 将要填充的数据

offet 填充数据的开始位置,不指定默认为 0

end 填充数据的结束位置,不指定默认为 buffer 的 长度。

例子:

代码如下://例子1中,不指定填充内容的起止位置var b = new Buffer(50);b.fill("h"); //例子2中,指定了填充内容的起止位置var b = new Buffer(50);var len = b.length;b.fill("h" , len-1 , len);

小编还为您整理了以下内容,可能对您也有帮助:

Buffer简单理解及常用方法介绍

javascript 中对数据处理都是以字符串的形式,而对于二进制数据就不便于处理,所以 Buffer 便是用于读取或操作二进制数据的对象。

通俗来说Buffer其实就是处理数据的方法,这点在官网文档里解释的很详细。
Buffer 是内存拷贝,而不是内存共享。

Buffer 占用内存被解释为一个数组,而不是字节数组。比如,new Uint32Array(new Buffer([1,2,3,4])) 创建了4个 Uint32Array,它的成员为 [1,2,3,4] ,而不是[0x1020304] 或 [0x4030201]。
注意:Node.js v0.8 只是简单的引用了array.buffer里的 buffer ,而不是克隆(cloning)。

介绍一个高效的方法,ArrayBuffer#slice() 拷贝了一份切片,而 Buffer#slice() 新建了一份。

类: Buffer
Buffer 类是全局变量类型,用来直接处理2进制数据。 它能够使用多种方式构建

Buffer.from(array) 返回一个新的 Buffer,其中包含提供的八位字节数组的副本。
Buffer.from(arrayBuffer[, byteOffset [, length]]) 返回一个新的 Buffer,它与给定的 ArrayBuffer 共享相同的已分配内存。
Buffer.from(buffer) 返回一个新的 Buffer,其中包含给定 Buffer 的内容的副本。
Buffer.from(string[, encoding]) 返回一个新的 Buffer,其中包含提供的字符串的副本。
Buffer.alloc(size[, fill[, encoding]]) 返回一个指定大小的新建的的已初始化的 Buffer。 此方法比 Buffer.allocUnsafe(size) 慢,但能确保新创建的 Buffer 实例永远不会包含可能敏感的旧数据。
Buffer.allocUnsafe(size) 和 Buffer.allocUnsafeSlow(size) 分别返回一个指定大小的新建的未初始化的 Buffer。 由于 Buffer 是未初始化的,因此分配的内存片段可能包含敏感的旧数据。

1.ascii——ASCI,仅适用于ASCII字符集。
2.utf8——UTF-8,这种可变宽编码适用于Unicode字符集的任何字符,它已经成了Web世界的首选编码,也是Node的默认编码类型。
3.base64——Base64,这种编码基于64个可打印ASCII字符来表示二进制数据,Base64通常用于在字符文档内嵌入可以被转化成字符串的二进制数据,在需要时又可以完整无损的转换回原来的二进制格式。

Buffer简单理解及常用方法介绍

javascript 中对数据处理都是以字符串的形式,而对于二进制数据就不便于处理,所以 Buffer 便是用于读取或操作二进制数据的对象。

通俗来说Buffer其实就是处理数据的方法,这点在官网文档里解释的很详细。
Buffer 是内存拷贝,而不是内存共享。

Buffer 占用内存被解释为一个数组,而不是字节数组。比如,new Uint32Array(new Buffer([1,2,3,4])) 创建了4个 Uint32Array,它的成员为 [1,2,3,4] ,而不是[0x1020304] 或 [0x4030201]。
注意:Node.js v0.8 只是简单的引用了array.buffer里的 buffer ,而不是克隆(cloning)。

介绍一个高效的方法,ArrayBuffer#slice() 拷贝了一份切片,而 Buffer#slice() 新建了一份。

类: Buffer
Buffer 类是全局变量类型,用来直接处理2进制数据。 它能够使用多种方式构建

Buffer.from(array) 返回一个新的 Buffer,其中包含提供的八位字节数组的副本。
Buffer.from(arrayBuffer[, byteOffset [, length]]) 返回一个新的 Buffer,它与给定的 ArrayBuffer 共享相同的已分配内存。
Buffer.from(buffer) 返回一个新的 Buffer,其中包含给定 Buffer 的内容的副本。
Buffer.from(string[, encoding]) 返回一个新的 Buffer,其中包含提供的字符串的副本。
Buffer.alloc(size[, fill[, encoding]]) 返回一个指定大小的新建的的已初始化的 Buffer。 此方法比 Buffer.allocUnsafe(size) 慢,但能确保新创建的 Buffer 实例永远不会包含可能敏感的旧数据。
Buffer.allocUnsafe(size) 和 Buffer.allocUnsafeSlow(size) 分别返回一个指定大小的新建的未初始化的 Buffer。 由于 Buffer 是未初始化的,因此分配的内存片段可能包含敏感的旧数据。

1.ascii——ASCI,仅适用于ASCII字符集。
2.utf8——UTF-8,这种可变宽编码适用于Unicode字符集的任何字符,它已经成了Web世界的首选编码,也是Node的默认编码类型。
3.base64——Base64,这种编码基于64个可打印ASCII字符来表示二进制数据,Base64通常用于在字符文档内嵌入可以被转化成字符串的二进制数据,在需要时又可以完整无损的转换回原来的二进制格式。

node.js bufferutil是干什么用的

在大多数介绍Buffer的文章中,主要是围绕数据拼接和内存分配这两方面的。比如我们使用fs模块来读取文件内容的时候,返回的就是一个Buffer:

fs.readFile('filename', function (err, buf) {

// <Buffer 2f 2a 2a 0a 20 2a 20 53 75 ... >

});

在使用net或http模块来接收网络数据时,data事件的参数也是一个Buffer,这时我们还需要使用Buffer.concat()()来做数据拼接:

var bufs = [];

conn.on('data', function (buf) {

bufs.push(buf);

});

conn.on('end', function () {

// 接收数据结束后,拼接所有收到的Buffer对象

var buf = Buffer.concat(bufs);

});

还可以利用Buffer.toString()来做转换base64或十六进制字符的转换,比如:

console.log(new Buffer('hello, world!').toString('base64'));

// 转换成base64字符串:aGVsbG8sIHdvcmxkIQ==

console.log(new Buffer('aGVsbG8sIHdvcmxkIQ==', 'base64').toString());

// 还原base64字符串:hello, world!

console.log(new Buffer('hello, world!').toString('hex'));

// 转换成十六进制字符串:68656c6c6f2c20776f726c6421

console.log(new Buffer('68656c6c6f2c20776f726c6421', 'hex').toString());

// 还原十六进制字符串:hello, world!

一般情况下,单个Node.js进程是有最大内存的,以下是来自官方文档中的说明:

What is the memory limit on a node process?

Currently, by default v8 has a memory limit of 512MB on 32-bit systems, and 1.4GB on 64-bit systems. The limit can be raised by setting --max_old_space_size to a maximum of ~1024 (~1 GB) (32-bit) and ~4096 (~4GB) (64-bit), but it is recommended that you split your single process into several workers if you are hitting memory limits.

由于Buffer对象占用的内存空间是不计算在Node.js进程内存空间上的,因此,我们也常常会使用Buffer来存储需要占用大量内存的数据:

// 分配一个2G-1字节的数据

// 单次分配内存超过此值会抛出异常 RangeError: Invalid typed array length

var buf = new Buffer(1024 * 1024 * 1024 - 1);

以上便是Buffer的几种常见用法。然而,阅读Buffer的API文档时,我们会发现更多的是readXXX()和writeXXX()开头的API,具体如下:

buf.readUIntLE(offset, byteLength[, noAssert])

buf.readUIntBE(offset, byteLength[, noAssert])

buf.readIntLE(offset, byteLength[, noAssert])

buf.readIntBE(offset, byteLength[, noAssert])

buf.readUInt8(offset[, noAssert])

buf.readUInt16LE(offset[, noAssert])

buf.readUInt16BE(offset[, noAssert])

buf.readUInt32LE(offset[, noAssert])

buf.readUInt32BE(offset[, noAssert])

buf.readInt8(offset[, noAssert])

buf.readInt16LE(offset[, noAssert])

buf.readInt16BE(offset[, noAssert])

buf.readInt32LE(offset[, noAssert])

buf.readInt32BE(offset[, noAssert])

buf.readFloatLE(offset[, noAssert])

buf.readFloatBE(offset[, noAssert])

buf.readDoubleLE(offset[, noAssert])

buf.readDoubleBE(offset[, noAssert])

buf.write(string[, offset][, length][, encoding])

buf.writeUIntLE(value, offset, byteLength[, noAssert])

buf.writeUIntBE(value, offset, byteLength[, noAssert])

buf.writeIntLE(value, offset, byteLength[, noAssert])

buf.writeIntBE(value, offset, byteLength[, noAssert])

buf.writeUInt8(value, offset[, noAssert])

buf.writeUInt16LE(value, offset[, noAssert])

buf.writeUInt16BE(value, offset[, noAssert])

buf.writeUInt32LE(value, offset[, noAssert])

buf.writeUInt32BE(value, offset[, noAssert])

buf.writeInt8(value, offset[, noAssert])

buf.writeInt16LE(value, offset[, noAssert])

buf.writeInt16BE(value, offset[, noAssert])

buf.writeInt32LE(value, offset[, noAssert])

buf.writeInt32BE(value, offset[, noAssert])

buf.writeFloatLE(value, offset[, noAssert])

buf.writeFloatBE(value, offset[, noAssert])

buf.writeDoubleLE(value, offset[, noAssert])

buf.writeDoubleBE(value, offset[, noAssert])

这些API为在Node.js中操作数据提供了极大的便利。假设我们要将一个整形数值存储到文件中,比如当前时间戳为1447656645380,如果将其当作一个字符串存储时,需要占用11字节的空间,而将其转换为二进制存储时仅需6字节空间即可:

var buf = new Buffer(6);

buf.writeUIntBE(1447656645380, 0, 6);

// <Buffer 01 51 0f 0f 63 04>

buf.readUIntBE(0, 6);

// 1447656645380

在使用Node.js编写一些底层功能时,比如一个网络通信模块、某个数据库的客户端模块,或者需要从文件中操作大量结构化数据时,以上Buffer对象提供的API都是必不可少的。

Node.js的Buffer写入

Buffer写入的语法如下:

buf.write(string[,offset[,length]][,encoding])

即根据encoding的字符编码写入string到buf中的offset位置。length参数是写入的字节数。如果buf没有足够的空间保存整个字符串,就只会写入string的一部分。只部分解码的字符不会被写入。该方法返回实际写入的大小。参数含义如下:

    ●    String:写入的字符串。

    ●    Offset:开始写入的索引值,默认为0。

    ●    Length:写入的字节数,默认为buffer.length。

    ●    Encoding:使用的编码,默认为"utf8"。

Node.js的Buffer写入

Buffer写入的语法如下:

buf.write(string[,offset[,length]][,encoding])

即根据encoding的字符编码写入string到buf中的offset位置。length参数是写入的字节数。如果buf没有足够的空间保存整个字符串,就只会写入string的一部分。只部分解码的字符不会被写入。该方法返回实际写入的大小。参数含义如下:

    ●    String:写入的字符串。

    ●    Offset:开始写入的索引值,默认为0。

    ●    Length:写入的字节数,默认为buffer.length。

    ●    Encoding:使用的编码,默认为"utf8"。

Node.js的Buffer与字符编码及转换

Buffer实例一般用于表示编码字符的序列,如UTF-8、UCS2、Base64或十六进制编码的数据。通过使用显式的字符编码就可以在Buffer实例与普通的JavaScript字符串之间进行相互转换。

Node.js目前支持的字符编码包括:

●    ascii:仅支持7位ASCII数据。如果设置去掉高位的话,那么这种编码是非常快的。

●    utf8:多字节编码的Unicode字符。许多网页和其他文档格式都使用UTF-8。

●    utf16le:2或4个字节,小端序编码的Unicode字符,支持代理对(U+10000 ~ U+10FFFF)。

●    ucs2:utf16le的别名。

●    base64:Base64编码。

●    latin1:一种把Buffer编码成一字节编码的字符串的方式。

●    binary:latin1的别名。

●    hex:将每个字节编码为两个十六进制字符。

Node.js的Buffer与字符编码及转换

Buffer实例一般用于表示编码字符的序列,如UTF-8、UCS2、Base64或十六进制编码的数据。通过使用显式的字符编码就可以在Buffer实例与普通的JavaScript字符串之间进行相互转换。

Node.js目前支持的字符编码包括:

●    ascii:仅支持7位ASCII数据。如果设置去掉高位的话,那么这种编码是非常快的。

●    utf8:多字节编码的Unicode字符。许多网页和其他文档格式都使用UTF-8。

●    utf16le:2或4个字节,小端序编码的Unicode字符,支持代理对(U+10000 ~ U+10FFFF)。

●    ucs2:utf16le的别名。

●    base64:Base64编码。

●    latin1:一种把Buffer编码成一字节编码的字符串的方式。

●    binary:latin1的别名。

●    hex:将每个字节编码为两个十六进制字符。

node.js语法

全局对象可以在程序的任何地方进行访问,可以为程序提供经常使用的特定功能

const url=require('url')

const querystringl=require('querystring')

异步编程的含义是指在执行异步操作的时候,不会影响其他语句的执行

回调函数类似于C++中的递归,但是不同的是,node.js中的递归实在使用函数的时候,嵌套调用

fB()和fA()都是一个函数

在javascript中监听:

on(eventName,eventHandler)
handler一般指的是一个对象

当对象满足事件发生的条件时,Node.js就会自动触发监听事件,执行监听事件中事件*的函数内容。但是,我们也需要主动触发监听事件,此时,使用方法emit()
on(eventName,eventHandler)

在第一部分中,我们介绍了process对象,这是一个全局对象。这个对象主要是用来描述程序的状态的。我们前面都是在process对象上进行添加监听事件,删除监听事件等操作的。之所以有这些操作,是因为process对象已经继承了EventEmitter这个类,所以我们可以直接用EventEmitter的方法。我们也可以自己定义一个EventEmitter对象,来实现事件监听

package.json相当于说明书,可以让项目开发者对包的信息一目了然,其中有各种描述信息

NPM(node package manager),同Node.js一起安装的包管理和分发工具,能够很方便的让JavaScript开发者下载、安装、上传、管理已经安装的包。
npm安装包后,会自动在项目的当前目录下创建一个目录,目录的名称叫做node_moles,然后把第三方包自动放在该目录下

createServer()可以创建server对象

server.listen(port)启动服务器
server.close()关闭服务器

response.writeHead(statusCode,statusMessage,headers)
response.end(data,encoding,callback)
end就可以输出内容返回给客服端

暂未明白如何使用

回调函数callback参数error可以得到异常,直接判断error是否存在即可

fs.readdir(path,function(err,files){})
err得到异常,files得到目录

需要npm安装mysql模块

node.js语法

全局对象可以在程序的任何地方进行访问,可以为程序提供经常使用的特定功能

const url=require('url')

const querystringl=require('querystring')

异步编程的含义是指在执行异步操作的时候,不会影响其他语句的执行

回调函数类似于C++中的递归,但是不同的是,node.js中的递归实在使用函数的时候,嵌套调用

fB()和fA()都是一个函数

在javascript中监听:

on(eventName,eventHandler)
handler一般指的是一个对象

当对象满足事件发生的条件时,Node.js就会自动触发监听事件,执行监听事件中事件*的函数内容。但是,我们也需要主动触发监听事件,此时,使用方法emit()
on(eventName,eventHandler)

在第一部分中,我们介绍了process对象,这是一个全局对象。这个对象主要是用来描述程序的状态的。我们前面都是在process对象上进行添加监听事件,删除监听事件等操作的。之所以有这些操作,是因为process对象已经继承了EventEmitter这个类,所以我们可以直接用EventEmitter的方法。我们也可以自己定义一个EventEmitter对象,来实现事件监听

package.json相当于说明书,可以让项目开发者对包的信息一目了然,其中有各种描述信息

NPM(node package manager),同Node.js一起安装的包管理和分发工具,能够很方便的让JavaScript开发者下载、安装、上传、管理已经安装的包。
npm安装包后,会自动在项目的当前目录下创建一个目录,目录的名称叫做node_moles,然后把第三方包自动放在该目录下

createServer()可以创建server对象

server.listen(port)启动服务器
server.close()关闭服务器

response.writeHead(statusCode,statusMessage,headers)
response.end(data,encoding,callback)
end就可以输出内容返回给客服端

暂未明白如何使用

回调函数callback参数error可以得到异常,直接判断error是否存在即可

fs.readdir(path,function(err,files){})
err得到异常,files得到目录

需要npm安装mysql模块

使用Node如何配置文件(详细教程)

这篇文章主要给大家介绍了关于Node实战之不同环境下配置文件使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面一起学习学习吧。

前言

在使用 Node.js 编写一个完整的项目时,程序中往往需要用到一些可配置的变量,从而使得程序能在不同的环境中运行,而众所周知,在实际的项目会存在多个不同的环境,不同的环境下,一些配置是不相同的,如何在不同的环境下调用不同的配置,提高开发效率?下面话不多说了,来一起看看详细的介绍吧。

1. config-lite模块

首先引入一个配置模块config-lite,使用命令npm i config-lite --save安装。

通常我们会针对不同的环境,将配置写入不同的配置文件中,在Node项目下新建config目录,里面新建不同环境的配置文件,这里我以『开发』以及『生产』两个环境作为例子来讲解如何操作。

开发环境中,我们在config目录下新建两个文件:test.js和default.js,你可能会问,为啥没有生产机配置文件,因为生产机配置要在生产环境下再创建嘛。

在test.js配置文件中写入代码如下(PS. 这里以mysql的配置为例):

// test.js

mole.exports = {

mysql : {

host: "localhost",

user: "lupeng",

password: "080910",

database: "b1imd"

}

};default.js里写入一些默认的配置文件,例如session的配置等。

// default.js

mole.exports = {

mysql : {

host: "10.20.141.220",

user: "lupeng",

password: "123456",

database: "b1imd"

},

session: {

secret: 'keyboard cat',

resave: false,

saveUninitialized: true,

cookie: {

maxAge: 1000*60*60

}

}

};好了,配置文件写好了,如何使用呢?这里我们使用的 config-lite模块,这个模块是依据环境变量来选择不同的配置文件的,所以在使用之前我们需要修改package.json里的启动命令:

"scripts": {

"start": "NODE_ENV=proction supervisor --harmony -i views/ ./bin/www",

"test": "NODE_ENV=test supervisor --harmony -i views/ ./bin/www"

},可以看到,上面有两条启动命令,一条是针对生产机,设置了NODE_ENV=proction,一条是针对测试机,设置了NODE_ENV=test,当我们使用npm test启动项目的时候,config-lite会去抓取test.js配置,并且会与default.js里配置去合并,如果有相同的对象,会覆盖default.js里的配置。如上例子都有mysql的对象,那么这里会以test.js里的对象为准。

好了,下面来介绍一下如何在项目中使用config-lite模块,在app.js里代码如下:

// 省略...

var config = require('config-lite')(__dirname);

// 省略...

app.use(session(config.session));

console.log("mysql服务器:" + config.mysql.host); // display mysql-config

// 省略...引入之后,可以直接使用配置文件中的配置对象。

2. 生产环境

那么在生产环境中,如何使用呢?上面已经介绍了config-lite基本原理以及用法,在生产环境的时候,我们只需要在生产机环境中config目录下新建proction.js文件,然后使用启动命令npm start即可。

为了避免测试环境以及生产坏境配置文件混淆,可以通过.gitignore文件忽略配置文件,添加如下:

# config

config/*

!config/default.*这样,git会忽略除了default.js之外的配置文件,在本地开发环境中,可以创建多个配置文件测试使用,只需设置对应的环境变量即可。需要注意的是环境变量名需同配置文件名一样。

3. windows环境

也许你是一个多系统环境开发者,可能同时在Linux和windows环境下开发,由于windows下设置环境的变量的语法不太一样,所以可以在package.json启动命令中再加上两句,如下:

"scripts": {

"start": "NODE_ENV=proction supervisor --harmony -i views/ ./bin/www",

"test": "NODE_ENV=test supervisor --harmony -i views/ ./bin/www",

"winStart": "SET NODE_ENV=proction&&supervisor --harmony -i views/ ./bin/www",

"winTest": "SET NODE_ENV=test&&supervisor --harmony -i views/ ./bin/www"

}这样,如果部署在windows环境下,在config目录下新建proction.js配置文件,启动命令npm winStart;如果部署在Linux或类Unix环境下,同样是创建proction.js,启动命令npm start即可。

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

详细解读React Native Flexbox布局

在vue单文件中有关引用路径有哪些方法?

详细介绍有关weex中的webpack.config.js改造

利用Node.js如何实现文件循环覆写

前言

这次编写Node.js项目的时候用到了日志模块,其中碰到了一个小问题。

这是一个定时执行可配置自动化任务的项目,所以输出信息会不断增加,也就意味着日志文件会随时间不断增大。如果对日志文件大小不加以控制,那么服务器的磁盘迟早会被撑满。所以文件大小是有必要的。

最理想的控制方式就是当文件大小超过时,清除最先记录的数据。类似一个FIFO的队列。

# 删除前面的数据

- 1 xxx

......

100 abc

# 文件末尾追加数据

+ 101 xxxx

log4js的file rolling

一提到记录日志很多Node.js开发者肯定会找到log4js,先来看看log4js是怎么处理这个问题的。

log4js分为很多appenders(可以理解为记录日志的媒介),file rolling功能可以通过函数来进行配置。

file rolling功能有两种方式:日期和文件大小。

要控制文件大小,当然选择后者。

为了测试这个功能是否满足我们要求,写一段循环代码来写日志。

const log4js = require('log4js')

// 配置log4js

log4js.configure({

appenders: {

everything: {

type: 'file',

filename: 'a.log',

maxLogSize: 1000,

backups: 0

},

},

categories: {

default: {

appenders: ['everything'],

level: 'debug'

}

}

});

const log = log4js.getLogger();

for (let i = 0; i < 41; i++) {

const str = i.toString().padStart(6, '000000');

log.debug(str);

}

执行之后生成两个文件a.log和a.log.1。

其中a.log.1有20行数据,实际大小1kb,a.log只有1行数据。

虽然确实控制了文件大小,但是会带来两个问题:

额外产生一个备份文件,总占用磁盘空间会超过文件。

日志文件内容的大小是变动的,查询日志的时候很可能需要联合备份文件进行查询(比如上面的情况日志文件只有1行数据)。

推测log4js的实现逻辑可能是下面这样:

检查日志文件是否达到大小,如果达到则删除备份文件,否则继续写入日志文件。

重命名日志文件为备份文件。

这显然不能完全满足需求。

字符串替换?

如果要在内存中完成循环覆写操作就比较简单了,使用字符串或Buffer的即可完成。

添加字符串/Buffer长度,如果超过大小则截取。

写入并覆盖日志文件。

但是有一个很大的问题:占用内存。

比如文件大小为1GB,有10个日志文件同时写入,那么至少占用10GB内存空间!

内存可是比磁盘空间更宝贵的,如此明显的性能问题,显然也不是最优解决方式。

file roll

按照需求可以把实现步骤拆成两步:

追加最新的数据到文件末尾。(Node.js的fs模块有相应函数)

删除文件开头超出部分。(Node.js没有响应函数)

这两步不分先后顺序,但是Node.js没有提供API来删除文件开头部分,只提供了修改文件指定位置的函数。

既然无法删除文件开头部分内容,那么我们就换个思路,只保留文件末尾部分内容(不超出大小)。

什么?这不是一个意思么?

略有区别~

删除是在原有文件上进行的操作,而保留内容可以借助临时文件来进行操作。

所以思路变成:

创建一个临时文件,临时文件的内容来自于日志文件。

往临时文件中增加数据。

将临时文件中符合文件大小的内容,从后往前(采取偏移量的形式)进行读取并复制到日志文件进行覆盖。

为了不占用额外的磁盘空间,写操作完成后删除临时文件。

这样就不会出现像log4js一样日志文件内容不全的现象,也不会保留额外的临时文件。但是对IO的操作会增加~

对于写操作可以采取tail命令来实现,最终实现代码如下:

private write(name: string, buf?: Buffer | string) {

// append buf to tmp file

const tmpName = name.replace(/(.*/)(.*$)/, '$1_.$2.tmp');

if (!existsSync(tmpName)) {

copyFileSync(name, tmpName);

}

buf && appendFileSync(tmpName, buf);

// if busy, wait

if (this.stream && this.stream.readable) {

this.needUpdateLogFile[name] = true;

} else {

try {

execSync(`tail -c ${limit} ${tmpName} > ${name}`);

try {

if (this.needUpdateLogFile[name]) {

this.needUpdateLogFile[name] = false;

this.write(name);

} else {

existsSync(tmpName) && unlinkSync(tmpName);

}

} catch (e) {

console.error(e);

}

} catch (e) {

console.error(e);

}

}

}

总结

完成这个功能有两点感悟:

量变引起质变。当数据量变大时,很多简单的处理方式就不可以用了,比如写文件,如果直接使用writeFile会占用大量内存甚至有可能内存都不够用。所以要通过合适的方式进行拆分,拆分过程中又会碰到各种问题,比如本文中截取文件内容的要求。

学会借力。君子性非异也善假于物也~当无法在单个点完成操作的时候可以借助外部条件来实现,比如在本文中使用临时文件来保存数据内容。

好了,

六三科技网还为您提供以下相关内容希望对您有帮助:

node.js bufferutil是干什么用的

这些API为在Node.js中操作数据提供了极大的便利。假设我们要将一个整形数值存储到文件中,比如当前时间戳为1447656645380,如果将其当作一个字符串存储时,需要占用11字节的空间,而将其转换为二进制存储时仅需6字节空间即可:...

Buffer简单理解及常用方法介绍

Buffer.from(string[, encoding]) 返回一个新的 Buffer,其中包含提供的字符串的副本。Buffer.alloc(size[, fill[, encoding]]) 返回一个指定大小的新建的的已初始化的 Buffer。 此方法比 Buffer.allocUnsafe(size) 慢,...

Node.js的Buffer写入

Buffer写入的语法如下:buf.write(string[,offset[,length]][,encoding])即根据encoding的字符编码写入string到buf中的offset位置。length参数是写入的字节数。如果buf没有足够的空间保存整个字符串,就只会写入string的一部分。...

node什么时候使用buffer

谓缓冲区Buffer,就是 "临时存贮区" 的意思,是暂时存放输入输出数据的一段内存。 JS语言自身只有字符串数据类型,没有二进制数据类型,因此NodeJS提供了一个与String对等的全局构造函数Buffer来提供对二进制数据的操作。

浅析nodejs的buffer比较怎么比较的

解决方法:(1) 通过可读流中的setEncoding()方法,该方法可以让data事件传递不再是Buffer对象,而是编码后的字符串,其内部使用了StringEncoder模块。(2) 将Buffer对象暂存到数组中,最后在组装成一个大Buffer让后编码转换为...

nodejs如何把c指针转成buffer

在nodejs里面需要通过socket向C进程发送结构体数据。Buffer 作为 nodejs 中重要的概念和功能,为开发者提供了操作二进制的能力。Buffer 是 nodejs 核心 API,它提供我们处理二进制数据流的功能。Buffer 的使用和 ES2017 的 ...

node.js buffer在哪

Node.js 里面,Buffer是一种特殊的数据结构,内存直接通过C++进行管理(并不是在V8的堆内存中)。为了高效的使用Buffer申请的内存,Node采用了slab分配机制。一般情况下,C++对于堆空间来说,默认是没有软限制的,只依赖硬...

网络请求出错什么意思

汉语中,“网络”一词最早用于电学《现代汉语词典》(1993年版)做出这样的解释:“在电的系统中,由若干元件组成的用来使电信号按一定要求传输的电路或这种电路的部分,叫网络。”在数学上,网络是一种图,一般认为专指加权...

nodejs的Buffer有办法像c的结构体那样用吗

可以使用ref和ref-struct模块 比如想要定义下面这样的结构 struct timeval { time_t tv_sec; /* seconds since Jan. 1, 1970 */ suseconds_t tv_usec; /* and microseconds */ };如果在nodejs里面用ref和...

C语言中buffer到底是什么意思?是数组?缓冲区?为什么一般C程序中都不定...

Buffer是NodeJS的重要数据类型,很有广泛的应用。代表原始堆的分配额的数据类型。在NodeJS中以类数组的方式使用。在Buffer类的描述中,Buffer被定义为用于特定基本类型数据的容器,且是特定基本类型的线性优先元素序列。Buffer...

本文如未解决您的问题请添加抖音号:51dongshi(抖音搜索懂视),直接咨询即可。

Top