文件读写

  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. 尝鲜CodeBlocks

    在寻找跨平台的C++ IDE,就尝试了CodeBlocks,写了个HelloWorld,测试了一下C++11的代码,我很喜欢他的代码着色,看着很清爽. 记得要打开C++11的支持:

  2. ops中set_sysclk set_clkdiv set_pll详解

    在看Alsa soc驱动的是时候,在snd_soc_dai_driver.ops中有3个字段 .set_sysclk .set_pll .set_clkdiv 开始的时候,总是晕头转向,感觉这3个回调 ...

  3. 二十二、【轻量级开源框架】EFW框架Web前端开发之JqueryEasyUI

    回<[开源]EFW框架系列文章索引>        EFW框架源代码下载V1.2:http://pan.baidu.com/s/1hcnuA EFW框架实例源代码下载:http://pan ...

  4. 如何生成ipa文件

    xcode--Product--Archive 弹出Organizer-Archives选择Distribute---Save for EnterPrise or Ad_Hoc Deployment- ...

  5. 从头学Qt Quick(3)-- 用QML写一个简单的颜色选择器

    先看一下效果图: 实现功能:点击不同的色块可以改变文字的颜色. 实现步骤: 一.创建一个默认的Qt Quick工程: 二.添加文件Cell.qml 这一步主要是为了实现一个自定义的组件,这个组件就是我 ...

  6. Python 之 MySQL 操作库 lazy_mysql

    TOC Intro Installation Tutorial API Engine Pool Column Table Intro lazy_mysql 是一个非常简单易用,用来操作 MySQL 的 ...

  7. (转)Netfilter分析

    看到一篇讲Netfilter框架的,如果有一点基础了的话对于捋清整个框架很好帮助,转下来细细阅读. 转自http://aichundi.blog.163.com/blog/static/7013846 ...

  8. 获得 MongoDB for Node.js Developers 证书

    前段时间由于项目需要,开始学习MongoDB,发现MongoDB官网的学习课程非常有帮助. 整个教学很有体系,包括: Video.quiz.Homework.Final Exam. 历时7周,拿到认证 ...

  9. C# 装箱与拆箱

    知识点  值类型.    值类型是在栈中分配内存,在声明时初始化才能使用,不能为null.    值类型超出作用范围系统自动释放内存.    主要由两类组成:结构,枚举(enum),结构分为以下几类: ...

  10. AngularJS 监控对象属性:$watch和$digest

    监控对象属性:$watch和$digest $watch和$digest是相辅相成的.两者一起,构成了Angular作用域的核心:数据变化的响应.如果你学习过WPF,并基于WPF使用过一些MVVM框架 ...