検索
連載

プログラマーの“宿命”? ファイル操作に関する常識プログラマーの常識をJavaで身につける(7)(2/4 ページ)

本連載は、Java言語やその文法は一通り理解しているが、「プログラマー」としては初心者、という方を対象とします。Javaコアパッケージを掘り下げることにより「プログラマーの常識」を身に付けられるように話を進めていきます。今回は「ファイル操作」について。OSやアプリケーションなどのさまざまなプログラムでよく行われ、とても身近な存在であるファイル操作の仕方を一から解説します

PC用表示 関連情報
Share
Tweet
LINE
Hatena

実際のストリームプログラミング

 ここでは、ファイルからの読み込み(InputStream)を取り上げて話を進めます。書き込み(OutputStream)の紹介は省略しますが、読み込み側の仕組みをしっかりと理解すれば、その応用で理解できると考えます。

 実行時のカレントディレクトリに今回のサンプルで利用する「sampledata.txtファイル」を準備しておいてください。このファイルからデータを読み込むものとして話を進めます。このファイルには、下記のような内容が格納されていることとします。

sampledata.txt(Shift_JISでデータを格納したもの)

ABCDE12345愛植岡


ファイルをバイト入力ストリームで読み込む原始的なサンプル(java.io.FileInputStream)

 それでは、実際にファイルをバイト入力ストリームで読み込むサンプルを書いてみましょう。

図9 ファイルをバイト入力ストリームで読み込む
図9 ファイルをバイト入力ストリームで読み込む

 java.io.FileInputStreamクラスはファイルからの読み込みをバイト入力ストリームとして提供します。この例では、FileInputStreamのインスタンスはjava.io.InputStreamで受けて以降の処理を行います。

 なお、ここで登場するユーティリティクラス(HexStringUtil.java)は、前回の連載記事のものを利用することとします。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

注意!

ここで書かれているソースコードには問題が含まれています。バッファリングをわざと行わずにコーディングしています。この書き方だと、readメソッドを呼び出すたびにOSのファイル読み込み機能が実行されてしまいます。そのような状況は、多くの場合望ましくありません。このため、実際のプログラミングの場合には、後述のようにバッファリングを行ったプログラミングを行います。


 なお、このプログラムをsampledata.txtファイルが存在しない状態で実行すると、以下のような例外が発生して処理が中断します。該当の名称のファイルが存在するようにしてから再度実行してください。

例外(java.io.FileNotFoundException)

java.io.FileNotFoundException: sampledata.txt (指定されたファイルが見つかりません。) at java.io.FileInputStream.open(Native Method) at java.io.FileInputStream.(Unknown Source) at java.io.FileInputStream.(Unknown Source) at InputStreamSample01.process(InputStreamSample01.java:20) at InputStreamSample01.main(InputStreamSample01.java:13)


バッファリングを行ってファイルをバイト入力ストリームで読み込むサンプル(java.io.BufferedInputStream)

 現実的なプログラミングでは、バッファリングしてバイト入力ストリーム読み込みを行います。

図10 ファイルをバイト入力ストリームで読み込む(バッファリング付き)
図10 ファイルをバイト入力ストリームで読み込む(バッファリング付き)

 java.io.FileInputStreamで得られたバイト入力ストリームをjava.io.BufferedInputStreamクラスのコンストラクタで受け取って、バッファリング読み込み付きのバイト入力ストリームに変えて、このインスタンスをjava.io.InputStreamで受けて、以降の処理を行います。

 このようにバッファリング付きのバイト入力ストリームにすることにより、readメソッドを呼び出すごとにOSのファイル読み込みが実行されることを、防ぐことができます。

 今回の例では、BufferedInputStreamのバッファサイズはデフォルト値を使うコーディングを行っています。バッファサイズを変更したい場合には、バッファサイズを指定できるBufferedInputStreamクラスのコンストラクタを呼び出すように、変更します。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 ここでは、バッファ付き読み込みを行いましたが、このようなバッファを用いた入出力はコンピュータ技術で重要なものの1つです。ぜひ、しっかりと理解しておきましょう。

ファイルを文字ストリームで読み込む原始的なサンプル(java.io.InputStreamReader)

 次に、文字ストリームを使って読み込む例を見ていきます。ここでは、バイトストリームから文字ストリームへ文字エンコーディング指定付きで変換する例を取り上げます。

編集部注文字コード・文字エンコーディングについて詳しく知りたい読者は前回記事をご参照ください。

図11 ファイルを文字入力ストリームで読み込む
図11 ファイルを文字入力ストリームで読み込む

 java.io.FileInputStreamで得られたバイト入力ストリームをjava.io.BufferedInputStreamのコンストラクタで受け取ってバッファリング読み込み付きのバイト入力ストリームに変え、それをjava.io.InputStreamReaderクラスのコンストラクタを文字エンコーディング指定付きで呼び出して文字入力ストリームへと変換しています。この文字入力ストリームのインスタンスをjava.io.Readerクラスで受けて、以降の処理を行っています。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

バッファリングを行ってファイルを文字ストリームで読み込むサンプル(java.io.BufferedReader)

 実際には、文字入力ストリームはjava.io.BufferedReaderクラスを利用して実現する場合が多くなります。このBufferedReaderを利用した文字入力ストリームの例を見ていきます。

 java.io.FileInputStreamで得られたバイト入力ストリームをjava.io.InputStreamReaderクラスのコンストラクタを文字エンコーディング指定付きで呼び出して文字入力ストリームへと変換し、そのインスタンスをjava.io.BufferedReaderクラスのコンストラクタで受けてバッファリング付きの文字入力ストリームにしています。この文字入力ストリームのインスタンスをjava.io.Readerクラスで受けて、以降の処理を行っています。

 BufferedReaderクラスはバッファリング読み込みを実現するほかにも、文字入力ストリームを読み込むための便利なメソッドが提供されているので、よく利用されるものの1つです。

 なお、BufferedReaderによってバッファリング読み込みを実現しているので、これまでの例で利用していたjava.io.BufferedInputStreamはコンストラクタの連鎖から取り除いてあります。

図12 ファイルを文字入力ストリームで読み込む(バッファリング付き)
図12 ファイルを文字入力ストリームで読み込む(バッファリング付き)

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 次ページからは、前述のエクスプローラのようなファイル操作をプログラムで実現する方法を見ていきましょう。

Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る