概述
一、流
process.stdin / process.stdout
tty 模块包含 tty.ReadStream 和 tty.WriteStream 类。多数情况下,你不必直接使用这个模块。当 node 检测到自己正运行于 TTY 上下文时,process.stdin 将会是一个 tty.ReadStream 实例,并且 process.stdout 将会是 tty.WriteStream 实例。检测 node 是否运行在 TTY 上下文的好方法是检测 process.stdout.isTTY。大致可以把 tty 理解为用户打开的终端. 当标准输出为终端时,isTTY 就是为 true。
二、readline 模块
//基础例子一
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
//一旦 readline.Interface 实例被创建,最常见的用法是监听 'line' 事件
rl.on('line', (line) => {
console.log("输入为"+line);
});
//例二
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
prompt: '请输入> ' //输入提示,在使用rl.prompt();的地方出现
});
rl.prompt();
//rl.prompt()方法会在 output 流中新的一行写入 readline.Interface 实例配置后的 prompt,用于为用户提供一个可供输入的新的位置。
当被调用时,如果 input 流已被暂停,则 rl.prompt() 会恢复 input 流。
如果 readline.Interface 被创建时 output 被设为 null 或 undefined,则提示不会被写入。
rl.on('line', (line) => {
console.log(`你输入的是:'${line.trim()}'`);
}
rl.prompt();
}).on('close', () => {
//readline.Interface 实例结束时。
console.log('再见!');
process.exit(0);
});
//例三
const readline = require('readline');
const fs = require('fs');
const rl = readline.createInterface({
input: fs.createReadStream('sample.txt')
});
rl.on('line', (line) => {
console.log(line);
//逐行读取文件内容
});
三、fs模块
// fs.readFile() / fs.readFileSync()
fs.readFile(path.join(__dirname,'sample.txt'),'utf8', (err, data) => {
if (err) throw err;
console.log(data);
}); //如果未指定字符编码,则返回原始的 buffer。
//同步方法为:
var data = fs.readFileSync('./test.txt', 'utf8');
console.log(data);
// fs.writeFile() / fs.writeFileSync()
fs.writeFile(path.join(__dirname,"sample.txt"),"ninini",function (err) {
if(err) console.log('d');
})
//**如果文件已经存在,则替代文件**。 data 可以是一个字符串或一个 buffer。
//如果 data 是一个 buffer,则忽略 encoding 选项。它默认为 'utf8'
以上两种的读写操作,Node.js将文件内容视为一个整体,为其分配缓存区并且一次性将文件内容读取到缓存区中,在这个期间,Node.js将不能执行任何其他处理。所以当读写大文件的时候,有可能造成缓存区“爆仓”。
使用read和write则是将文件分成一块一块逐步操作,在读写文件过程中允许执行其他操作。下面将介绍。
// fs.appendFile(filename,data,[options],callback);
fs.appendFile(__dirname + '/test.txt', '追加的文件内容', function () { console.log('追加内容完成'); });
//打开文件
fs.open(__dirname + '/test.txt', 'r', '777', function (err, fd) {
console.log(fd);
});
//参数二 打开模式
//参数三可设置文件模式(权限和 sticky 位),但只有当文件被创建时才有效。默认为 0o666,可读写。
//callback 打开文件后回调函数,参数默认第一个err,第二个fd为一个整数,表示打开文件返回的文件描述符,window中又称文件句柄
//fs.read(fd, buffer, offset, length, position, callback)
//嵌套在open回调函数里,fd同open的fd,buffer是新建的buffer对象,用来存放读取的数据
//buffer 是数据将被写入到的 buffer。
//offset 是 **buffer 中**开始写入的偏移量。
//length 是一个整数,指定要读取的字节数。**每一个汉字utf8编码是3个字节,英文是1个字节**
//position 是一个整数,指定从文件中开始读取的位置。 如果 position 为 null,则数据从当前文件位置开始读取。
//callback(err, written, buffer), 写入操作执行完成后回调函数,written实际写入字节数,buffer被读取的缓存区对象
fs.open(__dirname + '/test.txt', 'r', function (err, fd) {
if(err) { console.error(err); return; }
else {
var buffer = new Buffer(255);
console.log(buffer.length);
fs.read(fd, buffer, 0, 9, 3, function (err, bytesRead, buffer) {
if(err) { throw err; }
else {
console.log(bytesRead);
console.log(buffer.slice(0, bytesRead).toString());
//读取完后,再使用fd读取时,基点是基于上次读取位置计算;
fs.read(fd, buffer, 0, 9, null, function (err, bytesRead, buffer) {
console.log(bytesRead);
console.log(buffer.slice(0, bytesRead).toString());
});
} });
}
});
//fs.write(fd, buffer, offset, length, position, callback);
fs.open(__dirname + '/test.txt', 'a', function (err, fd) {
if(err) { console.error(err); return; }
else {
var buffer = new Buffer('写入文件数据内容');
}
//写入'入文件'三个字
fs.write(fd, buffer, 3, 9, 12, function (err, written, buffer) {
if(err) { console.log('写入文件失败');
console.error(err); return; }
else {
console.log(buffer.toString());
//写入'数据内'三个字
fs.write(fd, buffer, 12, 9, null, function (err, written, buffer) {
console.log(buffer.toString());
})
}
});
}
});
但有的时候我们并不关心整个文件的内容,而只关注从文件中读取到的某些数据,以及读取到数据时需要执行的处理,这时我们可以使用文件流来处理。
1.createReadStream方法创建一个将文件内容读取为流数据的ReadStream对象
var fs = require('fs');
var readStream = fs.createReadStream('./message.txt',{start:3,end:12}); //改行代码自动打开并读取数据
readStream.on('open',function(fd){
console.log('开始读取文件');
});
readStream.on('data',function(data){
console.log('读取到数据:');
console.log(data);
});
readStream.on('end',function(){
console.log('文件已全部读取完毕');
});
readStream.on('close',function(){
console.log('文件被关闭');
});
readStream.on('error',function(err){
console.log('读取文件失败');
});
2、createWriteStream方法创建一个将流数据写入文件中的WriteStream对象
var fs = require('fs');
var file = fs.createReadStream('./message.txt');
var out = fs.createWriteStream('./anotherMessage.txt');
file.on('data',function(data){
out.write(data);
});
out.on('open',function(fd){
console.log('需要被写入的文件已打开');
});
file.on('end',function(){
//将操作系统缓存区中的数据全部写入文件
out.end('再见',function(){
console.log('文件全部写入完毕');
console.log('共写入'+out.bytesWritten+'数据');
});
});
四、buffer
JavaScript里的String对象,存储的是字符串,而且是Unicode编码的。
Buffer代表一个缓冲区,存储二进制数据,是字节流。我们在网络传输时,就传输的这种字节流。写文件时,也是写的字节流。
当我们实例化一个新的Buffer类,会根据实例化时的大小去申请内存空间,如果需要的空间小于8KB,则会多一次判定,判定当前的8KB载体剩余容量是否够新的buffer实例,如果够用,则将新的buffer实例保存在当前的8KB载体中,并且更新剩余的空间。
字符串是有编码格式的,比如UTF-8。而Buffer是没有编码格式的。两者可以相互转换。转换时必须指定编码格式。
Buffer有toString方法,可以按指定的编码格式将字节流转换为String。toString方法的第一个参数就是编码类型,支持常见的编码格式:
utf8,多字节编码的Unicode字符,大多数文档和网页采用这种编码格式
ascii,8bit编码,一个字符占1个字节
utf16le,小端编码的unicode字符
utf16be,大端编码的unicode
ucs2,unicode编码,每个字符占两个字节
base64,Base-64字符串编码
hex,每个字节编码为两个十六进制字符
Buffer.isEncoding(encoding)//判断是否为某种编码格式
为了使 Buffer 实例的创建更可靠、更不容易出错,各种 new Buffer() 构造函数已被 废弃,并由 Buffer.from()、Buffer.alloc()、和 Buffer.allocUnsafe() 方法替代。
五、HTTP模块
Node.js 的 HTTP API 是非常底层的。 它只涉及流处理与消息解析。 它把一个消息解析成消息头和消息主体,但不解析具体的消息头或消息主体。
message.headers 请求头或响应头的对象。头信息的名称与值的键值对
// 输出类似以下的东西:
// { 'user-agent': 'curl/7.22.0',
//
host: '127.0.0.1:8000',
//
accept: '*/*' }
console.log(request.headers);
http.Agent
Agent 负责为 HTTP 客户端管理连接的持续与复用.
等待请求队列 -》 有请求 使用socket连接 -》 socket放入连接池等待同一客户的的请求或销毁
(一个连接被客户端或服务器关闭时,它会被移出连接池。 连接池中任何未被使用的 socket 会被释放)
最后
以上就是玩命酸奶为你收集整理的node 学习总结(一)的全部内容,希望文章能够帮你解决node 学习总结(一)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复