プログラミングでは、何らかのデータを読み出したり、書き出したりすることが数多くあります。
データの保存先は、データベースが用いられることが一般的ですが、まとまった文章や構造化されていないデータなどはファイルで保存されることも多くあります。
そのため、ファイル操作はプログラミングを学習する中で重要項目の1つとなります。
本ブログでは、JavaScript、Python、Java、Ruby、Goの5つの言語のファイル操作について解説してきました。
本記事では、各言語のファイル操作についてまとめます。
プログラミング初心者の方の学習や、忘れてしまった方の復習として、参考にしていただければ幸いです。
各言語の詳しい説明とソースコードは、各記事に記載しています。本記事の最後に関連記事として記載していますので、気になる方はチェックしてみてください。
プログラミング言語のファイル操作まとめ
ファイル操作として、以下の内容を採り上げます。
- ファイル操作を扱うモジュールやパッケージ
- ファイルの読み込み
- ファイルの書き込み
- ファイルの削除
- ファイルの存在確認
- ファイルのコピー
- ディレクトリの一覧取得
- ディレクトリの作成
- ディレクトリの削除
ファイル操作を扱うモジュールやパッケージ
言語 | ファイル操作を扱うモジュールやパッケージ |
---|---|
JavaScript
|
|
Python
|
|
Java
|
|
Ruby
|
|
Go
|
|
どの言語も特別なライブラリなどは必要なく、標準で用意されているモジュールやパッケージで基本的な読み書きや操作を行うことができます。
ファイルの読み込み
言語 | ファイルの読み込み |
---|---|
JavaScript
|
|
Python
|
|
Java
|
|
Ruby
|
|
Go
|
|
ファイルの読み込みには、一括ですべてのデータを読み込む方式と、分割して読み込む方式があります。
一括で読み込む方式のほうが簡単ですが、メモリの消費量が大きかったり、処理に時間がかかったりするため、小さいサイズと分かっている時に以外には使わないほうが賢明です。
分割して読み込む方式は、1行ずつ読み込む方法や、バイト単位で読み込む方法など様々あります。
また、処理を効率よく行うために、読み込みデータを溜め込むようなバッファリング処理を行うこともあります。(自動的に実施する言語もあります)
ファイルの書き込み
言語 | ファイルの書き込み |
---|---|
JavaScript
|
|
Python
|
|
Java
|
|
Ruby
|
|
Go
|
|
新規書き込みは、どの言語でもファイルが存在しなければ新規に作成し、すでに存在する場合には新たに先頭から書き込みをおこないます。
追記書き込みは、専用のメソッドが用意されている言語とモードやオプションを指定すると追記となる言語など様々で、ファイルが存在しない場合には、新たに作成するものとエラーとなるもので様々ですので、よく確認する必要があります。
また、読み込みと同様で、大量データを一括で書き込むと効率が悪くなるため、分割書き込みやバッファリングするなどの対策を行う必要があります。
ファイルの削除
言語 | ファイルの削除 |
---|---|
JavaScript
|
|
Python
|
|
Java
|
|
Ruby
|
|
Go
|
|
ファイルの削除は、どの言語でもファイルが存在しない場合は、エラーとなりますので、削除前に存在チェックをすることや、例外処理を適切に行うなどの対応が必要となります。
ファイルの存在確認
言語 | ファイルの存在確認、ファイルかディレクトリかの判別 |
---|---|
JavaScript
|
|
Python
|
|
Java
|
|
Ruby
|
|
Go
|
|
ほとんどの言語が存在する場合はtrue、存在しない場合はfalseを返す専用のメソッドがあるのに対して、Go言語だけは少し特殊な確認方法となります。
どの言語もディレクトリも含めての存在確認となります。
ファイルのコピー
言語 | ファイルのコピー |
---|---|
JavaScript
|
|
Python
|
|
Java
|
|
Ruby
|
|
Go
|
|
コピー先にファイルが存在する場合は、どの言語も上書き処理を行います。
言語によっては、オプションの指定などにより、コピー先にファイルが存在する場合はエラーにしたりすることもできます。
また、普通にコピーすると、ファイルの作成日時や更新日時はコピーされませんが、それらも含めてコピーするための方法も提供されていたりします。
ディレクトリの一覧取得
言語 | ディレクトリの一覧取得 |
---|---|
JavaScript
|
|
Python
|
|
Java
|
|
Ruby
|
|
Go
|
|
ディレクトリの一覧取得は、取得対象のディレクトリ直下のみを取得するか、配下のすべてを再帰的に取得するかで方法が分かれます。
再帰的に取得する方法もほとんどの言語で方法が提供されていますが、取得対象を絞り込む条件を指定できるなど、便利な方法が提供されているものもあります。
ディレクトリの作成
言語 | ディレクトリの作成 |
---|---|
JavaScript
|
|
Python
|
|
Java
|
|
Ruby
|
|
Go
|
|
指定したディレクトリのみ作成する場合は、親ディレクトリが存在しなかったり、すでに作成対象が存在する場合はエラーとなります。
親ディレクトリも含めて一括で作成する場合は、作成対象がすでに存在していてもエラーにならないなどの違いがあります。
一時ディレクトリの作成は、どの言語も基本的にランダムな文字列を作成してディレクトリ名とします。
作成したディレクトリを処理後に残すか、自動的に削除するかは言語によって違いがあります。
ディレクトリの削除
言語 | ディレクトリの削除 |
---|---|
JavaScript
|
|
Python
|
|
Java
|
|
Ruby
|
|
Go
|
|
対象ディレクトリのみ削除する場合は、配下にファイルやディレクトリが存在する場合はエラーとなります。
再帰的に削除する場合は、基本的にエラーの発生が抑制されますが、オプションなどにより指定することが可能な言語もあります。
複数の処理で1つのファイル操作を行う場合は要注意
ファイルはデータを保存しておく場所として使いやすいのですが、複数のプロセスやスレッドなどから同じファイルを操作しようとすると思わぬことが発生することがあるので注意が必要です。
僕がこれまでに携わったプロジェクトでも以下のようなことがありました。
- 複数のプロセスから同一のログファイルに書き込んだらファイルが壊れた
- 参照しようとしたら別の処理が先に消していた
- あるサーバが作成したファイルを別のサーバから参照しようとしたら、存在するはずのファイルが見えない状態だった
これらは、設計ミスやOSのファイル管理方法を理解出来ていないことが原因で発生したものでした。
ファイルはOSと密接に関わっているため、ローカル環境では上手く動いても、別の環境では意図通りに動かないといったことがあります。
ファイルを扱う際は、設計時点で問題ないかをきちんと議論することをおすすめします。
今回はプログラミング言語のファイル操作についてまとめました。
以上、参考になれば幸いです。
関連記事
各言語の詳しい解説とソースコードは下記の記事をご覧ください。
コメント