读取和写入文件

已完成

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 的销售总额项目。 在此之后公司的商务系统便可以处理该文件。