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可读流



以上是本文的全部内容,希望能对您有所帮助,希望大家多多支持。