Help us understand the problem. What is going on with this article?

node.jsでファイルの入出力操作

More than 1 year has passed since last update.

はじめに

なんかのコードテストをJavaScript(node.js v10)で受験していた際、ファイルの入出力に関する出題があり、やったことなかったので入出力関連処理だけをまとめました。

ファイル読み込み

node.jsの標準ライブラリfsを用いて実装します。
一般的にファイルの入出力は時間がかかる処理のため、同期処理、非同期処理のメソッドがそれぞれ用意されています。

同期処理メソッド「readFileSync」

要はファイルの読み込みが完了してから、後続の処理を行いたい場合ですね。
JavaやPythonなんかに慣れている人はこちらの方が直感的かと思います。

基本構文は、fs.readFileSync(path[, options])です。

readFileSync.js
const fs = require('fs');
let text = fs.readFileSync("sample.txt");
console.log(text);

node readFileSync.jsとかで実行してみると、ファイルの中身が表示されるかと思います。

文字コードを指定したい場合、第二引数で直接指定するか、オプションオブジェクトとして指定する方法があります。

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)です。

readfile.js
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])です。

writeFileSync.js
const fs = require('fs');
let text = "書き出したい内容";
fs.writeFileSync("output.txt", text);

こちらもreadFileSync同様、オプションの指定ができます。
ファイル書き出しの場合のデフォルトはwで、ファイルが存在しない場合は新規作成してくれますが、ファイルが存在する場合は上書いてしまうので注意してください!

同期処理メソッド「writeFile」

基本構文はfs.writeFile(file, data[, options], callback)です。
書き出した結果の処理(成功した場合にメッセージを出すなど)を実装したい場合はこちらを使うのが良いかと思います。

writeFile.js
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 が追加された

shirokuman
スタートアップでエンジニアをしています。スキルアップ目指して奮闘中! JavaScript(TypeScript): Angular, Express Java: Spring, seasar2 Go: Learning... PHP: native AWS
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした