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);