nodejs读取文件操作例子(支持中文)

前言

写了几个关于nodejs的小的demo,希望对入门有帮助!

form_data server.js

运行命令

node server
就可以看到有一个简单的form提交!

read_changeJson

运行命令

node readJson  list
可以读取json文件中的数据!

运行命令

node readJson  add [数据]
就可以向文件里面添加数据

process 解释

process.argv

一个包含命令行参数的数组.

第一个元素会是 'node',第二个元素将是.js文件的名称. 接下来的元素依次是命令行传入的参数.

// 要获取真正的参数元素,需要首先将数组的前两个元素去除掉
console.log(process.argv.slice(2));
process.cwd()

返回进程当前的工作目录.

console.log('Current directory: ' + process.cwd());
process.stdout

一个可写流到标准输出,即控制台输出流.

console.log = function (d) {
    process.stdout.write(d + '\n');
};
process.stdin

一个标准输入的可读数据流.

标准输入流默认将暂停,所以必须调用process.stdin.resume()去从中读取.

process.stdin.resume();
process.stdin.setEncoding("utf8");

process.stdin.on("data", function (chunk) {
    process.stdout.write("你录入的是:" + chunk);
});

process.stdin.on("end", function () {
    process.stdout.write("录入完毕.");
});
process.chdir()

改变当前进程的工作目录,若操作失败则抛出异常.

console.log('当前目录:' + process.cwd());
try {
    process.chdir('/tmp');
    console.log('新目录:' + process.cwd());
} catch (err) {
    console.log('chdir: ' + err);
}

一.直接操作文件

 最简单的两个fs.readFile和fs.writeFile

   举例:这个程序的功能是将一个比较大json格式的文件转换成你想自己要格式的文件。

var fs = require('fs');
fs.readFile('./json.json',function(err,data){
    if(err) throw err;

    var jsonObj = JSON.parse(data);
    var space = ' ';
    var newLine = '\n';
    var chunks = [];   
    var length = 0;

    for(var i=0,size=jsonObj.length;i<size;i++){
        var one = jsonObj[i];
        //what value you want
        var value1 = one['value1'];
        var value2 = one['value2'];
        ....
        var value = value1 +space+value2+space+.....+newLine;
        var buffer = new Buffer(value);
        chunks.push(buffer);
        length += buffer.length;
    }
   
    var resultBuffer = new Buffer(length);
    for(var i=0,size=chunks.length,pos=0;i<size;i++){
        chunks[i].copy(resultBuffer,pos);
        pos += chunks[i].length;
    }
   
    fs.writeFile('./resut.text',resultBuffer,function(err){
        if(err) throw err;
        console.log('has finished');
    });
   
});
      它的原理是将文件数据一次性全部读入内存,优点就是接下来都是在内存的操作,速度会很快。但缺点也很明显,就是当文件非常大时,会造成内存溢出。 

二. 使用文件流

   2.1 读取文件,api相见:fs.createReadSream 和 fs.createWriterStream

       以下代码实现的功能就是通过文件流来实现图片的复制:

var fs = require('fs');
var rOption = {
  flags : 'r',
  encoding : null,
  mode : 0666
}

var wOption = {
  flags: 'a',
  encoding: null,
  mode: 0666  
}

var fileReadStream = fs.createReadStream('./myjpg.jpg',rOption);
var fileWriteStream = fs.createWriteStream('./new_myjpg.jpg',wOption);

fileReadStream.on('data',function(data){
  fileWriteStream.write(data);
   
});

fileReadStream.on('end',function(){
  console.log('readStream end');
  fileWriteStream.end();
});

这里再补充在流中非常有用的一个函数:pipe,它以用来把当前的可读流和另外一个可写流连接起来。可读流中的数据会被自动写入到可写流中。使用起来非常方便,依然实现上例中的功能:     

var fs = require('fs');

var fileReadStream = fs.createReadStream('./myjpg.jpg');
var fileWriteStream = fs.createWriteStream('./new_myjpg.jpg');
fileReadStream.pipe(fileWriteStream);

fileWriteStream.on('close',function(){
  console.log('copy over'); 
});
       用这个函数可以轻松地实现一个静态资源服务器:

