fs 模块视频教学

os 模块视频教学api doc

Buffer类


创建 Buffer 类

// 创建一个长度为 10、且用 0 填充的 Buffer。
const buf1 = Buffer.alloc(10); // 创建一个长度为 10、且用 0x1 填充的 Buffer。
const buf2 = Buffer.alloc(10, 1);

------------------------------------------------------------------
// 创建一个长度为 10、且未初始化的 Buffer。
// 这个方法比调用 Buffer.alloc() 更快,
// 但返回的 Buffer 实例可能包含旧数据,
// 因此需要使用 fill() 或 write() 重写。
const buf3 = Buffer.allocUnsafe(10);

-------------------------------------------------------------------
// 创建一个包含 [0x1, 0x2, 0x3] 的 Buffer。
const buf4 = Buffer.from([1, 2, 3]); // 创建一个包含 UTF-8 字节 [0x74, 0xc3, 0xa9, 0x73, 0x74] 的 Buffer。
const buf5 = Buffer.from('tést'); // 创建一个包含 Latin-1 字节 [0x74, 0xe9, 0x73, 0x74] 的 Buffer。
const buf6 = Buffer.from('tést', 'latin1');

写 Buffer类

buf = Buffer.alloc(256);
len = buf.write("www.runoob.com"); console.log("写入字节数 : "+ len);

读 Buffer类

1. 查看其中内容:

一个 Buffer 类似于一个整数数组,但它对应于 V8 堆内存之外的一块原始内存。

const buf = Buffer.from('runoob', 'ascii');

// 输出 72756e6f6f62
console.log(buf.toString('hex'));
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 目前支持的字符编码包括:

2. 转换为 JSON 对象:

const buf  = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]);
const json = JSON.stringify(buf);  // 隐式地调用了 toJSON() // 输出: {"type":"Buffer","data":[1,2,3,4,5]}
console.log(json); const copy = JSON.parse(json, (key, value) => {
return value && value.type === 'Buffer' ?
Buffer.from(value.data) :
value;
}); // 输出: <Buffer 01 02 03 04 05>
console.log(copy);
  • JSON.parse

服务器 --> 字符串 --> JavaScript 对象。

JSON.parse(text[, reviver])

对text进行parse后,再进行一次处理,示范试下:

<script>

var text = '{ "name":"Runoob", "initDate":"2013-12-14", "site":"www.runoob.com"}';
var obj = JSON.parse(text, function (key, value) {
if (key == "initDate") {
return new Date(value);
} else {
return value;
}}); document.getElementById("demo").innerHTML = obj.name + "创建日期:" + obj.initDate; </script>

缓冲区合并

/*
* Buffer.concat(list[, totalLength])
*/
var buffer1 = Buffer.from(('菜鸟教程'));
var buffer2 = Buffer.from(('www.runoob.com'));
var buffer3 = Buffer.concat([buffer1,buffer2]);
console.log("buffer3 内容: " + buffer3.toString());

缓冲区比较

var buffer1 = Buffer.from('ABC');
var buffer2 = Buffer.from('ABCD');
var result = buffer1.compare(buffer2);  // 是比较大小 if(result < 0) {
console.log(buffer1 + " 在 " + buffer2 + "之前");
}else if(result == 0){
console.log(buffer1 + " 与 " + buffer2 + "相同");
}else {
console.log(buffer1 + " 在 " + buffer2 + "之后");
}

缓冲区拷贝

/**
* buf.copy(targetBuffer[, targetStart[, sourceStart[, sourceEnd]]])
*/
var buf1 = Buffer.from('abcdefghijkl');
var buf2 = Buffer.from('RUNOOB'); //将 buf2 插入到 buf1 指定位置上
buf2.copy(buf1, 2); console.log(buf1.toString()); Result: abRUNOOBijkl

缓冲区裁剪

/**
* buf.slice([start[, end]])
*/
var buffer1 = Buffer.from('runoob');
// 剪切缓冲区
var buffer2 = buffer1.slice(0,2);
console.log("buffer2 content: " + buffer2.toString()); Result: buffer2 content: ru

缓冲区长度

var buffer = Buffer.from('www.runoob.com');
// 缓冲区长度
console.log("buffer length: " + buffer.length);

Node.js 文件系统


包括:文件操作和流操作

文件操作

Node 导入文件系统模块(fs),有异步、同步读取文件之分:

var fs = require("fs");

// 1.异步读取
fs.readFile('input.txt', function (err, data) {
if (err) {
return console.error(err);
}
console.log("异步读取: " + data.toString());
}); // 2.同步读取
var data = fs.readFileSync('input.txt');
console.log("同步读取: " + data.toString()); console.log("程序执行完毕。");
  • 同步也可能会影响异步:

