文件读写

  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++11 智能指针unique_ptr使用 -- 以排序二叉树为例

    用智能指针可以简化内存管理.以树为例,如果用普通指针,通常是在插入新节点时用new,在析构函数中调用delete:但有了unique_ptr类型的智能指针,就不需要在析构函数中delete了,因为当u ...

  2. haproxy 配置

    1.环境: 操作系统:CentOS 6.4 haproxy: 1.3.15.10 [下载:http://download.chinaunix.net/download.php?id=25784& ...

  3. Ubuntu 14.04 载入 JWS 或 访问 jsp异常的解决方法

    前段时间在Ubuntu 14.04中使用 Chrome登录 Webex准备面试的时候发现无法进入在线面试.搞笑的是前一天尝试进入 Webex的时候还一切正常,不过当时Webex的在线面试没有开始.等到 ...

  4. 无插件纯web 3D机房 (第四季:大型园区、地球仪效果和其他扩展应用)

    前言 初次见面的朋友们大家好,这篇文章是"无插件纯web 3D机房"系列的第四季,感兴趣的朋友可从头开始观看,以下是正确的阅读顺序: 无插件纯web 3D机房(第一季:从零开始搭建 ...

  5. Android应用如何支持屏幕多尺寸多分辨率问题

    作为Android应用程序开发者都知道android是一个“碎片化”的世界.多种系统版本.多种尺寸.多种分辨率.多种机型,还有不同的厂商定制的不同ROM,你开发的应用会在不可预期的手机上报错.这给开发 ...

  6. Web services 安全 - HTTP Basic Authentication

    根据 RFC2617 的规定,HTTP 有两种标准的认证方式,即,BASIC 和 DIGEST.HTTP Basic Authentication 是指客户端必须使用用户名和密码在一个指定的域 (Re ...

  7. zepto - push

    var arr = ['1', '2', '3', '4']; arr.push('qwe'); console.log(arr);

  8. (转)Netfilter分析

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

  9. 利用react native创建一个天气APP

    我们将构建一个实列程序:天气App,(你可以在react native 中创建一个天气应用项目),我们将学习使用并结合可定义模板(stylesheets).盒式布局(flexbox).网络通信.用户输 ...

  10. JS魔法堂:获取当前脚本文件的绝对路径

    一.前言 当写模块加载器时,获取当前脚本文件的绝对路径作为基础路径是必不可少的一步,下面我们一起来探讨一下这个问题吧! 二.各大浏览器的实现方式 [a]. Chrome和FF 超简单的一句足矣! va ...