文件读取
Node.js 文件读写
推荐使用 node-fs-extra 来扩展原生的 fs 模块尚未提供的功能,
读取为流
读取文件并将其输出到 stdout 的简单例子。
const fs = require("fs");
const readStream = fs.createReadStream("myfile.txt");
readStream.pipe(process.stdout);
创建一个文件的 sha1 摘要,并将结果回传到 stdout(类似于 shasum):
const crypto = require("crypto");
const fs = require("fs");
const readStream = fs.createReadStream("myfile.txt");
const hash = crypto.createHash("sha1");
readStream
.on("data", function (chunk) {
hash.update(chunk);
})
.on("end", function () {
console.log(hash.digest("hex"));
});
data 事件是在可读数据流上为每块数据发射的,所以你可以边走边更新每块数据的摘要,最后当数据流结束时,结束事件被发射,这样你就可以输出最终结果。请注意,每次你调用.on() 来注册一个监听器时,它都会返回原始流,所以你可以很容易地连锁方法。在 Node.js 0.10+中,有一个更好的方法来消耗流。Readable 接口使流的工作变得更容易,特别是在创建流和使用流之间你想做其他事情的流。这些较新的 Readable 流是拉流,当你被读取数据时,你会请求数据,而不是让数据推送给你。
const crypto = require("crypto");
const fs = require("fs");
const readStream = fs.createReadStream("myfile.txt");
const hash = crypto.createHash("sha1");
readStream
.on("readable", function () {
const chunk;
while (null !== (chunk = readStream.read())) {
hash.update(chunk);
}
})
.on("end", function () {
console.log(hash.digest("hex"));
});
文本读取
const { promisify } = require("util");
const fs = require("fs");
const readFileAsync = promisify(fs.readFile); // (A)
const filePath = process.argv[2];
readFileAsync(filePath, { encoding: "utf8" })
.then((text) => {
console.log("CONTENT:", text);
})
.catch((err) => {
console.log("ERROR:", err);
});
如果文件不存在的话则会报错,有时候我们需要首先判断文件是否存在:
fs.exists(path, callback);
fs.existsSync(path);
JSON
const fs = require("fs-extra");
const file = "/tmp/this/path/does/not/exist/file.json";
fs.outputJson(file, { name: "JP" }, (err) => {
console.log(err); // => null
fs.readJson(file, (err, data) => {
if (err) return console.error(err);
console.log(data.name); // => JP
});
});
// With Promises:
fs.outputJson(file, { name: "JP" })
.then(() => fs.readJson(file))
.then((data) => {
console.log(data.name); // => JP
})
.catch((err) => {
console.error(err);
});
function processFile(inputFile) {
const fs = require("fs"),
readline = require("readline"),
instream = fs.createReadStream(inputFile),
outstream = new (require("stream"))(),
rl = readline.createInterface(instream, outstream);
rl.on("line", function (line) {
console.log(line);
});
rl.on("close", function (line) {
console.log(line);
console.log("done reading file.");
});
}
processFile("/path/to/a/input/file.txt");
fs.readFile("input.txt", "utf8", function (err, data) {
if (err) throw err;
console.log(data);
});