node文件读写套餐

readFile与writeFile

readFile跟writeFile,用法简单,只需要指定文件路径以及写个回调函数即可,平时用的比较多,注:readFile跟writeFile是一次性得到整个文件中的内容,占内存多;

例:用readFIle读取hello.txt中的文本(你好nodeJs)

var fs= require("fs");
            //2.读取文件 第一个参数是读取文件的路径
            //第二个参数是一个回调函数
            // 成功
            //     data 返回 数据
            //     error 返回 null
            // 失败
            //     data 返回 undefined
            //     error 返回 错误对象
fs.readFile("hello.txt",function(error,data){
    console.log(data);
    //<Buffer 68 65 6c 6c 6f 20 6e 6f 64 65 6a 73>

    //文件中存储的都是二进制 0 1
    //这里是因为二进制转换为node中16进制的Buffer存储
    //可以通过tostring方法转换为我们认识的字符

    console.log(data.toString());//你好nodeJs
    if(error!=null){
        console.log("读取文件失败");
    }
})

例:用writeFile往hello.txt中写入(hello,node)

var fs =require("fs");
//第一个参数:文件路径
//第二个参数:文件内容
//第三个参数:回调函数
fs.writeFile("hello.txt","hello node",function(error){
    console.log("输出成功");
});
//提示:可以将读取的文件内容转换为字符串再写入另外一个文件中
//例,读入hello.txt中的内容写入node.txt中
fs.readFile('hello.txt',function(error,data){
    fs.writeFile('node.txt',data.toString(),function(error){
        console.log('写入成功');
    });
});

read与write

read跟write相当于readFile跟writeFile的底层接口,它可以让你手动管理缓冲区和文件指针,但这同样要求你知道文件的大小,以及诸多的细节,一般情况下不建议使用

例:用read读取hello.txt中的文本(hello node)

var fs = require('fs');
//以只读的方式打开该文件
const fd = fs.openSync('hello.txt','r',0o666);
//设置Buffer 指定缓冲区大小20字节
const buf = Buffer.alloc(20);

//参数[文件描述符,buffer,buffer偏移量,指定文件读取字节长度,读取文件起始位置,[错误,读取字节数,缓冲区内容]]
//buffer偏移量简单说就是从buffer中哪个位置写入文件的内容,读取字节起始位置简单说就是从文件的哪个位置开始读取

//从buffer的第一个位置开始写入文件内容,最多写19字节长度的文件内容,从文件第2个位置开始获取文件内容
fs.read(fd,buf,1,19,2,function(err,bytesRead,buffer){
    if(err){
        console.log(err);
    }
    console.log(bytesRead);//8
    console.log(buffer);//<Buffer 00 6c 6c 6f 20 6e 6f 64 65 00 00 00 00 00 00 00 00 00 00 00>
    console.log(buffer.slice(1,bytesRead+1).toString());//llo node
});
//答案解析:文件位置从0开始,所以2号位置为hello node中的第一个l,依次往后读,内容为llo node
//         在把llo node写入buffer的时候,位置偏移到1号位置,所以我看到0号位置的数据为00

//如果对Buffer有不懂的可以看我写的Buffer简介

例:用write往hello.txt中写入(hello node)文件中已有12

var fs = require('fs');
//以读写的方式打开该文件
const fd = fs.openSync('c.txt','r+',0o666);//这里不用w的原因是,w容易导致文件内容出错。。。。。
//设置Buffer 指定缓冲区大小20字节
const buf = Buffer.alloc(20);
//Buffer中写入内容,并得到返回长度
let len = buf.write('hello node');//10

//参数跟read基本一样,需要注意的是这里的buffer偏移量的意思是从buffer中某个位置开始的内容写到文件中去,
//而byteWriten是写入长度,一般跟len相等
fs.write(fd,buf,0,len,2,function(err,byteWriten,buffer){
    if(err){
        console.log(err);
    }
    console.log(byteWriten);//10
    console.log(buffer);//<Buffer 68 65 6c 6c 6f 20 6e 6f 64 65 00 00 00 00 00 00 00 00 00 00>
    console.log(buffer.slice(1,byteWriten).toString());//ello node
});
fs.readFile('c.txt',function(err,data){
    console.log(data);//<Buffer 31 32 68 65 6c 6c 6f 20 6e 6f 64 65>
    console.log(data.toString());//12hello node
});

createReadStream跟createWriteStream

createReadStream跟createWriteStream是将一个文件拆成若干小份,一小份一小份的处理,所以占用内存少,简单叙述下用法;

例:用createReadStream读取hello.txt文件(hello node)

var fs = require('fs');
var readStream = fs.createReadStream('hello.txt');
readStream.on('open',function(fd){
    console.log('开始读取文件');
});
readStream.on('data',function(data){
    console.log('读取到数据:',data.toString());//hello node
});
readStream.on('end',function(){
    console.log('文件已全部读取完毕');
});
readStream.on('close',function(){
    console.log('文件关闭');
});
readStream.on('error',function(error){
    console.log('读取文件失败');
});
//其中open,data,end,close,error类似生命周期,用于读取中监听各个周期的事件,可以只写一个,如:我想读取数据,直接用data就OK了;

例:用createReadStream读取b.txt,然后用createWriteStream把b.txt的内容写入c.txt

var fs = require('fs');
//音频文件可以不用加utf-8
var readStream = fs.createReadStream('b.txt',{flags:'r',encoding:'utf-8'});
var writeStream = fs.createWriteStream('c.txt',{flags:'w',encoding:'utf-8');
readStream.on('data',function(data){
    writeStream.write(data);
})
//writeStrem事件有
ws.on('open',function(){
    console.log('文件打开');
})
ws.write('hello',function(err){
    if(err){
        console.log(err);
    }else{
        console.log('第一批数据流入完成');
    }
});
ws.write('World!',function(err){
    if(err){
        console.log(err);
    }else{
        console.log('第一二批数据流入完成');
    }
});
ws.end(function(){
    console.log('文件写入完毕');
})
ws.on('close',function(){
    console.log('文件关闭');
})

pipe的用法

let fs = require('fs');
let rs = fs.createReadStream('b.txt',{flags:'r',encoding:'utf-8'});
let ws = fs.createWriteStream('c.txt',{flags:'w',encoding:'utf-8'});
//由管子,直接从读入流文件直接写入到写入流文件
rs.pipe(ws);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值