文件读写

  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的更多相关文章

  1. Node开发文件上传系统及向七牛云存储和亚马逊AWS S3的文件上传

    背景起,有奏乐: 有伟人曰:学习技能的最好途径莫过于理论与实践相结合. 初学Node这货时,每每读教程必会Fall asleep. 当真要开发系统时,顿觉精神百倍,即便踩坑无数也不失斗志. 因为同团队 ...

  2. Node.js文件操作二

    前面的博客 Node.js文件操作一中主要是对文件的读写操作,其实还有文件这块还有一些其他操作. 一.验证文件path是否正确(系统是如下定义的) fs.exists = function(path, ...

  3. Node复制文件

    本人开发过程中,经常遇到,要去拷贝模板到当前文件夹,经常要去托文件,为了省事,解决这个问题,写了一个node复制文件. // js/app.js:指定确切的文件名.// js/*.js:某个目录所有后 ...

  4. node读写文件

    结束了一天的工作和学习,今天对于自己最大的收获就是node读写文件和对callback函数有了更深一步的理解.总结一下node读写的文件的注意事项吧(注意:下面讲的是增加数据的方法): 1.我们可以封 ...

  5. node——读取文件中的路径问题

    前提 当前的js文件叫_dirnameandfilename.js和hello.txt同在G:\node练习文件夹下 还有一个_dirnameandfilename.js文件在i:/文件夹,但是i:/ ...

  6. 使用Typescript重构axios(二十五)——文件上传下载进度监控

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  7. Node.js 文件上传 cli tools

    Node.js 文件上传 cli tools byte stream 断点续传 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  8. node 读取文件内容并响应

    node 读取文件内容并响应 const http = require('http'); const fs = require('fs') //创建 Server const server = htt ...

  9. 用Node处理文件上传

    前言 在Web开发中,文件上传是一个非常常见.非常重要的功能.本文将介绍如何用Node处理上传的文件. 需求分析 由于现在前后端分离很流行,那么本文也直接采用前后端分离的做法.前端界面如下: 用户从浏 ...

随机推荐

  1. 译:C#面向对象的基本概念 (Basic C# OOP Concept) 第三部分(多态,抽象类,虚方法,密封类,静态类,接口)

    9.多态 Ploy的意思就是多于一种形式.在文章开始,方法那一章节就已经接触到了多态.多个方法名称相同,而参数不同,这就是多态的一种. 方法重载和方法覆盖就是用在了多态.多态有2中类型,一种是编译时多 ...

  2. 谈谈对从业IT行业看法

    做后端开发也有五年了,从工厂到IT行业转化很大,当然最后离职的工厂想也没想过会写代码为生. 是什么变动会让我走入这一行呢? 1.思想作怪 *我当时就想,我认为不应该一辈子只做这狗屎事,起码在当时看来就 ...

  3. Java Web学习系列——创建基于Maven的Web项目

    创建Maven Web项目 在MyEclipse for Spring中新建Maven项目 选择项目类型,在Artifact Id中选择maven-archetype-webapp 输入Group I ...

  4. android 中targetSdkVersion和与target属性的区别

    AndroidMenifest.xml中targetSdkVersion和project.properties中的target属性的区别      在AndroidMenifest.xml中,常常会有 ...

  5. 【转载】dirs、pushd、popd指令

    转载自:http://hi.baidu.com/linuxtrip/item/47a38c8eec00e98f4414cfb7 一.目录栈指令 目录栈是用户最近访问过的系统目录列表,并以堆栈的形式管理 ...

  6. TFS(Team Foundation Server)敏捷使用教程(四):工作项跟踪(1)

    工作项跟踪(1) 可跟踪性是软件过程的重要能力,TFS主要是以工作项来实现过程的可跟踪性.曾有人问:"你们实际项目里的工作项是怎么样的?能不能让我们看看?"我也一直很好奇别的公司T ...

  7. selenium webdriver (python) 第一版PDF

    前言 如果你是一位有python语言基础的同学,又想通过python+ selenium去实施自动化,那么你非常幸运的找到了这份文档,我也非常荣幸能为你的自动化学习之路带来一丝帮助. 其实,我在sel ...

  8. LeetCode——Find Median from Data Stream

    Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...

  9. SQL Server中的事务日志管理(4/9):简单恢复模式里的日志管理

    当一切正常时,没有必要特别留意什么是事务日志,它是如何工作的.你只要确保每个数据库都有正确的备份.当出现问题时,事务日志的理解对于采取修正操作是重要的,尤其在需要紧急恢复数据库到指定点时.这系列文章会 ...

  10. ASP.NET MVC 快速开发框架之 SqlSugar+SyntacticSugar+JQWidgetsSugar+jqwidgets

    jqwidgets.js: 是一个功能完整的框架,它具有专业的可触摸的jQuery插件.主题.输入验证.拖放插件.数据适配器,内置WAI-ARIA(无障碍网页应用)可访问性.国际化和MVVM模式支持. ...