初学Node(五)文件I/O
文件读写
Node的出现的一个亮点就是让JS也有了读写文件的能力,而且实现起来要比其他语言更简单,对文件的一些操作我们都可通过fs模块来完成。fs即fileSystem的缩写,fs模块可以完成对文件的所有操作。
可以通过fs.readFileSync来同步的读取文件:
var fs = require("fs");
var data = fs.readFileSync("content.txt");
console.log(data.toString());
fs已经帮我们实现了一个读取文件的API,我们不用再像其他语言一样还要实例化IO对象,直接引入fs模块,调用readFileSync这个函数即可。
对文件的读取也可以通过fs.readFile(path,callback)来完成,这是一个异步的读取文件API,所以参数除了要读取的文件意外还需要一个读取完成的回调函数,相比同步读取,异步读取更加高效和实用:
var fs = require("fs");
fs.readFile("content.txt",function(err,data){
if(err){
return console.log(err.stack);
}
console.log("--文件读取成功--");
console.log(data.toString());
});
可以通过fs.writeFile来实现将内容写入到一个文件,如果文件已经错在就会改变里面的内容,如果不存在就创建然后在写入内容:
var fs = require("fs");
var data = "我是通过JS写入到文件的内容";
fs.writeFile("JSContent.txt",data,function(err){
if(err){
return console.log(err.stack);
}
console.log("文件写入完毕");
});
一个小demo测试读写文件的使用:
新建一个file文件夹,在里面新建新建一个template.html、head.txt、body.txt、foot.txt、demo.js:
template.html内容如下:
<body>
{{head.txt}}
{{body.txt}}
{{foot.txt}}
</body>
head.txt如下:
<h1>我是头部</h1>
body.txt如下:
<div>我是主体</div>
foot.txt如下:
<footer>我是尾部</footer>
demo.js如下:
var fs = require("fs");
fs.readFile("template.html",function(err,data){
if(err){
return console.log("读取文件错误");
}
var result = data.toString().replace(/{{\w*.\w*}}/g,function(one){
return fs.readFileSync(one.substring(2,one.length-2));
});
fs.writeFile("result.html",result,function(err){
if(err){
return console.log("生成文件错误");
}
console.log("生成文件成功");
});
});
我们在命令行中执行node.js就会生成一个正常的result.html文件了。
以流的方式来读写文件
利用流来读取文件:
var fs = require("fs");
var readStream = fs.createReadStream("content.txt");
readStream.setEncoding("UTF8");
readStream.on("data",function(data){
console.log(data);
});
readStream.on("end",function(){
console.log("文件读取完毕");
});
readStream.on("error",function(err){
console.log("读取文件错误:"+err.stack);
});
首先利用fs模块创建一个文件的读取流,然后设置读取内体的字符设置,读取流有三个事件分别为data,end,error,data即读取文件内容的时候,end即内容读取完毕时,error即读取文件发生错误时,我们可以为每一个事件定义对应的事件处理函数来完成我们的操作。
利用流来将内容写入文件:
var fs =require("fs");
var writeStream = fs.createWriteStream("content.txt");
writeStream.write("我是通过写入流写入的内容","UTF8");
writeStream.end();
writeStream.on("finish",function(){
console.log("文件写入成功");
});
writeStream.on("error",function(err){
console.log("写入文件时发生错误:"+err.stack);
});
使用方式和读取流基本一致,不过事件换成了finish事件,表示文件写入成功时的事件,这个事件只有在调用end()函数之后才能被触发,end()表示内容已经写入完毕了。
当我们在实现一个复制文件的功能时,如果原始文件过大这个操作就会很耗时,此时我们就要利用管道流来优化这个过程,管道流在复制文件时并不会在将第一个文件的内容读取完毕后再写入目标文件,而是每读取一段内容就将这段内容写入到文件,然后在读在些一直到文件复制完毕:
var fs =require("fs");
var readStream = fs.createReadStream("content.txt");
var writeStream = fs.createWriteStream("result.txt");
readStream.pipe(writeStream);
console.log("复制完成");
pipe函数就是我们所说的管道,我们可以把它看做是连接读取流和写入流的桥梁。
初学Node(五)文件I/O的更多相关文章
- Node开发文件上传系统及向七牛云存储和亚马逊AWS S3的文件上传
背景起,有奏乐: 有伟人曰:学习技能的最好途径莫过于理论与实践相结合. 初学Node这货时,每每读教程必会Fall asleep. 当真要开发系统时,顿觉精神百倍,即便踩坑无数也不失斗志. 因为同团队 ...
- Node.js文件操作二
前面的博客 Node.js文件操作一中主要是对文件的读写操作,其实还有文件这块还有一些其他操作. 一.验证文件path是否正确(系统是如下定义的) fs.exists = function(path, ...
- Node复制文件
本人开发过程中,经常遇到,要去拷贝模板到当前文件夹,经常要去托文件,为了省事,解决这个问题,写了一个node复制文件. // js/app.js:指定确切的文件名.// js/*.js:某个目录所有后 ...
- node读写文件
结束了一天的工作和学习,今天对于自己最大的收获就是node读写文件和对callback函数有了更深一步的理解.总结一下node读写的文件的注意事项吧(注意:下面讲的是增加数据的方法): 1.我们可以封 ...
- node——读取文件中的路径问题
前提 当前的js文件叫_dirnameandfilename.js和hello.txt同在G:\node练习文件夹下 还有一个_dirnameandfilename.js文件在i:/文件夹,但是i:/ ...
- 使用Typescript重构axios(二十五)——文件上传下载进度监控
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- Node.js 文件上传 cli tools
Node.js 文件上传 cli tools byte stream 断点续传 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!
- node 读取文件内容并响应
node 读取文件内容并响应 const http = require('http'); const fs = require('fs') //创建 Server const server = htt ...
- 用Node处理文件上传
前言 在Web开发中,文件上传是一个非常常见.非常重要的功能.本文将介绍如何用Node处理上传的文件. 需求分析 由于现在前后端分离很流行,那么本文也直接采用前后端分离的做法.前端界面如下: 用户从浏 ...
随机推荐
- PIN码计算锦集
1. 腾达,C8:3A:35开头的MAC有效~network路由,MAC有效~以及00B00C开头的MAC有效之外的请您自己发现算法..这里只公布三个MAC地址算法,其余也可以算~这里就不公布出来了. ...
- c++中基类与派生类中隐含的this指针的分析
先不要看结果,看一下你是否真正了解了this指针? #include<iostream> using namespace std; class Parent{ public: int x; ...
- redis实现有序的消息队列
redis是什么东西就不多说了,网上文章一搜一大堆. 首先来说一下我要实现的功能: 类似一个消息中转站吧,如果有人要发送消息,先将消息发到我这里来,然后我这边进行转发,为的就是有一个统一的管理和修改时 ...
- 在Eclipse中进行HotSpot的源码调试--转
原文地址:http://www.linuxidc.com/Linux/2015-05/117250.htm 在阅读OpenJDK源码的过程中,经常需要运行.调试程序来帮助理解.我们现在已经可以编译出一 ...
- SharePoint 2013 搜索爬网功能
最近在政府部门介绍SharePoint 2013 新功能,我也准备了很多,比如SharePoint 2013的Search.以后有机会谈谈Office Web App,Workflow等. Share ...
- gulp-notify处理报错----gulp系列(二)
上一节,以less为例,入门了gulp,并为任务结构做了抽离. 前端们,gulp该用起来了,简单的demo入门——gulp系列(一) 本节学习下gulp-notify,官方这样解释的: gulp-no ...
- Robot Framework自动化测试(一)---第一个脚本
最近工具中用Robot Framework框架来做自动化,所以,花时间学习了一下. =======所需环境=================== Python: https://www.python. ...
- Javascript面向对象之继承
与类的创建篇一样,这里先贴出最终代码,再做详细分析: // 创建一个父类 function SuperType(){ this.company = 'alibaba'; } function SubT ...
- SQL实现分组查询取前几条记录
我要实现的功能是统计订单日志表中每一个订单的前三条日志记录,表结构如下: 一个订单在定点杆日志表中有多条记录,要根据时间查询出每一个订单的前三条日志记录,sql如下: select b.OrderNu ...
- C#函数式程序设计之局部套用与部分应用
函数式设计的核心与函数的应用以及函数如何作为算法的基本模块有关.利用局部套用技术可以把所有函数看成是函数类的成员,这些函数只有一个形参,有了局部套用,才有部分应用.部分应用是使函数模块化成为可能的两个 ...