非同期でのNode.jsのファイル読み込みの振る舞いを確認してみる

# 前準備
## 環境
OS：Windows 11 Home 64 ビット オペレーティング システム
CPU：11th Gen Intel(R) Core(TM) i7-1185G7 @ 3.00GHz   3.00 GHz
RAM：32.0 GB
Node.js：Node.js v20.4.0.

## サンプルとなるテキストファイルを作成する
```sample.txt
Line_001:１行目
Line_002:２行目
Line_003:３行目
Line_004:４行目
Line_005:５行目
```

## ログ出力用関数を準備する
```fDateTime.js
module.exports = function() {
    //formatted DateTime
    date = new Date();
    const yyyy = date.getFullYear();
    const mm = ('0' + (date.getMonth() + 1)).slice(-2);
    const dd = ('0' + date.getDate()).slice(-2);
    const hh = ('0' + date.getHours()).slice(-2);
    const mi = ('0' + date.getMinutes()).slice(-2);
    const ss = ('0' + date.getSeconds()).slice(-2);
    const ms = ('0' + date.getMilliseconds()).slice(-3);
    return yyyy + mm + dd + hh + mi + ss + '.' + ms;
}
```

# ファイル取得（非同期・一括）fs.ReadFile を確認
## 機能を実装する
```fs_readFile.js
const fDateTime = require('.\\fDateTime.js');

const FILE = "data\\sample.txt";
const ENCODING = "utf-8";

console.log("ファイル取得（非同期・一括）fs.ReadFile:"+FILE);

const fs = require("fs");
fs.readFile(FILE, ENCODING, (err, data) => {
    if (err) throw err;
    console.log(data);
});
```

## 動作させてみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/41be9fed-ff3b-633c-be34-f71d7b43d37a.png)

## 振る舞い確認用のログを付加する
```fs_readFile_addDateTimeLog.js
const fDateTime = require('.\\fDateTime.js');

const FILE = "data\\sample.txt";
const ENCODING = "utf-8";

console.log("ファイル取得（非同期・一括）fs.ReadFile:"+FILE);
console.log("main start:"+fDateTime());

const fs = require("fs");
fs.readFile(FILE, ENCODING, (err, data) => {
    console.log("readFile Callback start:"+fDateTime());
    if (err) throw err;
    console.log(data);
    console.log("readFile Callback end  :"+fDateTime());
});
console.log("main end  :"+fDateTime());
```

## 動作させて非同期の振る舞いを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/147a6288-218c-d891-d1df-65c141c934a3.png)


# ファイル取得（非同期・指定バイト分を取得）fs.read を確認
## 機能を実装する

```fs_read.js
const fDateTime = require('.\\fDateTime.js');

const FILE = "data\\sample.txt";
const ENCODING = "utf-8";

console.log("ファイル取得（非同期・指定バイト分を取得）fs.read:"+FILE);

const BUFF_SIZE          = 200;
const BUFF_OFFSET        = 0;
const READ_BYTES_LENGTH  = 18;
const READ_POSITION      = 20;

const fs = require("fs");
fs.open(FILE, "r", (err, fd) => {
    if (err) throw err;
    const buff = Buffer.alloc(BUFF_SIZE);
    fs.read(fd, buff, BUFF_OFFSET, READ_BYTES_LENGTH, READ_POSITION, (err, bytesRead, buffer) => {
        if (err) throw err;
        console.log(buffer.toString(ENCODING, 0, READ_BYTES_LENGTH));
        fs.close(fd, (err) => {
            if (err) throw err;
        });
    });
});
```

## 動作させてみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/ede4ffb2-1d5d-fdbc-12ac-47cda178b2be.png)

## 振る舞い確認用のログを付加する
```fs_read_addDateTimeLog.js
const fDateTime = require('.\\fDateTime.js');

const FILE = "data\\sample.txt";
const ENCODING = "utf-8";

console.log("ファイル取得（非同期・指定バイト分を取得）fs.read:"+FILE);
console.log("main start:"+fDateTime());

const BUFF_SIZE          = 200;
const BUFF_OFFSET        = 0;
const READ_BYTES_LENGTH  = 18;
const READ_POSITION      = 20;

const fs = require("fs");
fs.open(FILE, "r", (err, fd) => {
    console.log("open Callback start:"+fDateTime());
    if (err) throw err;
    const buff = Buffer.alloc(BUFF_SIZE);
    fs.read(fd, buff, BUFF_OFFSET, READ_BYTES_LENGTH, READ_POSITION, (err, bytesRead, buffer) => {
        console.log("read Callback start:"+fDateTime());
        if (err) throw err;
        console.log(buffer.toString(ENCODING, 0, READ_BYTES_LENGTH));
        fs.close(fd, (err) => {
            console.log("close Callback start:"+fDateTime());
            if (err) throw err;
            console.log("close Callback end :"+fDateTime());
        });
        console.log("read Callback end :"+fDateTime());
    });
    console.log("open Callback end :"+fDateTime());
});
console.log("main end  :"+fDateTime());
```

## 動作させて非同期の振る舞いを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/b502aa37-394f-1350-50e1-e448564eb0fb.png)

# 以下のサイトを参考にしました
[nodejs.org File system](https://nodejs.org/api/fs.html)