Nodejs fs.readstream 如何读取?
Nodejs fs.readstream 如何读取?
想读取一个密码字典,内容大概如下
//dic.txt
a
passw
passwo
password3
密码长度不同
//API上的例子
var fs = require(‘fs’);
var path = “dic.txt”;
var dic = fs.createReadStream(path);
var chunk
;
dic.on(‘readable’, function() {
var chunk;
while (null !== (chunk = dic.read())) {
console.log('got %s ', chunk);
}
});
这样会把全部内容读出来,但是我想一行一行读的话
var fs = require('fs');
var path = "dic.txt";
var dic = fs.createReadStream(path);
var chunk
console.log(chunk=dic.read());
这要返回的却是null,这是为什么?
当然可以!让我们来详细解答如何使用 Node.js 的 fs.createReadStream
方法逐行读取文件。
背景知识
fs.createReadStream
创建了一个可读流(Readable Stream),它允许你以块为单位读取文件内容。默认情况下,当有数据可用时,'data'
事件会被触发,你可以通过监听这个事件来处理每一小块数据。
示例代码
为了实现逐行读取文件内容,我们可以利用 'data'
事件来收集数据块,并在遇到换行符 \n
时处理这一行的数据。以下是一个完整的示例:
const fs = require('fs');
// 指定文件路径
const path = 'dic.txt';
// 创建可读流
const readStream = fs.createReadStream(path);
// 初始化一个空字符串用于存储当前行
let line = '';
// 监听 'data' 事件
readStream.on('data', (chunk) => {
// 将新数据添加到当前行
line += chunk.toString();
// 检查当前行是否包含换行符
const index = line.indexOf('\n');
if (index !== -1) {
// 如果有换行符,则提取并打印该行
const currentLine = line.substring(0, index);
console.log(`Got line: ${currentLine}`);
// 更新line,移除已处理的行
line = line.substring(index + 1);
}
});
// 监听 'end' 事件,确保所有数据都被处理
readStream.on('end', () => {
// 处理最后一行,如果它没有换行符
if (line.length > 0) {
console.log(`Got line: ${line}`);
}
});
解释
- 创建可读流:我们使用
fs.createReadStream
创建一个可读流来读取文件。 - 监听 ‘data’ 事件:当有数据块被读取时,
'data'
事件被触发。我们将这些数据块拼接到line
变量中。 - 处理行:我们检查
line
中是否包含换行符\n
。如果包含,我们提取这一行并打印出来,然后更新line
以移除已处理的部分。 - 处理剩余数据:在
'end'
事件中,我们确保最后可能未处理的行也被打印出来。
注意事项
createReadStream
是异步的,因此它不会阻塞其他操作,适合处理大文件。- 使用
chunk.toString()
将 Buffer 对象转换为字符串,以便我们可以进行字符串操作。
希望这个示例能帮助你理解如何逐行读取文件内容!
当我什么都没问……O_O
要实现逐行读取文件内容,可以使用 createReadStream
结合 readline
模块。fs.createReadStream
本身并不保证每次调用 read()
都能读取到数据,尤其是当数据量较大时。以下是如何使用 readline
模块来逐行读取文件内容的示例:
示例代码
const fs = require('fs');
const readline = require('readline');
const path = 'dic.txt';
// 创建可读流
const stream = fs.createReadStream(path);
// 创建可读流的接口实例
const readerStream = readline.createInterface({
input: stream,
crlfDelay: Infinity // 处理 CRLF 换行符
});
// 逐行处理数据
readerStream.on('line', (line) => {
console.log(`读取到的行: ${line}`);
});
// 监听结束事件
readerStream.on('close', () => {
console.log('读取完毕');
});
解释
- 创建可读流:
fs.createReadStream(path)
用于创建一个从文件中读取数据的可读流。 - 创建
readline
接口:readline.createInterface
用于创建一个读取流的接口实例,该接口实例支持逐行读取文件内容。 - 处理每一行:通过监听
'line'
事件,可以逐行读取并处理文件内容。 - 监听结束事件:通过监听
'close'
事件,可以在文件读取完成后执行一些清理操作或通知。
这种方法确保了你可以逐行读取文件内容,而不需要一次性将整个文件加载到内存中,从而提高程序的效率和可靠性。