Node.js 缓冲区(Buffer)

在Node.js中,我们可以使用缓冲区操作二进制数据。当使用流和文件工作时,我们主要使用 Buffer 类。缓冲区保存二进制数据,可以转换为其他格式,在操作中用于文件写入、拆分和重新组合。缓冲区的 length 属性没有返回内容的大小,而是缓冲区本身的大小!要使用TCP流和文件系统,开发人员添加了原生和快速支持来处理二进制数据。开发人员使用Buffer类在Node.js中做到这一点,它在全局可用。

例子

例如:

  1. var b = new Buffer(10000);
  2. var str = " ";
  3. b.write(str); // default is utf8, which is what we want
  4. console.log( b.length ); // will print 10000 still!

上面的代码生成以下结果。

Node.js 缓冲区(Buffer) - 图1

以下代码返回byteLength:

  1. var b = new Buffer(10000);
  2. var str = " ";
  3. b.write(str); // default is utf8, which is what we want
  4. console.log( str.length ); // prints 5
  5. console.log( Buffer.byteLength(str) ); // prints 15

上面的代码生成以下结果。

Node.js 缓冲区(Buffer) - 图2

编码

Node.js支持所有流行的编码格式,如ASCII,UTF-8和UTF-16。要将字符串转换为缓冲区,请调用Buffer类构造函数传递字符串和编码。

调用Buffer实例的toString方法,并传递一个编码方案进行转换缓冲区为字符串。

  1. // a string /*www.baidu.com*/
  2. var str = "Hello World from www.baidu.com";
  3. // From string to buffer
  4. var buffer = new Buffer(str, "utf-8");
  5. // From buffer to string
  6. var roundTrip = buffer.toString("utf-8");
  7. console.log(roundTrip); // Hello

注意

要将缓冲区转换为字符串,请使用toString方法。

  1. var b = new Buffer(100);
  2. var str = "this is a test";
  3. b.write(str); // default is utf8, which is what we want
  4. console.log(b.toString("utf8"));

要将一个缓冲区附加到另一个缓冲区的末尾,可以使用concat方法,如下所示:

  1. var b1 = new Buffer("My name is ");
  2. var b2 = new Buffer("www.baidu.com");
  3. var b3 = Buffer.concat([ b1, b2 ]);
  4. console.log(b3.toString("utf8"));

上面的代码生成以下结果。

Node.js 缓冲区(Buffer) - 图3

我们可以使用 fill方法填充缓冲区中的所有值,例如buf.fill(“\0")。buf.fill(“\ 0")是清零缓冲区。

在带有缓冲区的Web服务器中提供静态文件

以下代码显示如何创建Web服务器,使用节点缓冲区提供静态内容(HTML文件)。

  1. function handle_incoming_request (req, res) {
  2. if (req.method.toLowerCase() == "get" && req.url.substring(0, 9) == "/content/") {
  3. serve_static_file(req.url.substring(9), res);
  4. } else {
  5. res.writeHead(404, { "Content-Type" : "application/json" });
  6. var out = { error: "not_found",message: """ + req.url + "" not found" };
  7. res.end(JSON.stringify(out) + "\n");
  8. }
  9. }
  10. function content_type_for_path (file) {
  11. return "text/html";
  12. }
  13. var http = require("http"),
  14. fs = require("fs");
  15. var s = http.createServer(handle_incoming_request);
  16. s.listen(8080);

使用以下HTML内容创建名为 test.html 的文件。

  1. www.baidu.com
  2. Hello World!

  3.  
  4.  

然后运行服务器

  1. node server.js

然后询问test.html使用curl:curl -i -X GET http:// localhost:8080 / content / test.html

你应该看到类似以下的输出:

  1. HTTP/1.1 200 OK
  2. Date: Mon, 26 Nov 2012 03:13:50 GMT
  3. Connection: keep-alive
  4. Transfer-Encoding: chunked
  5.  
  6. www.baidu.com
  7. Hello World

  8.