はじめに
なんかのコードテストをJavaScript(node.js v10)で受験していた際、ファイルの入出力に関する出題があり、やったことなかったので入出力関連処理だけをまとめました。
ファイル読み込み
node.jsの標準ライブラリfs
を用いて実装します。
一般的にファイルの入出力は時間がかかる処理のため、同期処理、非同期処理のメソッドがそれぞれ用意されています。
同期処理メソッド「readFileSync」
要はファイルの読み込みが完了してから、後続の処理を行いたい場合ですね。
JavaやPythonなんかに慣れている人はこちらの方が直感的かと思います。
基本構文は、fs.readFileSync(path[, options])
です。
const fs = require('fs');
let text = fs.readFileSync("sample.txt");
console.log(text);
node readFileSync.js
とかで実行してみると、ファイルの中身が表示されるかと思います。
文字コードを指定したい場合、第二引数で直接指定するか、オプションオブジェクトとして指定する方法があります。
const fs = require('fs');
// 文字コードを直接指定
let text = fs.readFileSync("sample.txt", 'utf-8');
console.log(text);
// 文字コードをオプション指定
let text2 = fs.readFileSync("sample.txt", {encoding: 'utf-8'});
console.log(text2);
※オプションに指定できるflag
について
ちょっと話が逸れますが、オプションオブジェクトのパラメータはencoding
の他にflag
があります。
flag
のデフォルトはr
で「読み取り用でファイルを開く。ファイルが存在しない場合は例外を発生する」動きになります。
例えば、ここをa
とかすると、ファイルが存在しない場合に新規作成してくれたりします。
詳しくは公式ページ[fs_file_system_flags]を参照ください。
非同期処理メソッド「readFile」
要はファイルの読み込みを待たずに後続処理を捌きたい場合です。
基本構文はfs.readFile(path[, options], callback)
です。
const fs = require('fs');
fs.readFile("sample.txt", 'utf-8', (err, data) => {
if (err) throw err; // 例外発生時の処理
console.log(data);
});
console.log('ファイル読み込みを待たずに後続処理が走ります。');
非同期で処理を実行するため、以下のように出力されるかと思います。
ファイル読み込みを待たずに後続処理が走ります。
ファイルの中身
ファイル読み込み後に行いたい処理が複雑になればなるほど、コールバック地獄に陥りやすいので注意です。。
Node.js v8.0
以降をお使いであれば、util.promisify
でPromise化してあげることも検討してみてください。
ファイル書き出し
こちらもファイルの読み込みと同様、同期処理か非同期処理かでメソッドを使い分けましょう。
同期処理メソッド「writeFileSync」
基本構文はfs.writeFileSync(file, data[, options])
です。
const fs = require('fs');
let text = "書き出したい内容";
fs.writeFileSync("output.txt", text);
こちらもreadFileSync
同様、オプションの指定ができます。
ファイル書き出しの場合のデフォルトはw
で、ファイルが存在しない場合は新規作成してくれますが、ファイルが存在する場合は上書いてしまうので注意してください!
同期処理メソッド「writeFile」
基本構文はfs.writeFile(file, data[, options], callback)
です。
書き出した結果の処理(成功した場合にメッセージを出すなど)を実装したい場合はこちらを使うのが良いかと思います。
const fs = require('fs');
let text = "書き出したい内容";
fs.writeFileSync("output.txt", text, (err) => {
if (err) throw err;
console.log('ファイルが正常に出力されました。');
});
おわりに
こういうのは一回使うと忘れがちなので、こまめにまとめてTips化したいなーと思っていますが、なかなか時間なかったり…
参考
公式ドキュメント: Node.js v11.10.0 Documentation
from scratch: util.promisify が追加された