Node.js简单文件,流式文件的读取

ZCQ
日期:2021年1月30日

简单文件的读取:

例1:显示一段文本


fs.readFile("hi3.txt",function(err,data){
    if(!err){   
        console.log(data.toString());   //data原本是个buffer     
    }
})

例2:将图片123.jpg复制一个并命名234.jpg


var fs=require("fs");
fs.readFile("123.jpg",function(err,data){
    if(!err){
        fs.writeFile("234.jpg",data,function(err){
            if(!err){
                console.log("写入成功");
            }
        })
    }
})
//123.jpg和234.jpg都在当前文本文件中

流式文件的读取

使用于大文件,可以分多次将文件读取到内存中


var fs=require("fs");
//创建一个可读流
var rs=fs.createReadStream("123.jpg");


//创建一个可写流
var ws=fs.createWriteStream("345.jpg");


//监听可读流的开启和关闭
rs.once("open",function()
{
    console.log("可读流打开了~~");
})

rs.once("close",function()
{
    console.log("可读流关闭了~~");
    //数据读取完毕,关闭可写流
    ws.end();
})

//监听可写流的开启和关闭
ws.once("open",function()
{
    console.log("可写流打开了~~");
})

ws.once("close",function()
{
    console.log("可写流关闭了~~");
})




//如果要读取一个可读流中的数据,必须要为可读流绑定一个data事件,data事件绑定完毕,它会自动开始读取数据
rs.on("data",function(data){
    //将读取到的数据data通过可写流写入文件
    ws.write(data);

})



流式文件读取的简单操作(通过pipe())
监听器省略


var fs=require("fs");
//创建一个可读流
var rs=fs.createReadStream("123.jpg");

//创建一个可写流
var ws=fs.createWriteStream("456.jpg");

//pipe可直接将可读流中的数据输入到可写流中
rs.pipe(ws)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是使用Node.js读取文本文件、筛选出出现次数最高的英语单词并限制内存的代码: ```js const fs = require('fs'); const readline = require('readline'); const { Writable } = require('stream'); // 用于存储单词及其出现次数的对象 let words = {}; // 创建可写用于过滤非英文字符 const filter = new Writable({ write(chunk, encoding, callback) { const text = chunk.toString().replace(/[^a-zA-Z]/g, ' '); // 将处理后的文本按空格分割为单词数组,并统计单词出现次数 text.split(' ').forEach((word) => { if (word) { words[word] = (words[word] || 0) + 1; } }); callback(); }, }); // 创建逐行读取器 const rl = readline.createInterface({ input: fs.createReadStream('note.txt'), crlfDelay: Infinity, }); // 监听可读上的data事件 rl.on('line', (line) => { // 将每行文本写入过滤 filter.write(line + '\n'); }); // 监听可读上的end事件 rl.on('close', () => { // 结束过滤 filter.end(); // 将单词及其出现次数转换为数组并按出现次数从高到低排序 const wordList = Object.entries(words).sort((a, b) => b[1] - a[1]); // 打印出现次数最高的单词 console.log('出现次数最高的单词是:', wordList[0][0]); }); // 监听可写上的finish事件 filter.on('finish', () => { // 清空单词对象以释放内存 words = {}; }); // 设置内存限制为10M process.setMaxListeners(0); process.memoryUsage = () => { const memoryUsage = process.memoryUsage(); if (memoryUsage.heapTotal > 10 * 1024 * 1024) { throw new Error('内存超过限制'); } return memoryUsage; }; ``` 在这个示例中,我们使用 `fs` 模块读取 `note.txt` 文本文件,并使用 `readline` 模块创建逐行读取器。我们还创建了一个可写 `filter`,用于过滤非英文字符并统计单词出现次数。我们在逐行读取器的 `line` 事件中将每行文本写入过滤,并在过滤的 `finish` 事件中将单词出现次数统计结果转换为数组并按出现次数从高到低排序,最后输出出现次数最高的单词。 为了限制内存使用,我们使用 `process.setMaxListeners(0)` 方法禁用事件监听器的最大限制,并重写了 `process.memoryUsage()` 方法,在内存使用超过10M时抛出错误。 请注意,这个示例只是一个简单的示例,不能处理复杂的文本文件,并且内存限制可能会影响程序的性能。如果您需要处理更复杂的文本文件,请考虑使用处理和优化内存使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

中南大学苹果实验室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值