Fileクラス
ファイルはデータをコンピュータに記憶させるための基本単位です。
Javaに用意されているAPIを利用して簡単にファイルを操作できます。
ファイルの入出力関係のクラスはjava.ioパッケージに用意されています。
java.io.Fileクラスはディスクに保存されているファイルやディレクトリをオブジェクトとして表現するクラスです。
コンストラクタの引数にパス名やファイル名を指定して、Fileオブジェクトを生成します。
Fileクラスのメソッドを使用すると、ファイルやディレクトリが存在するかどうか確認したり、ファイルかディレクトリかを判断したり、ディレクトリに存在しているもののリストを取得したりすることができます。
【Fileクラスのコンストラクタ】
【Fileクラスの主なメソッド】
【Fileクラスの利用】
プロジェクトの中に「filesample」フォルダを作成し、その中に「file_a」フォルダ、「file_b」フォルダ」、「file_c」フォルダ、「filetext.txt」ファイルをあらかじめ作成しておきます。
import java.io.File; class FileSample1{ public static void main(String args[ ]){ File file1 = new File("filesample¥¥filetext.txt"); System.out.println("filetext.txtはファイルですか?" + file1.isFile()); System.out.println("ファイル名は?" + file1.getName()); File file2 = new File("filesample¥¥file_a"); System.out.println("file_aはディレクトリですか?" + file2.isDirectory()); File file3 = new File("filesample"); String [ ] list = file3.list(); for(String s : list){ System.out.println(s); } } }
実行結果
filetext.txtはファイルですか?true ファイル名は?filetext.txt file_aはディレクトリですか?true filetext.txt file_a file_c file_b
4行目でFileクラスのオブジェクト作成時に、引数に"filesample¥¥filetext.txt"
と指定します。
これにより、このファイルをFileオブジェクトして扱うことができるようになります。
フォルダやファイルの区切り文字として¥記号が使われますが、¥記号は特殊文字であるため、1つ目にエスケープシーケンス文字を指定しています。
5行目のisFile( )メソッドを使用すると、ファイルかどうかを判断することができ、filetext.txtはファイルなので、trueが返されます。
6行目のgetName( )メソッドを使用すると、ファイル名やディレクトリ名を取得することができますので、ファイル名filetext.txtが返されます。
次に、9行目では、Fileクラスのオブジェクト作成時に、引数に"filesample¥¥file_a"
と指定しています。
9行目のisDirectory()メソッドを使用すると、ディレクトリかどうかを判断することができ、file_aはディレクトリなので、trueが返されます。
11行目で、Fileクラスのオブジェクト作成時に、引数に"filesample"
と指定します。
12行目のlist( )はディレクトリ配下のファイル名やディレクトリ名のリストをStringの配列として返します。
13行目~15行目で拡張for文を使用し、リスト内容を表示しています。
テキストファイルとバイナリファイル
コンピュータに保存する情報は文字や数字だけでなく、画像ファイルや動画ファイルのなど様々なものがあります。
私たちが普段利用しているファイルはテキストファイルとバイナリファイルに分類されます。
テキストファイルは、メモ帳で作成したテキストファイルや、Javaのソースコードなどで「文字として解釈可能なデータ」です。
コンピュータの中では、様々な数字や文字などは一定の個数の0と1の並びで表現します。(2進数表現)
テキストファイルはコンピュータの書き込まれる際に0と1に変換されます。
一方バイナリファイルは、Javaのクラスファイルや画像ファイルや動画ファイルといった「文字とは解釈できないデータ」です。
バイナリファイルは最初から0と1の2進数で表現されており、人間が直接読んだり、編集したりすることはできません。
テキストファイルもバイナリファイルもコンピュータの書き込まれる際には、0と1の羅列であることは変わりありません。
たとえば文字「A」は2進数では「01000001」と表されます。
人間にとって「A」という文字を書き込む際に、「01000001」を書き込むより「A」を書き込む、と指定するほうがわかりやすいです。
そこで、テキストファイルとバイナリファイルを読み書きする際には、別々のクラスで取り扱います。
テキストファイルの読み書きには、java.io.FileWriterクラスとjava.io.FileReaderクラスを使用します。
バイナリファイルを読み書きするには、java.io.FileOutPutStreamクラスとjava.io.FileInputStreamクラスを使用します。
【テキストファイルとバイナリファイルを扱うクラス】
日本語と文字コード体系
英語圏で扱われるアルファベットや数字、特殊記号は種類が少ないので1文字を1バイトで表現することができます。
しかし日本語にはそれ以外にひらがな、カタカタ、漢字など、たくさんの種類の文字があるため2バイトを使って1文字を表現します。
ところが「ある文字にどのようなバイト表現を割り当てるか」というルールが何種類も用意されています。
これらのルールは文字コード体系と呼ばれています。
一般的に日本語文字コード体系にはJIS、Shift_JIS、EUCなどがあり、別の名前がついていることがあります。
【文字コード体系の別称】
FileWriterクラスは、引数で指定された文字をバイト表現に変換してファイルに書き出しをします。
FileReaderクラスではファイルから読み込む際にバイト表現を文字に変換して読み込みます。
その際に、システム標準の文字コード体系が利用されます。
たとえばOSがShift_JISを採用していれば、Shift_JISの文字コード体系で読み書きされます。
また、コンストラクタの引数に文字コードを指定することも可能です。
一方、FileOutPutStreamやFileInputStreamは常にUnicodeで読み書きされるので注意が必要です。
ストリーム
プログラムにおいて、ネットワークを通して別のプログラムとデータをやり取りしたり、ハードディスクに保存されているファイルからデータをやり取りすることがあります。
前述したFileWrite/FileReaderやFileOutputStream/FileInputStreamはデータを少しずつ読み書きするものです。
データの読み書きに置いては相手がネットワークである場合など大量のデータを読み書きするとメモリ不足でプログラムが異常終了する可能性があります。
そこでプログラムの世界ではストリーム(Stream)と言う概念があります。
ストリームはデータが少しずつ流れてくる小川のようなイメージで、プログラムとファイルとの間のデータの流れのことです。
FileWrite/FileReaderのような文字の流れを文字ストリームもしくはキャラクタストリーム、FileOutputStream/FileInputStreamのようなバイトが流れるストリームをバイトストリームと言います。
また、ファイルからプログラムへデータを読み込むことを入力ストリーム、プログラムからファイルへデータを書き出すことを出力ストリームと言います。
【文字コード体系の別称】
キャラクタストリームでは、データの読み書きを16ビット(2バイト)単位で行います。
バイトストリームでは8ビット(1バイト)単位で読み書きを行います。
Javaは1文字をUnicodeで16ビットデータとして扱っています。
キャラクタストリームを使用すると、キャラクター単位つまり16ビットで読み書きをするので、OSの文字コードを意識せず入出力をすることができます。
「ファイルの入出力 Part2」へ続きます。
phoeducation.work
LINE公式アカウント
仕事が辛くてたまらない人生が、仕事が楽しくてたまらない人生に変わります。
【登録いただいた人全員に、無料キャリア相談プレゼント中!】