如下是异步读文件。However, “线程delay 4秒会cover到这个异步,竟然使异步也delay 4sec.

  • 删除文件:unlink

以下接口参见原文:

watchfile方法监听一个文件,如果该文件发生变化,就会自动触发回调函数。

var fs    =require('fs');
var path =require('path');
var file1 =path.resolve('/test1/one.txt');
//监视文件
//当前程序没有结束,一直在监视文件
var listener=function(curr,prev){
console.log('监视文件发生修改');
};
fs.watchFile(file1, {interval:100}, listener);
//取消监视文件
//当前程序程序结束退出
fs.unwatchFile(file1,listener);

文件部分内容放入buffer中,提高了文件处理效率。

文件流操作

Stream 有四种流类型:

  • Readable - 可读操作。

  • Writable - 可写操作。

  • Duplex - 可读可写操作.

  • Transform - 操作被写入数据,然后读出结果。

所有的 Stream 对象都是 EventEmitter 的实例。常用的事件有:

  • data - 当有数据可读时触发。

  • end - 没有更多的数据可读时触发。

  • error - 在接收和写入过程中发生错误时触发。

  • finish - 所有数据已被写入到底层系统时触发。

读取流

触发机制:Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列。

var fs = require("fs");
var data = ''; // 创建可读流
var readerStream = fs.createReadStream(__dirname + 'input.txt', 'utf8');
// readerStream.setEncoding('UTF8'); // 一处编码方式设置即可

// 处理流事件 --> data, end, and error
readerStream.on('data', function(chunk) {
data += chunk;
}); readerStream.on('end',function(){
console.log(data);
}); readerStream.on('error', function(err){
console.log(err.stack);
}); console.log("程序执行完毕");

写入流

var fs = require("fs");
var data = '菜鸟教程官网地址:www.runoob.com'; // 创建一个可以写入的流,写入到文件 output.txt 中
var writerStream = fs.createWriteStream('output.txt'); // 使用 utf8 编码写入数据
writerStream.write(data,'UTF8'); // 标记文件末尾
writerStream.end(); // 处理流事件 --> data, end, and error
writerStream.on('finish', function() {
console.log("写入完成。");
}); writerStream.on('error', function(err){
console.log(err.stack);
}); console.log("程序执行完毕");

管道操作

管道流

简单的复制内容的操作

var fs = require("fs");

// 创建一个可读流
var readerStream = fs.createReadStream('input.txt'); // 创建一个可写流
var writerStream = fs.createWriteStream('output.txt'); // 管道读写操作
// 读取 input.txt 文件内容,并将内容写入到 output.txt 文件中
readerStream.pipe(writerStream); console.log("程序执行完毕");

链式流

链式流一般用于管道操作。

读文件 --> 压缩文件。

var fs   = require("fs");
var zlib = require('zlib'); // 压缩 input.txt 文件为 input.txt.gz
fs.createReadStream('input.txt')
.pipe(zlib.createGzip())
.pipe(fs.createWriteStream('input.txt.gz')); console.log("文件压缩完成。");

读文件 --> 解压文件。

var fs   = require("fs");
var zlib = require('zlib'); // 解压 input.txt.gz 文件为 input.txt
fs.createReadStream('input.txt.gz')
.pipe(zlib.createGunzip())
.pipe(fs.createWriteStream('input.txt')); console.log("文件解压完成。");

os模块

返回当前操作系统的换行符

const fs = require(`fs`);

// bad
fs.readFile('./myFile.txt', 'utf8', (err, data) => {
data.split('\r\n').forEach(line => {
// do something
});
}); // good
const os = require('os');
fs.readFile('./myFile.txt', 'utf8', (err, data) => {
data.split(os.EOL).forEach(line => {
// do something
});
});

os.tmpdir 方法返回操作系统默认的临时文件目录。

os.arch 方法返回当前计算机的架构。

require(`os`).arch()
// "x64"

列出当前系列的所有IP地址

var os = require('os');
var interfaces = os.networkInterfaces(); for (item in interfaces) {
console.log('Network interface name: ' + item);
for (att in interfaces[item]) {        // 看上去interface是个map
var address = interfaces[item][att]; console.log('Family: ' + address.family);
console.log('IP Address: ' + address.address);
console.log('Is Internal: ' + address.internal);
console.log('');
}
console.log('==================================');
}

(完)

