(13)文件读取的简单用法
模块需求:fs
方法:
①首先我们创建一个test.txt文件,里面输入内容
It's a test txt.
注意,这个txt文件应该是utf-8格式的
②然后我们创建一个js文件,调用fs模块,并输入一段代码:
注意,此时文件名是错误的
然后执行这个js文件
var fs = require('fs'); fs.readFile('file.txt', 'utf-8', function (err, data) { if (err) { console.log("读取错误:" + err); return; } console.log(data); })
输出:
③这次我们修改文件名,改为test.txt,再次运行js文件
④假如不指定读取的格式:(即去掉第二个参数)
输出的是十六进制字节
⑤假如读取的文件编码是ANSI,然后用utf-8读取,那么中文字符基本上是无法读取出来的。
除了utf-8格式之外,还有utf8, ucs2,ascii, binary, base64, hex等格式
注意,没有GBK之类,具体解决办法参照:
http://blog.csdn.net/youbl/article/details/29812669
另外,注意这个是异步请求。
⑥同步读取文件:
var fs = require('fs'); var data = fs.readFileSync('test.txt', 'utf-8'); console.log(data);
(20)文件系统fs进阶
①提供了文件的读取、写入、更名、删除、遍历目录、链接等功能。
所有操作都有异步和同步两种方法。
②文件读取:readFile
fs.readFile(filename, [encoding], [callback(err, data)])
参数一:是文件名;
参数二:编码方式,默认二进制(具体搜之前的);
参数三:回调函数(参数一是错误,参数二是读取的文件内容);
标准方法:
var fs = require("fs"); fs.readFile("./test.txt", "UTF8", function (err, data) { if (err) { console.log(err); } else { console.log(data); } })
参数二可以是UTF8,也可以是utf8,也可以是utf-8。效果是一样的
输出:
同步版:
readFileSync(文件名,
文件编码)
返回值是data(读取的文件内容);如果有错误发生,会抛出异常,需要使用try和catch来处理;
③fs.open文件的打开;
原型:
fs.open(path, flags, [mode], [callback(err, fd)])
path是路径,略;
flags表示打开的方式,具体如图:
mode表示权限,默认是0666。
6表示4+2;根据推测,1执行,2写,4读,他们的和就是权限;
回调函数的fd表示文件描述符:非负整数,表示操作系统内核为当前进程所维护的打开文件的记录表索引。
另外,第一个6表示文件所有者的权限;第二个表示同组的用户;第三个表示其他用户;
这个命令需要配合write、read,或者其他命令进行操作,例如:
var fs = require("fs"); fs.open("test.txt", "a", 0666, function (err, fd) { if (err) throw err; fs.write(fd, "pppp", function (e) { if (e) throw e; fs.closeSync(fd); }) })
在test.txt文件里,追加写入pppp四个字符
④fs.read文件的读取
fs.read(fd, buffer, offset, length, position, callback(err, bytesRead, buffer));
他相对于fs.readFile来说,是更为底层的接口。
其作用是从fs.open的回调函数中的文件描述符fd中读取数据,并写入buffer指向的缓冲区对象。
offset是buffer写入的偏移量;
length是要从文件中读取的字节数;
position是文件读取的起始位置(当为null时,则从当前文件指针的位置读取);
回调函数传递的bytesRead表示读取的字节数;buffer表示缓冲区对象;
如代码:
var fs = require("fs"); fs.open("test.txt", 'r', function (e, fd) { if (e) throw e; var buf = new Buffer(8); //创建一个二进制对象 fs.read(fd, buf, 3, 4, 2, function (err, bytesRead, buffer) { //读取fd,以二进制形式 if (err)throw err; console.log(bytesRead); console.log(buffer); }) })
输出结果:
第五行的buff表示是上面new出来的Buffer对象;
3表示写入到buf这个对象的第4个位置;
4表示读取fd 4个字节;
2表示从fd的第二个字节开始读取;
bytesRead表示读取到了4个字节;(假如读取到结尾了,那么这个数字将不包含读取到结尾的那些,比如position位置的数字很大的时候,这里可能就是0)
buffer表示前面那个buf对象
⑤fs模块的函数列表:(引自Node.js开发指南)