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,这是为什么?


3 回复

当然可以!让我们来详细解答如何使用 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}`);
  }
});

解释

  1. 创建可读流:我们使用 fs.createReadStream 创建一个可读流来读取文件。
  2. 监听 ‘data’ 事件:当有数据块被读取时,'data' 事件被触发。我们将这些数据块拼接到 line 变量中。
  3. 处理行:我们检查 line 中是否包含换行符 \n。如果包含,我们提取这一行并打印出来,然后更新 line 以移除已处理的部分。
  4. 处理剩余数据:在 '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('读取完毕');
});

解释

  1. 创建可读流fs.createReadStream(path) 用于创建一个从文件中读取数据的可读流。
  2. 创建 readline 接口readline.createInterface 用于创建一个读取流的接口实例,该接口实例支持逐行读取文件内容。
  3. 处理每一行:通过监听 'line' 事件,可以逐行读取并处理文件内容。
  4. 监听结束事件:通过监听 'close' 事件,可以在文件读取完成后执行一些清理操作或通知。

这种方法确保了你可以逐行读取文件内容,而不需要一次性将整个文件加载到内存中,从而提高程序的效率和可靠性。

回到顶部