var http = require("http");
var fs = require("fs"),
var path = require("path"),
var url = require("url");

var server = http.createServer(function(req, res) {
  var pathname = url.parse(req.url).pathname;
  console.log(pathname);
  var filepath = path.join("./tmp", "wwwroot", pathname);
  console.log(filepath);
  var stream = fs.createReadStream(filepath, {flags : "r", encoding : null});
  stream.on("error", function() {
      res.writeHead(404);
      res.end();
  });
  stream.pipe(res);
});
server.on("error", function(error) {
  console.log(error);
});
server.listen(8088,function(){
  console.log('server listen on 8088');
});

三,读写中文内容文件操作 .

由于Node.js仅支持如下编码:utf8, ucs2, ascii, binary, base64, hex,并不支持中文GBK或GB2312之类的编码,

因此如果要读写GBK或GB2312格式的文件的中文内容,必须要用额外的模块:iconv-lite

1、安装模块:npm install iconv-lite

2、演示代码,把下面的代码复制到一个文件中,假设是ch.js(注意:js文件必须保存为utf8编码格式):

// 加载File System读写模块
var fs = require('fs');
// 加载编码转换模块
var iconv = require('iconv-lite');

var file = "c:\\a.txt";
writeFile(file);
readFile(file);

function writeFile(file){
    // 测试用的中文
    var str = "\r\n我是一个人Hello myself!";
    // 把中文转换成字节数组
    var arr = iconv.encode(str, 'gbk');
    console.log(arr);
   
    // appendFile,如果文件不存在,会自动创建新文件
    // 如果用writeFile,那么会删除旧文件,直接写新文件
    fs.appendFile(file, arr, function(err){
        if(err)
            console.log("fail " + err);
        else
            console.log("写入文件ok");
    });
}

function readFile(file){
    fs.readFile(file, function(err, data){
        if(err)
            console.log("读取文件fail " + err);
        else{
            // 读取成功时
            // 输出字节数组
            console.log(data);
            // 把数组转换为gbk中文
            var str = iconv.decode(data, 'gbk');
            console.log(str);
        }
    });
}

3、用node.exe执行这个js文件,结果如下:

C:\>node ch.js
<Buffer 0d 0a ce d2 ca c7 d2 bb b8 f6 c8 cb 48 65 6c 6c 6f 20 6d 79 73 65 6c 66 21>
写入文件ok
<Buffer 0d 0a ce d2 ca c7 d2 bb b8 f6 c8 cb 48 65 6c 6c 6f 20 6d 79 73 65 6c 66 21>

我是一个人Hello myself!

C:\>

注1:Node的iconv模块,仅支持linux,不支持Windows,因此要用纯js的iconv-lite,另:作者说iconv-lite的性能更好,具体参考Git站点:iconv-lite

注2:我在测试读写文件时,始终无法把中文写入文件,一直乱码,读取正常,后来同事帮我发现:js文件的编码格式是ansi,nodejs的代码文件必须是utf8格式

注3:如果程序操作的文件,都是以UTF8编码格式保存的,那么就不需要使用iconv模块,直接以utf8格式读取文件即可,如:

// 参数file,必须保存为utf8格式,否则里面的中文会乱码
function readFile(file){
    // readFile的第2个参数表示读取编码格式,如果未传递这个参数,表示返回Buffer字节数组
    fs.readFile(file, "utf8", function(err, data){
        if(err)
            console.log("读取文件fail " + err);
        else{
            // 读取成功时
            console.log(data);// 直接输出中文字符串了
        }
    });
}

结论:使用node.js开发时,无论是代码文件,还是要读写的其它文件,都建议使用UTF8编码格式保存,这样可以无需额外的模块支持

时间: 2024-09-24 23:46:00

nodejs读取文件操作例子(支持中文)的相关文章

java中文件读取文件操作数据库

