Mục lục
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()
và 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 alloc
và allocUnsafe
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 alloc
phâ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 (H
→ 72
, e
→ 101
, y
→ 121
). Đ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()
và 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()