情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

Node.jsでテキストファイルやバイナリファイルにデータを書き込む

2016/11/26

テキストファイルやバイナリファイルにデータを書き込むには非同期的に書き込む方法と同期的に書き込む方法とストリームを使用して書き込む方法の3つがあります。

なお、テキストファイルへのデータの書き込みにおいて対応している文字コードはバッファが対応している文字コードと同じです。

対応している文字コードに関しては下の記事の「文字コード」の項を参照してください。

非同期的な書き込み

テキストファイルやバイナリファイルにデータを非同期的に書き込むにはfs.writeFile関数を使用します。

var fs = require('fs');

fs.writeFile('xxx', 'yyy', {
    encoding: 'utf-8'
}, function (err) {
});
//or
fs.writeFile('xxx', 'yyy', 'utf-8', function (err) {
});
//or
fs.writeFile('xxx', buf, function (err) {
});

第1引数にファイルのパスを指定します。

第2引数にファイルに書き込むデータを指定します。文字列かバッファを指定します。

第3引数にオプションをオブジェクトとして指定します。この引数は指定しなくても構いません。

オプションには下のようなものがあります。

  • encoding・・・テキストファイルの文字コードを指定します。バイナリファイルにデータを書き込む場合には指定しません

ただし、第3引数にはオプションをオブジェクトとして指定するのではなく、テキストファイルの文字コードのみを直接指定することもできます

第4引数にコールバック関数を指定します。この関数の第1引数はエラーオブジェクトです。

なお、ファイルが既に存在する場合には上書きされます。

同期的な書き込み

テキストファイルやバイナリファイルにデータを同期的に書き込むには、fs.writeFileSync関数を使用します。

fs.writeFileSync('xxx', 'yyy', {
    encoding: 'utf-8'
});
//or
fs.writeFileSync('xxx', 'yyy', 'utf-8');
//or
fs.writeFileSync('xxx', buf);

第1引数にファイルのパスを指定します。

第2引数にファイルに書き込むデータを指定します。文字列かバッファを指定します。

第3引数にオプションをオブジェクトとして指定します。この引数は指定しなくても構いません。このオプションはfs.writeFile関数の第3引数のオプションと同じです。

なお、ファイルが既に存在する場合には上書きされます。

ストリームを使用した書き込み

ストリームを使用してテキストファイルやバイナリファイルにデータを書き込むにはfs.createWriteStream関数を使用します。

var ws = fs.createWriteStream('xxx', {
    defaultEncoding: 'utf-8'
});
//or
var ws = fs.createWriteStream('xxx', 'utf-8');
//or
var ws = fs.createWriteStream('xxx');

第1引数にファイルのパスを指定します。

第2引数にオプションをオブジェクトとして指定します。この引数は指定しなくても構いません。

オプションには下のようなものがあります。

  • defaultEncoding・・・テキストファイルの文字コードを指定します。バイナリファイルにデータを書き込む場合には指定しません

ただし、第2引数にはオプションをオブジェクトとして指定するのではなく、テキストファイルの文字コードのみを直接指定することもできます

返り値としてファイルにデータを書き込む書き込みストリームが得られます。

なお、ファイルが既に存在する場合には上書きされます。

注意事項

fs.writeFile関数やfs.writeFileSync関数は存在しないフォルダのファイルにデータを書き込むことはできません。

存在しないフォルダのファイルにデータを書き込むには下のような関数を使用します

  • fs-extraモジュールのfsExtra.outputFile関数・・・この関数の引数はfs.writeFile関数と同じです。
  • fs-extraモジュールのfsExtra.outputFileSync関数・・・この関数の引数はfs.writeFileSync関数と同じです。

使い分け

原則的にはfs.writeFile関数やfs.createWriteStream関数やfsExtra.outputFile関数を使用するべきであり、特に理由がないならfs.writeFileSync関数やfsExtra.outputFileSync関数は使用するべきではありません。

これは、ファイルへのアクセスは非常に時間の掛かる処理であるためです。ファイルへのアクセスを同期的に行うとアクセスが完了するまでプログラムは待機状態となり、他の処理を行うことができません。長い時間プログラムが待機状態になると様々な問題を引き起こす可能性があります(このような現象をスターベーションと言います)。

サンプルコード1

fs.writeFile関数の使用例です。

3つ目のコマンドライン引数として与えられたファイルにテキストデータを非同期的に書き込みます。

fs-writefile-text.js

var fs = require('fs');

if (process.argv.length < 3) {
    console.error('lack argument.');
    process.exit(1);
}

fs.writeFile(process.argv[2], 'テキストファイルに文字列を書き込んでみます。', 'utf-8', function (err) {
    if (err) {
        console.error(err);
        process.exit(1);
    }
    else {
        console.log('finished!!');
    }
});

実行結果

textfile.txtを3つ目のコマンドライン引数に指定してコードを実行すると正しくファイルにテキストデータが書き込まれます。

C:\work\node>node fs-writefile-text.js textfile.txt
finished!!

C:\work\node>type textfile.txt
テキストファイルに文字列を書き込んでみます。j

サンプルコード2

fs.writeFileSync関数の使用例です。

3つ目のコマンドライン引数として与えられたファイルにテキストデータを同期的に書き込みます。

fs-writefilesync-text.js

var fs = require('fs');

if (process.argv.length < 3) {
    console.error('lack argument.');
    process.exit(1);
}

try {
    fs.writeFileSync(process.argv[2], 'テキストファイルに文字列を書き込んでみます。', 'utf-8');
}
catch (err) {
    console.error(err);
    process.exit(1);
}

console.log('finished!!');

実行結果

textfile.txtを3つ目のコマンドライン引数に指定してコードを実行すると正しくファイルにテキストデータが書き込まれます。

C:\work\node>node fs-writefilesync-text.js textfile.txt
finished!!

C:\work\node>type textfile.txt
テキストファイルに文字列を書き込んでみます。j

サンプルコード3

fs.createWriteStream関数の使用例です。

3つ目のコマンドライン引数として与えられたファイルにテキストデータをストリームを使用して書き込みます。

fs-createwritestream.js

var fs = require('fs');

if (process.argv.length < 3) {
    console.error('lack argument.');
    process.exit(1);
}

try {
    var ws = fs.createWriteStream(process.argv[2], 'utf-8');
    ws.on('error', function (err) {
        console.error(err);
        process.exit(1);
    });
    ws.write('テキストファイルに文字列を書き込んでみます。');
    ws.end();
}
catch (err) {
    console.error(err);
    process.exit(1);
}

console.log('finished!!');

実行結果

textfile.txtを3つ目のコマンドライン引数に指定してコードを実行すると正しくファイルにテキストデータが書き込まれます。

C:\work\node>node fs-createwritestream.js textfile.txt
finished!!

C:\work\node>type textfile.txt
テキストファイルに文字列を書き込んでみます。

関連

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-Node.js