前回に引き続きファイルの入出力についての解説です。
前回までの記事はこちら phoeducation.work phoeducation.work
基本データ型とString型のデータの読み書き
DataInputStreamクラスとDataOutStreamクラスを使用すると、int型などの基本データ型およびString型のデータを読み書きすることができます。
これらのクラスには基本データ型およびString型に対応した読み書きをするためのメソッドが用意されています。
このストリームは単体では使用できず、他のストリームと連結して使用します。
具体的には他のストリームをコンストラクタの引数に指定して生成します。
【DataInputStreamとDataOutputStremのコンストラクタ】
【DataInputStreamとDataOutputStremのメソッド】
【DataInputStremとDataOutputStreamの利用】
前回「filetext2」ファイルを作成している人はいったん削除しておきましょう。
また前回と同様にプロジェクトの中に「filesample」フォルダが必要になります。
import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; class FileSample5{ public static void main(String args[]){ File file = new File("filesample¥¥filetext2.txt"); try(DataOutputStream dos = new DataOutputStream(new FileOutputStream(file)); DataInputStream dis = new DataInputStream(new FileInputStream(file))){ dos.writeInt(100); dos.writeUTF("mirai"); dos.writeUTF("未来"); System.out.print(dis.readInt()); System.out.print(dis.readUTF()); System.out.print(dis.readUTF()); }catch(FileNotFoundException e){ System.out.println("ファイルがありません"); }catch(IOException e){ System.out.println("書き込み時にエラーが発生しました"); } } }
実行結果
コンソールの表示
100mirai未来
ファイル出力
11行目~12行目のtry-with-resource文では、DataOutputStream とDataInputStreamのオブジェクト生成の際に、引数にFileOutputStreamオブジェクトとFileInputStreamオブジェクトを指定しています。
13行目でwriteInt()を使用してint型の100というデータを4バイト値として、出力ストリームに書き込んでいます。
14行目ではwriteUTF()を使用して「mirai」という文字列を、UTF-8エンコーディングを使った形式にして書き出しています。
15行目ではwriteUTF()を使用して「未来」という文字列を、UTF-8エンコーディングを使った形式にして書き出しています。
17行目ではreadInt()を使用して4バイトのデータを読み込んでいます。
18行目~19行目ではreadUTF()を使用してUTF-8形式でエンコードされた文字列を読み込んでいます。
書き出されたfiletext2.textをメモ帳で開くと、UTF-8以外の文字コードを使っているシステム上では文字化けして表示されます。(Windowsの標準システムコードはShift_JIS)
しかし、ファイルから読み込まれた結果はコンソールに文字化けされずに表示されています。
これは、write時とread時にそれぞれに対応した文字コードで読み書きをしているためです。
このような実行結果から基本データおよびString型のデータをプログラムとファイル間でやり取りしていることがわかります。
文字列のブロック単位での読み書き
FileInputStreamとFileOutputStreamやFileReaderとFileWriterは1バイト単位、または1文字単位で入出力するので、あまり効率が良いとはいえません。
BufferedReaderクラスとBufferedWriterクラスは1文字ずつ入出力するのではなく、バッファに文字列をためていき、たまった文字列をまとめて読み込んだり、書き込んだりするので、効率的に入出力が可能になります。
コンストラクタの引数には、ReaderオブジェクトやWriterオブジェクトを指定します。
またバッファのサイズも指定することができます。BufferedReaderクラスには、読みこみをする、read()があります。単一文字単位に読み込み、ファイルの終わりに達すると-1を返します。
readLine()を使用すると、行単位で読み込むことができ、行の終わりは改行コードなどで認識します。
BufferedWriterクラスのwrite()は文字単位で書き出しをします。
newLine()は改行文字を書き込ます。
flush()は目的の送信先にただちに文字を書き込みます。
これらのメソッドはIOExceptionの例外を発生する可能性があるので、例外処理をする必要があります。
【BufferedReaderとBufferedWriterのコンストラクタ】
【BufferedReaderとBufferedWriterのメソッド】
【BufferedReaderとBufferedWriterの利用】
「filetext2」ファイルを作成している人はいったん削除しておきましょう。
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; class FileSample6{ public static void main(String args[]){ File file = new File("filesample¥¥filetext2.txt"); try(BufferedWriter bw = new BufferedWriter(new FileWriter(file)); BufferedReader br = new BufferedReader(new FileReader(file))){ bw.write("おはよう"); bw.newLine(); bw.write("こんにちは"); bw.flush(); String data = null; while((data = br.readLine()) != null){ System.out.println(data); } }catch(FileNotFoundException e){ System.out.println("ファイルがありません"); }catch(IOException e){ System.out.println("書き込み時にエラーが発生しました"); } } }
実行結果
コンソールの表示
おはよう こんにちは
ファイル出力
FileReaderとFileWiterのオブジェクトは、char単位で入出力を行うストリームです。
これらはchar単位つまり文字単位の入出力となり効率があまりよくありません。
そこでBufferedReaderとBufferedWriterを使用し、バッファに文字列をためて、たまった文字列をまとめて読み込んだり、書き込んだりします。
11行目~12行目でBufferedReaderとBufferedWriteのコンストラクタの引数にFileReaderとFileWriterのオブジェクトを指定しておき、これで準備完了です。
13行目でwite()を使用して、「おはよう」という文字列を書き込みます。
14行目のnewLIne()で改行します。
15行目で更に「こんにちは」という文字列を書き込みます。
19行目でreadLine()を使って、書き込まれたデータを行単位で読み込み、読み込まれたデータがnullでない間は変数dataに格納しながら画面表示します。
「ファイルの入出力 Part4」へ続きます。
phoeducation.work
LINE公式アカウント
仕事が辛くてたまらない人生が、仕事が楽しくてたまらない人生に変わります。
【登録いただいた人全員に、無料キャリア相談プレゼント中!】