node.js的I/O流部分api代码演示

1.文件写入部分

/* 
  * 需求:
  * 新建一个文件,座右铭.text,写入内容,三人行,则必有我师焉
*/
//1. 导入fs模块
const fs=require('fs');

//2. 写入文件
/* 
*file  文件名
*data  写入的数据
*options 选项的设置(可选)
*callback 写入回调
*/
//这一块的话  是异步的  I/O  //总共有两个线程:一个是js  一个是磁盘的I/O线程
fs.writeFile('./座右铭.txt','三人行,则必有我师焉',err=>{
    //err  写入失败:错误的对象   写入成功:null
    if(err){
        console.log('写入失败');
        return;
    }
    console.log('写入成功');
});

console.log(1+1);
//同步写入   //这个是I/O线程   会停掉js线程   写完以后  继续执行js线程
fs.writeFileSync('./data.txt','test');

2.文件的追加写入

/* 
    追加写入可以在日志中进行使用
*/
//1.在座右铭.txt的文件中追加写入
const fs=require('fs');

//2.调用 appendFile
// fs.appendFile('./座右铭.txt',',择其善者而从之,其不善者而改之',err=>{
//     if(err){
//         console.log('写入失败~');
//         return;
//     }
//     console.log('追加写入成功!');
// });


// 同步的写入
// fs.appendFileSync('./座右铭.txt','\r\n温故而知新,可以为师矣.');

//fs.watchFile  也可以进行追加写入
fs.writeFile('./座右铭.txt','love love love',{flag:'a'},err=>{
    if(err){
        console.log('写入失败')
        return
    }
    console.log('写入成功!')

})

 3.流式写入

/** 
*观书有感.txt
*这个相比writeFile   可以用于写入频次较高的场景  这的话  就能不关闭通道的状态下  间歇性地写入
*/

//1.导入  fs
const fs= require('fs');

//2.创建写入流对象  //这一步仅仅是打开了I/O流的通道
const ws=fs.createWriteStream('./观书有感.txt');

//3.write  写入
ws.write('半亩方糖一片开\r\n');
ws.write('天光云影共徘徊\r\n');
ws.write('问渠那得清如许\r\n');
ws.write('为有源头活水来\r\n');


//4.关闭通道
ws.close();  //这个close  可写可不写

 4.文件读取

//1.引入fs模块
const fs=require('fs');


//2.异步读取
// fs.readFile('./观书有感.txt',(err,data)=>{
//     if(err){
//         console.log('读取失败');
//         return
//     }
//     console.log(data.toString());
// })

//3.同步读取
let data =fs.readFileSync('./观书有感.txt');
console.log(data.toString());

5.流式读取

//1.引入fs模块
const fs =require('fs');

//2.创建读取流对象
const rs=fs.createReadStream('./观书有感.txt');

//3.绑定 data 事件   //chunk 块
rs.on('data',chunk=>{
    console.log(chunk.length); //多少个字节   =>  kb
})


//4.end事件 可选的事件
rs.on('end',()=>{
    console.log('读取完成')
})

 6.文件复制

/* 
    需求:将观书有感.txt这个文件复制一份
*/
const fs=require('fs');
const process=require('process');  //这个是node.js其中的一个内置的内存变量   可以看代码执行的时候所占用的内存空间

//方式一: readFile   //一次性将文件全部读在内存当中  
//读取文件的内容
// let data = fs.readFileSync('./观书有感.txt');
//写入文件
// fs.writeFileSync('./观书有感2.txt',data);
// console.log(process.memoryUsage()); //当前内存的使用量 rss  单位字节    20439040/1024/1024


//方式二: 流式操作
//创建读取流对象   //这个是读一点  写一点
const rs=fs.createReadStream('./观书有感.txt');
//创建写入流对象
const ws=fs.createWriteStream('./观书有感3.txt');


//绑定data事件   //每次只取64kb的  只占64kb内存    //rss 20783104/1024/1024   文件过小 差别不大    
rs.on('data',chunk=>{
    ws.write(chunk);
})

rs.on('end',()=>{
    console.log(process.memoryUsage());
})


//方式三  管道复制
// rs.pipe(ws);

 7.文件重命名

