读取和写入文件
Tailwind Traders 应用程序需要读取每个商店的销售数据,然后计算总计,再将所有单个商店销售文件的总计写入新文件。
使用 fs.readFile 从文件读取数据
通过“fs”模块上的 readFile
方法读取文件。
await fs.readFile("stores/201/sales.json");
readFile
方法的返回对象是一个 Buffer
对象。 它包含二进制格式的文件内容。 例如,假设你有一个名为“sales.json”的文件,其中包含以下内容。
{
"total": 22385.32
}
注销 readFile
方法的返回值后,你会得到 Buffer
值。
<Buffer 7b 0a 20 20 22 74 6f 74 61 6c 22 3a 20 32 32 33 38 35 2e 33 32 0a 7d>
这种结果并没有用。 你可能已读取该文件,但你当然是无法“阅读”此数据的。 但这不是问题。 JavaScript 可以将 Buffer
值转换为可用于计算总计的字符串值。 为此,请调用 String
对象并传入缓冲区。
const bufferData = await fs.readFile("stores/201/sales.json");
console.log(String(bufferData));
输出为:
{
"total": 22385.32
}
使用 JSON.parse 分析数据
字符串格式的此数据并没有太大好处。 它仍然只是一些字符,但现在采用了一种可以读取的格式。 你希望能够将此字符串转换为以编程方式访问的数据(称为分析数据)。
JavaScript 包含用于 JSON 文件的内置分析程序。 不需要包含任何内容即可使用它。 只需使用 JSON
对象即可。 还有一个好处就是,在分析 Buffer
值之前,无需将其转换为字符串。 JSON.parse
方法可以实现此目的。 JSON.parse 是一种常见方法,当 API 通过 Internet 接收数据(作为字符串)时,你将经常在 Web 开发中使用,然后需要将其转换为 JSON 对象。
// read the file as string
const fileContents = await fs.readFile("stores/201/sales.json");
// turn string into JSON
const data = JSON.parse(fileContents);
// access the value by the property key `total`
console.log(data.total);
输出为:
22385.32
提示
文件有多种格式。 由于语言中带有内置支持,JSON 文件最常用。 但是,也可能会遇到 .csv、fixed width 或其他格式的文件。 在这种情况下,最好搜索 npmjs.org 来查找相应文件类型的分析程序。
使用 fs.writeFile 将数据写入文件
你在之前的练习中了解了如何编写文件。 只不过之前编写的是一个空文件。 要将数据写入文件,请使用相同的 writeFile
方法,不同的是应传入要作为第三个参数写入的数据。
// read the file as string
const fileContents = await fs.readFile("stores/201/sales.json");
// turn string into JSON
const data = JSON.parse(fileContents);
// file name is totals.txt
const filePath = path.join("salesTotals","totals.txt");
// write the total to the "totals.json" file
await fs.writeFile(filePath, data.total);
totals.txt
文件的内容为:
22385.32
使用 fs.writeFile 将数据追加到文件
在前面的示例中,每次对文件进行写入时,都会覆盖该文件。 有时,你想要将数据追加到文件,而不是完全替换它。 可以将标志传递到 writeFile
方法来追加数据。 默认情况下,标志设置为 w
,这意味着替换文件。 若要改为追加到文件,请传递 a
标志,这意味着追加。
// read the file as string
const fileContents = await fs.readFile("stores/201/sales.json");
// turn string into JSON
const data = JSON.parse(fileContents);
// file name is totals.txt
const filePath = path.join("salesTotals","totals.txt");
// write the total to the "totals.json" file
await fs.writeFile(filePath, `${data.total}\r\n`, {flag: "a"});
totals.txt
文件的内容为:
22385.32
提示
在前面的代码示例中,\r\n
指示 JavaScript 将值放在其所在的行上。 如果未传递此值(称为“回车换行符”),会导致同一行中的所有数字挤在一起。
在下一练习中,你将通过读取所有销售文件并将总合写入 txt 文件,来完成 Tailwind Traders 的销售总额项目。 在此之后公司的商务系统便可以处理该文件。