2012-11-05 14 views
30

Tôi khá mới với bộ đệm và ReadableStream, vì vậy có lẽ đây là một câu hỏi ngu ngốc. Tôi có một thư viện mà có đầu vào như một ReadableStream, nhưng đầu vào của tôi chỉ là một hình ảnh định dạng base64. Tôi có thể chuyển đổi dữ liệu tôi có trong một vùng đệm như vậy:Chuyển đổi bộ đệm thành một dòng ReadableStream ở nút js

var img = new Buffer(img_string, 'base64'); 

Nhưng tôi không có ý tưởng làm thế nào để chuyển nó sang một ReadableStream hoặc chuyển đổi các Buffer tôi đắc đến một ReadableStream.

Có cách nào để làm điều này hoặc tôi đang cố gắng để đạt được điều không thể?

Cảm ơn.

Trả lời

20

Bạn có thể tạo một ReadableStream sử dụng Node Stream Buffers như vậy:

// Initialize stream 
var myReadableStreamBuffer = new streamBuffers.ReadableStreamBuffer({ 
    frequency: 10,  // in milliseconds. 
    chunkSize: 2048  // in bytes. 
}); 

// With a buffer 
myReadableStreamBuffer.put(aBuffer); 

// Or with a string 
myReadableStreamBuffer.put("A String", "utf8"); 

Tần số không thể bằng 0 vì vậy đây sẽ giới thiệu một sự chậm trễ nhất định.

+0

Cảm ơn, mặc dù hơi muộn. Tôi không nhớ làm thế nào tôi giải quyết vấn đề, nhưng điều này có vẻ là một giải pháp tốt đẹp. Nếu ai đó xác nhận điều này thì nó sẽ rất tuyệt. Tôi nhớ đã tìm ra ZERO về chuyển đổi này. – Masiar

+0

Xác nhận rằng nó hoạt động - tìm thấy điều này khi tìm kiếm cách biến filebuffers thành luồng. –

+0

Nếu bạn có tệp mà bạn xử lý tệp, bạn nên mở tệp đọc luồng ngay lập tức bằng cách này: http://nodejs.org/api/fs.html#fs_fs_createreadstream_path_options – vanthome

32

Node Stream Buffer rõ ràng được thiết kế để sử dụng trong thử nghiệm; không có khả năng tránh sự chậm trễ làm cho nó trở thành một sự lựa chọn không tốt cho việc sử dụng sản xuất.

Gabriel Llamas gợi ý streamifier trong câu trả lời này: How to wrap a buffer as a stream2 Readable stream?

+0

Chỉ muốn bình luận đây là giải pháp tốt nhất, nó tăng tốc độ tải lên của tôi gần gấp 10 lần trong một số trường hợp. Cảm ơn!! – Abadaba

+0

Hãy xem xét giải pháp này so với giải pháp được chấp nhận làm câu trả lời. –

6

một cái gì đó như thế này ...

import { Readable } from 'stream' 

const buffer = new Buffer(img_string, 'base64') 
const readable = new Readable() 
readable._read =() => {} // _read is required but you can noop it 
readable.push(buffer) 
readable.push(null) 

readable.pipe(consumer) // consume the stream 

Trong quá trình chung, chức năng một dòng có thể đọc được của _read nên thu thập dữ liệu từ các nguồn tiềm ẩn và push nó từng bước đảm bảo bạn không thu được một nguồn lớn vào bộ nhớ trước khi cần.

Trong trường hợp này, mặc dù bạn đã có nguồn trong bộ nhớ, vì vậy, không cần phải có _read.

Đẩy toàn bộ bộ đệm chỉ bao bọc bộ đệm trong luồng api có thể đọc được.

0

Đây là giải pháp đơn giản sử dụng mô-đun streamifier.

const streamifier = require('streamifier'); streamifier.createReadStream(new Buffer ([97, 98, 99])).pipe(process.stdout);

Bạn có thể sử dụng Strings, đệm và đối tượng như các đối số của nó.

Các vấn đề liên quan