问题描述 java中文件读取文件操作数据库 给个例子 谢谢 解决方案 连接数据库:public class DBConnect {public Connection getConnect(String driver, String url, String user, String pwd) {Connection conn = null;try {Class.forName(driver);conn = DriverManager.getConnection(url, user, pwd);}

thinkphp中使用tcpdf生成的文件文件名不支持中文

问题描述 thinkphp中使用tcpdf生成的文件文件名不支持中文 thinkphp中使用tcpdf生成的文件,文件名保存不了中文! $pdf->Output( date('Y-m-d',time()).'.pdf', 'I' ); 如果有中文的话,自动过滤了 求大神指教!!!

perl几个文件操作例子_perl

perl用的最多的地方就算是文件处理了,下面我就总结了一下perl文件操作的一些东西,并且有具体的例子,通过下面的例子,加强我们对perl文件操作的理解. 删除文件 使用unlinke函数,比如unlink $file, unlink $file1, $file2, $file3 打开文件 使用三参数的形式打开文件,这样非常便于区分模式和文件名,perl 5.6之后的版本都支持这种方式. 复制代码 代码如下: #Open the 'txt' file for reading open FH, '

Win8 拯救系统中文件拯救是否支持中文搜索

  故障现象: 随机Win8系统的扬天机型,拯救系统里的文件拯救功能下,是否支持中文搜索? 原因分析: 因为Win8系统文件拯救使用的WINPE是64位的,暂不支持中文输入法. 解决方案: Win8所使用的是64位Winpe,不支持中文输入,所以用户只能输入中文拼音这种方式.用户第一次设置时,密码提示问题是中文显示,但答案只能设置英文或数字. 若遇到用户反馈此问题,只能建议用户设置答案时使用拼音or数字的方式,这是微软64 位Winpe决定的. 备注: Win7 & XP使用的是WinPE32位

Java编程那些事儿87——文件操作之读取文件

11.3.1.3 读取文件 虽然前面介绍了流的概念,但是这个概念对于初学者来说,还是比较抽象的,下面以实际的读取文件为例子,介绍流的概念,以及输入流的基本使用. 按照前面介绍的知识,将文件中的数据读入程序,是将程序外部的数据传入程序中,应该使用输入流--InputStream或Reader.而由于读取的是特定的数据源--文件,则可以使用输入对应的子类FileInputStream或FileReader实现. 在实际书写代码时,需要首先熟悉读取文件在程序中实现的过程.在Java语言的IO编程中,读

在Unix/Linux上令(java)JVM支持中文输出

unix|中文 原文: 在Unix/Linux上令(java)JVM支持中文输出 一.在Unix/Linux上令JVM支持中文输出 如果用户使用的是UNIX的远程服务器,就会遇到中文字体在图像中输出的问题,特别是由于许多管理员并不喜欢把主机的locale定为zh(因为意味着可能出乱码或必须装微形图形终端象zhcon,但很多情况下这样的条件并不具备).大部分程序员的JAVA经验苟限于JSP脚本程序,部分熟练的程序员大概开发过中间件.servlet.applet或在WINDOWS上运行的GUI程序.

Node.js中常规的文件操作总结_node.js

前言 Node.js 提供一组类似 UNIX(POSIX)标准的文件操作API. Node 导入文件系统模块(fs)语法如下所示: var fs = require("fs") fs模块是文件操作的封装,它提供了文件的读取.写入.更名.删除.遍历目录.链接等POSIX文件系统操作.与其他模块不同的是,fs模块中所有的操作都提供了异步和同步的两个版本,例如读取文件内容的函数有异步的fs.readFile()和同步的fs.readFileSync() . 一. 目录操作 1. 创建目录 创

ASP教程:读取文件和写文件

ASP教程:读取文件和写文件 读取文件操作: '------------------------------------------------- '函数名称:ReadTextFile '作用:利用AdoDb.Stream对象来读取UTF-8格式的文本文件 '---------------------------------------------------- Function ReadFromTextFile (FileUrl,CharSet)     dim str     set stm

FreeBSD下的vi支持中文显示和编辑

最近开发PHP需要使用vi,但是php文件中需要支持中文,于是请教同事,有了结果. 以前是使用putty连接到freebsd服务器上,但是好像输入中文有问题,所以使用F-Secure SSH Client 5.4,使用 SSH Client也可以,比putty强点,不过没有那么方便. 要使vi中的代码加亮等,好像要使用bash,freebsd默认是csh,所以要修改一下: % chpass heiyeluren       #Changing user database information