Bộ đệm Node.js

Bộ đệm là gì?

Bộ đệm là một vùng của bộ nhớ. Hầu hết các nhà phát triển JavaScript ít quen thuộc hơn với khái niệm này, so với các lập trình viên sử dụng ngôn ngữ lập trình hệ thống (như C, C ++ hoặc Go), tương tác trực tiếp với bộ nhớ hàng ngày.

Nó đại diện cho một đoạn bộ nhớ có kích thước cố định (không thể thay đổi kích thước) được phân bổ bên ngoài công cụ JavaScript V8.

Bạn có thể coi bộ đệm giống như một mảng các số nguyên, mỗi số đại diện cho một byte dữ liệu.

Nó được thực hiện bởi Node.js Lớp đệm.

Tại sao chúng ta cần một bộ đệm?

Bộ đệm đã được giới thiệu để giúp các nhà phát triển xử lý dữ liệu nhị phân, trong một hệ sinh thái theo truyền thống chỉ xử lý các chuỗi thay vì các mã nhị phân.

Bộ đệm trong Node.js không liên quan đến khái niệm bộ đệm dữ liệu. Đó là những gì sẽ xảy ra khi bộ xử lý luồng nhận dữ liệu nhanh hơn mức nó có thể tiêu hóa.

Cách tạo vùng đệm

Bộ đệm được tạo bằng cách sử dụng Buffer.from(), Buffer.alloc()Buffer.allocUnsafe() các phương pháp.

JS

const buf = Buffer.from('Hey!')

Bạn cũng có thể khởi tạo bộ đệm chuyển kích thước. Điều này tạo ra một bộ đệm 1KB:

JS

const buf = Buffer.alloc(1024)

const buf = Buffer.allocUnsafe(1024)

Trong khi cả hai allocallocUnsafe phân bổ một Buffer có kích thước được chỉ định tính bằng byte, Buffer được tạo bởi alloc sẽ là khởi tạo với các số 0 và một được tạo bởi allocUnsafe sẽ là chưa khởi tạo. Điều này có nghĩa là trong khi allocUnsafe sẽ khá nhanh so với allocphân đoạn bộ nhớ được cấp phát có thể chứa dữ liệu cũ có khả năng nhạy cảm.

Dữ liệu cũ hơn, nếu có trong bộ nhớ, có thể bị truy cập hoặc bị rò rỉ khi Buffer bộ nhớ được đọc. Đây là những gì thực sự làm cho allocUnsafe không an toàn và phải cẩn thận hơn trong khi sử dụng nó.

Sử dụng bộ đệm

Truy cập nội dung của bộ đệm

Bộ đệm, là một mảng byte, có thể được truy cập giống như một mảng:

JS

const buf = Buffer.from('Hey!')

console.log(buf[0])

console.log(buf[1])

console.log(buf[2])

Những con số đó là UTF-8 byte xác định các ký tự trong bộ đệm (H72, e101, y121). Điều này xảy ra bởi vì Buffer.from() sử dụng UTF-8 theo mặc định. Hãy nhớ rằng một số ký tự có thể chiếm nhiều hơn một byte trong bộ đệm (é195 169).

Bạn có thể in toàn bộ nội dung của bộ đệm bằng cách sử dụng toString() phương pháp:

JS

console.log(buf.toString())

buf.toString() cũng sử dụng UTF-8 theo mặc định.

Lưu ý rằng nếu bạn khởi tạo bộ đệm với một số đặt kích thước của nó, bạn sẽ có quyền truy cập vào bộ nhớ khởi tạo trước sẽ chứa dữ liệu ngẫu nhiên, không phải bộ đệm trống!

Nhận độ dài của một bộ đệm

Sử dụng length bất động sản:

JS

const buf = Buffer.from('Hey!')

console.log(buf.length)

Lặp lại nội dung của bộ đệm

JS

const buf = Buffer.from('Hey!')

for (const item of buf) {

console.log(item)

}

Thay đổi nội dung của bộ đệm

Bạn có thể ghi vào bộ đệm một chuỗi toàn bộ dữ liệu bằng cách sử dụng write() phương pháp:

JS

const buf = Buffer.alloc(4)

buf.write('Hey!')

Giống như bạn có thể truy cập bộ đệm bằng cú pháp mảng, bạn cũng có thể đặt nội dung của bộ đệm theo cách tương tự:

JS

const buf = Buffer.from('Hey!')

buf[1] = 111

console.log(buf.toString())

Cắt một bộ đệm

Nếu bạn muốn tạo hình ảnh trực quan một phần của bộ đệm, bạn có thể tạo một lát cắt. Một lát cắt không phải là một bản sao: bộ đệm ban đầu vẫn là nguồn gốc của sự thật. Nếu điều đó thay đổi, lát cắt của bạn sẽ thay đổi.

Sử dụng subarray() phương pháp để tạo ra nó. Tham số đầu tiên là vị trí bắt đầu và bạn có thể chỉ định tham số thứ hai tùy chọn với vị trí kết thúc:

JS

const buf = Buffer.from('Hey!')

buf.subarray(0).toString()

const slice = buf.subarray(0, 2)

console.log(slice.toString())

buf[1] = 111

console.log(slice.toString())

Sao chép bộ đệm

Có thể sao chép bộ đệm bằng cách sử dụng set() phương pháp:

JS

const buf = Buffer.from('Hey!')

const bufcopy = Buffer.alloc(4)

bufcopy.set(buf)

Theo mặc định, bạn sao chép toàn bộ bộ đệm. Nếu bạn chỉ muốn sao chép một phần của bộ đệm, bạn có thể sử dụng .subarray()offset đối số chỉ định một khoảng bù để ghi vào:

JS

const buf = Buffer.from('Hey?')

const bufcopy = Buffer.from('Moo!')

bufcopy.set(buf.subarray(1, 3), 1)

bufcopy.toString()

Trả lời