//1.导入  fs 模块
const fs=require('fs');


//2.调用 rename  方法  进行重命名
// fs.rename('./座右铭.txt','./论语.txt',err=>{
//     if(err){
//         console.log('重命名失败');
//         return
//     }
//     console.log('重命名成功!')
// })


//3.rename 方法也可以用于文件的移动
fs.rename('./论语.txt','./测试/data.txt',err=>{
    if(err){
        console.log('文件移动失败!')
        return
    }
    console.log('文件移动成功!')
})


/* 
    fs.renameSync  两个参数   同步执行   不再演示
*/

8.文件删除操作

// 1.导入 fs 模块
const fs =require('fs');

// 2. 调用 unlink 方法
// fs.unlink('./观书有感3.txt',err=>{
//     if(err){
//         console.log('删除成功!')
//         return
//     }
//     console.log('删除失败!')
// })

//3.rm方法  在node 14.4中引入的
fs.rm('./观书有感2.txt',err=>{
    if(err){
        console.log('删除成功!')
        return
    }
    console.log('删除失败!')
})

9.文件夹操作

//1.导入  fs 模块
const fs =require('fs');

//2.创建文件夹  mk make制作  dir directory 文件夹
// fs.mkdir('./html',err=>{
//     if(err){
//         console.log('创建文件夹失败');
//         return
//     }
//     console.log('创建文件夹成功');
// })

 // 2-2 递归创建
//  fs.mkdir('./a/b/c',{recursive:true},err=>{
//     if(err){
//         console.log('创建文件夹失败');
//         return
//     }
//     console.log('创建文件夹成功');
// })

// 2-3 文件夹的读取
// fs.readdir('./html',(err,data)=>{   //这个方法可以得到文件夹中的资源名称  //返回的是一个数组
//     if(err){
//         console.log('读取失败')
//         return
//     }
//     console.log(data)
// })

// 2-4 删除文件夹
// fs.rmdir('./html',err=>{
//     if(err){
//         console.log('删除文件夹失败')
//         return
//     }
//     console.log('删除文件夹成功')
// })

// 2-5 递归删除
//recursive这个属性之后会被移除   不推荐使用rmdir
// fs.rmdir('./a',{recursive:true},err=>{
//     if(err){
//         console.log('删除文件夹失败')
//         return
//     }
//     console.log('删除文件夹成功')
// })

//推荐使用
fs.rm('./a',{recursive:true},err=>{
        if(err){
            console.log('删除文件夹失败')
            return
        }
        console.log('删除文件夹成功')
})

 10.查看信息资源

// 1.导入 fs 模块
const fs= require('fs');


//2. stat 方法   status 缩写 
fs.stat('./观书有感.txt',(err,data)=>{
    if(err){
        console.log('查看文件状态失败!')
        return
    }
    console.log(data)  //返回资源文件的信息
    console.log(data.isFile()) //这个资源是不是一个文件
    console.log(data.isDirectory()) //这个资源是不是一个文件夹
})

11.文件路径

// 1. 导入 fs 模块
const fs=require('fs');

//相对路径   //这个相对目录参照的是  命令行所执行的目录
// fs.writeFileSync('./index.html','love');


//绝对路径写入
fs.writeFileSync('D:/index测试.html','cceshi');

 12.相对路径的bug

//1. 导入 fs 模块

const fs=require('fs');

//相对路径
// console.log(__dirname,'保存的是所在文件所在目录的绝对路径')
fs.writeFileSync(__dirname+'/index.html','love1');


13.文件批量重命名

// 导入 fs 模块
const fs =require('fs');


// 读取  code  文件夹
const  files =fs.readdirSync('./code');

console.log(files);
//遍历数组
files.forEach(item=>{
    //1.拆分文件名
    let data =item.split('-');
    // console.log(data);
    let [num,name] =data;
    //判断
    // console.log(num,name,'数字,文件名');
    if(Number(num)<10){
        num='0'+num
    }
    //创建新的文件名
    let newName=num+'-'+name;
    console.log(newName,'新名字')
    //重命名
    fs.renameSync(`./code/${item}`,`./code/${newName}`)
})

你可能感兴趣的:(node.js,前端,javascript)