プログラマーの“宿命”? ファイル操作に関する常識:プログラマーの常識をJavaで身につける(7)(4/4 ページ)
本連載は、Java言語やその文法は一通り理解しているが、「プログラマー」としては初心者、という方を対象とします。Javaコアパッケージを掘り下げることにより「プログラマーの常識」を身に付けられるように話を進めていきます。今回は「ファイル操作」について。OSやアプリケーションなどのさまざまなプログラムでよく行われ、とても身近な存在であるファイル操作の仕方を一から解説します
ファイルをコピーするプログラム
では、ファイルコピーの実装例を見ていきましょう。サンプルの行数を減らすために、仕様に下記の制約を課しています。
- ファイルからファイルへのコピーのみとする(ディレクトリからディレクトリへのコピーや、ファイルからディレクトリへのコピーは仕様から除く)
- 出力先ファイルがすでに存在する場合には、コピーを中断する
基本的な構造は下記のようになります。
- ファイルからストリームを作る
- ストリームをコピーする
しかし、この仕様に加えて、ファイルの存在確認などの各種入力チェックが実装されていることが分かります。
先ほどの例と比べても、さらに入力チェック処理が増えていることが分かります。入出力処理において入力チェック処理が複雑になるのは、“宿命”ともいえます。この傾向は、ある意味プログラマーの常識の1つでさえあります。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
JUnitでテストをする場合
先ほどと同様、参考までにこの処理のためのJUnitソースコードを示します。ここでは、主な異常系を中心に、しかもなるべく簡潔に記述してある点に注意してください。現実的なJUnitコードはこれよりずっと多くのテストコードによって実現されるものです。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
ファイル操作プログラミングにおける3つの注意事項
ここまで紹介してきたもの以外の主要な注意点について、ここで簡単に紹介します。
【1】ストリームのクローズ(close)忘れをしないように
ストリームで入出力を行う場合には、ストリームのクローズ(closeメソッド呼び出し)忘れをしないように注意しましょう。特に、ファイルに対するストリームのクローズ忘れをしてしまうと、厄介な現象が発生してしまう場合があります。
また、正常系では、きっちりクローズするようにプログラムが書かれていても、例外発生時などの異常系においてストリームのcloseメソッドを呼ばなくなるような実装間違いも、結構ありがちなものです。finallyブロックを活用するなどしてクローズ忘れをきっちりと防止するような実装を心掛けて、これに対処しましょう。
【2】バイト出力ストリームのフラッシュ(flush)忘れをしないように
バイト出力ストリーム(java.io.OutputStream)の場合には、ストリームをcloseする前にflushメソッド呼び出しを明示的に呼び出す必要があります。こちらを呼び忘れると、データの終わりの部分がストリームに書き込まれない現象が発生する場合があります。
なお、文字出力ストリーム(java.io.Writer)の場合には、closeメソッドの処理の中でフラッシュを行うようになっています。closeメソッドを確実に呼び出しさえすればよいのです。詳しくは、Java APIのドキュメントをご参照ください。
【3】同時実行に関する排他制御の注意
Webアプリケーションなどの同時に複数のプログラムが動作する環境でファイル入出力を行う際には、「排他をどのように実現するのか」などといった同時にプログラムが動作する環境に起因する問題に対する留意が必要です。この点も結構難しい内容となります。
ファイル操作を身に付けてプログラミングに弾みをつけよう!
ファイル操作に関する基本的なことについて紹介してきましたが、いかがだったでしょうか?
また、ファイルの入出力処理は何かとチェック系の処理が増える傾向にあり、今回紹介した以外の、例えば入出力対象データの内容妥当性のためのチェック処理などを追加し始めると、記述内容はさらに複雑になります。
一方で、例えばCSVファイルの入出力処理を現実的なシステム開発で実装する場合には、何かしら既存のツールやライブラリを活用することにより、この傾向を改善しようという取り組みも多く行われています。このようなツールの1つとして、手前みそながら、blancoCsvという設計書からデータ入出力のチェック処理を自動生成するツールを紹介しておきます。
このように、ファイル操作は難しいものの1つですが、バイトストリームや文字ストリームといった入出力処理ならではの技術を理解できていれば、今後のプログラミングに弾みがつくことが期待できます。少しずつなじんでいって、いつかはマスターしてしまいましょう。
筆者紹介
blanco Framework(コミッタ)
伊賀 敏樹(いが としき)
ハンドル:いがぴょん
1968年生まれ。現在、NTTデータ ビジネスブレインズ 第一SI事業部 ソリューショングループ所属。システム開発の技術支援などに従事する。仕事におけるJava言語とのかかわりは1998年から。 現在 blanco Frameworkというオープンソースによるソースコード自動生成タイプの開発フレームワーク提供に取り組んでいる。 趣味はヴァイオリン演奏。アマチュアオーケストラで演奏することもある。
ホームページ
いがぴょんの日記ウェブページv2(1996年から続けているWeb日記)
主な著書
「やさしく学ぶ基礎からのJDBC」
「Javaプログラミング[アプリケーション編]ステップアップラーニング」
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- Java TIPS 「特定ディレクトリのファイル更新をチェックする」
- Java TIPS 「再帰的なデータ構造を表現する(デザインパターン活用)」
- Java TIPS 「JavaでCSV形式のファイルを読み書きする」
- Java TIPS 「ファイルアップロード処理を簡単にする(Commons活用)」
- Java TIPS 「テキストファイルへの同時書き込みを防ぐ」
- Java TIPS 「バイナリファイルの入出力処理を行う」
- Java TIPS 「URLクラスでローカルファイルもシームレスに扱う」
- EclipseでJavaの入出力を理解する
- Eclipseでファイル操作の理解を深める
- Apollo File APIを用いてローカルファイルを読むには?