[Node.js] 03 - Buffer, Stream and File IO的更多相关文章

  1. 笔记:Node.js 的 Buffer 缓冲区

    笔记:Node.js 的 Buffer 缓冲区 node.js 6.0 之前创建的 Buffer 对象使用 new Buffer() 构造函数来创建对象实例,但权限很大,可以获得敏感信息,所以建议使用 ...

  2. Node.js:Buffer浅谈

    Javascript在客户端对于unicode编码的数据操作支持非常友好,但是对二进制数据的处理就不尽人意.Node.js为了能够处理二进制数据或非unicode编码的数据,便设计了Buffer类,该 ...

  3. Node.js:理解stream

    Stream在node.js中是一个抽象的接口,基于EventEmitter,也是一种Buffer的高级封装,用来处理流数据.流模块便是提供各种API让我们可以很简单的使用Stream. 流分为四种类 ...

  4. Node.js 中的 stream

    什么是 stream Stream 借鉴自 Unix 编程哲学中的 pipe. Unix shell 命令中,管道式的操作 | 将上一个命令的输出作为下一个命令的输入.Node.js stream 中 ...

  5. Node.js的Buffer那些你可能不知道的用法

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

  6. Node.js:Buffer(缓冲区)介绍及常用方法

    JavaScript 语言自身只有字符串数据类型,没有二进制数据类型. 但在处理像TCP流或文件流时,必须使用到二进制数据.因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门 ...

  7. Node.js:Buffer

    ylbtech-Node.js:Buffer 1.返回顶部 1. Node.js Buffer(缓冲区) JavaScript 语言自身只有字符串数据类型,没有二进制数据类型. 但在处理像TCP流或文 ...

  8. node.js中buffer需要知道的一些点

    本文为阅读朴灵大大的<深入浅出node.js>笔记: 在前端开发的时候,我们不曾用过buffer,也没得用.buffer是node环境引入的,用来方便应对二进制数据的处理.这里我们对它应该 ...

  9. Node.js学习 - Buffer

    JavaScript 语言自身只有字符串数据类型,没有二进制数据类型.但在处理像TCP流或文件流时,必须使用到二进制数据. 因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门 ...

随机推荐

  1. only_full_group_by的注意事项

    only_full_group_by的注意事项 使用这个就是使用和oracle一样的group 规则, select的列都要在group中,或者本身是聚合列(SUM,AVG,MAX,MIN) 才行

  2. 使用 IntraWeb (33) - Cookie

    在 IW.HTTP.Cookie 单元提供有两个相关类: THTTPCookie.TCookieList; 另外 IWServerController 还有一个 CookieOptions 选项. 但 ...

  3. VMWare Station 问题汇总

    1.开机黑屏,不启动系统 解决方法: 命令行窗口cmd—输入下面代码,然后重启计算机. netsh winsock reset 2.提示磁盘被锁无法打开 解决方法: 虚拟机目录下面的.lck文件都删了

  4. 解决无法安装Flash Player的问题

    1.同时搜索几个关键词:关键词用空格分开,例如:“中国 历史”会搜索显示同时包含中国.历史两个词的网页 2.排除某个关键词:被排除的词前面加上-号,例如“中国 历史 -清朝”会把有清朝两个字的网页过滤 ...

  5. 461.汉明距离(c++实现)

    问题描述: 两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目. 给出两个整数 x 和 y,计算它们之间的汉明距离. 注意:0 ≤ x, y < 231. 示例: 输入: x = ...

  6. 在 Visual Studio 2010 中配置SharpPcap

    最近需要在C#下写一个抓取ARP包的程序,网上找来找去,在C#下只能用SharpPcap来做了.SharpPcap是作者把winPcap用C#重新封装而来的,详细信息见如下的链接. SharpPcap ...

  7. CentOS 7不能进入图形界面

    开机后发现CentOS 7不能进入图形界面,进入终端模式后运行startx命令也报错,不知道什么原因,后来运行了yum upgrade命令,升级以后就可以进入图形界面了,同时也升级了.

  8. toml

    其目标是成为一个小规模的易于使用的语义化配置文件格式.TOML被设计为可以无二义性的转换为一个哈希表(Hash table). # 这是一个TOML文件 title = "TOML Exam ...

  9. ffmpag总结_android_to_ios视频转换

    项目需求: 需要android和ios拍的视频在两个平台上都能播放. ffmpag很早以前就安装好了,忘了是如何装了. 一直无法将android同事的视频转成mp4在ios上播放. 后来发现ffmpa ...

  10. 移除list中null元素

    查询结果为null, list.size()却是1 移除该null元素 totalList.removeAll(Collections.singleton(null));