Node.js流文件的读写操作的详细解释
Node.js是自然的异步事件驱动,非常适合处理我 / O相关的任务。如果你处理的我/ O相关的应用操作,你可以利用流量(流)在node.js.so让在流看一看,了解他们如何简化我 / O操作。流量是多少
流是UNIX管道,它允许您轻松地从数据源读取数据,然后再流到另一个目的地。
简而言之,流程不是特别的东西,它只是一个EventEmitter实现一些方法。根据它实现的方法,流可以成为可读流(读)、写(写),流和双向流(双工、可读性的同时)。
可读的流允许您从数据源读取数据,而写流允许您将数据写入目的地。
如果你已经使用了Node.js,你可能会遇到的流量已经。
例如,在一个Node.js的HTTP服务器,请求一个可读的流,和响应是一个可写流。
您还可以使用fs模块,它可以帮助您处理可读的和可写的流。
现在让我们了解一些不同类型流的基础。本文将讨论可读的和可写的流,这些超出了本文的讨论范围,我们不讨论它。
可读流(可读流)
我们可以从一个可读的流数据源读取数据,它可以是任何东西,如制度文件、内存缓冲区中,甚至其他流。由于流是EventEmitter,他们发送的数据在一系列的活动。我们将利用这些事件使流工作。
从流中读取数据
从流中读取数据的最佳方法是监听数据事件并添加回调函数。当有数据流时,可读的流发送数据事件,并触发回调函数:
VaR FS =需要('fs);
无功readablestream = fs.createreadstream(文件.txt);
var数据=;
无功readablestream.on(数据功能(块){)
数据块;
});
readablestream.on(最终,函数(){(){
console.log(数据);
});
fs.createreadstream会给你一个可读的流。
在开始时,流不是动态的,当您添加数据的事件监听器并添加回调函数时,它会变成一个流动态,之后,它读取一小段数据并将其传递到回调函数中。
流的执行者决定例如数据事件,触发频率,HTTP请求触发事件时,它读取数据几KB的数据。当你从文件中读取数据,你可能会决定数据的事件被触发时,一行读。
当没有数据可读(当文件的结尾被读取)时,流发送结束事件。在上面的例子中,我们监视事件并在读取文件时打印数据。
还有另一种读取流的方法,您可以通过读取文件的结尾调用流实例中的读()方法。
VaR FS =需要('fs);
无功readablestream = fs.createreadstream(文件.txt);
var数据=;
var块;
readablestream.on('readable,函数(){(){
而(((块= readablestream.read())!= NULL){
数据块;
}
});
readablestream.on(最终,函数(){(){
console.log(数据);
});
读()方法从内部缓冲区读取数据,当没有数据可读时返回null。
因此,在while循环中,我们检查读()是否返回null,当返回null时,循环终止。
重要的是要注意,当我们可以从流中读取数据时,可读事件被触发。
设置代码
默认情况下,你所读到的从流的缓冲区对象。如果你想读取一个字符串,它不适合你。所以,你可以通过调用Readable.setEncoding集的流代码()如下例:
VaR FS =需要('fs);
无功readablestream = fs.createreadstream(文件.txt);
var数据=;
readablestream.setencoding('utf8);
readablestream.on(数据功能(块){
数据块;
});
readablestream.on(最终,函数(){(){
console.log(数据);
});
在上面的例子中,我们设置流代码UTF8,并将数据解析成UTF8,并在回调函数将一个字符串的块。
管道(管道)
管道是一个很好的机制,您不需要管理自己的状态流来从数据源读取数据并将其写入目的地。
VaR FS =需要('fs);
无功readablestream = fs.createreadstream('file1 .txt);
无功writablestream = fs.createwritestream('file2 .txt);
readablestream.pipe(writablestream);
上面的例子使用管道()写1的含量为源文件的方法。因为管()会帮助你管理数据流,你不必担心数据流的速度,这使得管()非常简单和容易使用。
重要的是要注意管道()将返回目的地流,因此您可以轻松地连接多个流!
链接(链接)
假设有一个存档文件,你想将它解压缩。有许多方法来完成这个任务。但最简单的方法是利用管道和链接:
VaR FS =需要('fs);
VaR zlib =需要('zlib);
fs.createreadstream(输入.txt。广州)
管(zlib.creategunzip())。
。管(fs.createwritestream('output .txt));
首先,我们通过input.txt.gz创建一个可读的流,然后让它的zlib.creategunzip流()流,这将内容。最后,我们添加了一个可写流写入另一个文件解压缩后的内容。
其他的方法
我们已经讨论过可读流中的一些重要概念,下面是一些你需要知道的方法:
1.readable.pause()这个方法停止流动。换句话说,它不会触发数据事件再次。
2.readable.resume()这个方法,通过以上的对比,会让暂停流恢复流。
3.readable.unpipe()这个方法删除目的地。如果一个参数是通过,它将允许可读流停止一个特定目标的刘翔,否则将删除所有的目的地。
可写流(可写流)
写流让你写数据到目的地。像可读流,这些是EventEmitter,也触发不同的事件,我们在事件和方法可以在写流触发看。
写流
要将数据写入可写流,需要在写流实例中调用写()方法,并参见下面的示例:
VaR FS =需要('fs);
无功readablestream = fs.createreadstream('file1 .txt);
无功writablestream = fs.createwritestream('file2 .txt);
readablestream.setencoding('utf8);
readablestream.on(数据功能(块){
writablestream.write('chunk);
});
上面的代码非常简单,它只读取输入流中的数据,然后用写()将其写到目的地。
这个方法返回一个布尔值来指示一个写是否成功。如果返回是真的,这意味着写成功,你可以继续写更多的数据。如果它是错误的,这意味着有问题,你现在不能继续写。写流触发一个漏事件告诉你你可以继续写数据。
写完数据之后
当你不需要写数据时,你可以调用结束()方法告诉你已经写完的流,假设RES是一个HTTP响应对象,你通常会发送响应到浏览器:
res.write(一些数据!!!);
res.end();
当调用结束()时,所有数据都被写入,流触发一个完成事件。请注意,在调用完()之后,您不能再次将数据写入可写流:
res.write(一些数据!!!);
res.end();
res.write('想再写'); / /错误!
下面是与写流相关的一些重要事件:
1.error触发时写的一个,或链接错误
2.pipe u2013触发这个事件的时候,可读与可写流流
3.unpipe -触发时调用unpipe可读流
以上是本文的全部内容,希望能对您有所帮助,希望大家多多支持。