|
|
テキストファイルの入出力 |
H.Kamifuji . |
テキストファイルを読み込んだり、逆にテキストをファイルに書き込んだりする方法について見ていきます。 当ページでは、Linux CentOS7 の Gnome で動作テストしています。 現在(2021/08)では、JDK-16.0.2 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2021/11)では、JDK-17.0.1 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2023/04)では、JDK-20.0.1 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2024/10)では、JDK-23 にアップされています。一部、上位互換について、見直しを行っていきます。 |
|
ファイルからテキストを読み込むためには色々なクラスが用意されています。まずは基本となる"FileReader"クラスを使ってみます。 まず読み込みたいファイルを対象としてFileクラスのオブジェクトを作成します。そして、そのオブジェクトを引数としてFileReaderクラスのオブジェクトを作成します。(Fileクラスについては『ファイルを管理する』を参照して下さい)。 File file = new File(file_name); FileReader filereader = new FileReader(file);これで対象のファイルからテキストの読み込みを行う準備が出来ました。作成したFileReaderクラスのオブジェクトに対して、文字を読むメソッドを実行します。 ちなみにFileReaderクラスのオブジェクトを作成する場合には、"FileNotFoundException"という例外が発生する可能性があるため、例外の処理をしておかなければいけません。(例外については『ファイルを作成する』にて少し説明しています)。 try{ File file = new File("c:\\tmp\\test.txt"); FileReader filereader = new FileReader(file); }catch(FileNotFoundException e){ System.out.println(e); } テキストを読む次にファイルから文字を読み込みます。FileReaderクラスを使う場合には基本的に1文字ずつ読み込んでいきます。まとめて読むということが出来ませんので、効率はかなり悪いです。read public int read() throws IOException単一の文字を読み込みます。 戻り値: 読み込まれた文字。ストリームの終わりに達した場合は -1 例外: IOException - 入出力エラーが発生した場合 "read"メソッドでファイルから文字を1文字読み込みます。読み込んだ値はint型の値として取得できます。この整数は何だと言うと文字の文字コードを表す整数となってます。読み込んだ文字を、文字として表示する場合は下記のようにしてください。 try{ File file = new File("c:\\tmp\\test.txt"); FileReader filereader = new FileReader(file); int ch = filereader.read(); System.out.println((char)ch); }catch(FileNotFoundException e){ System.out.println(e); }catch(IOException e){ System.out.println(e); }※"read"メソッドは"IOException"と言う例外を処理しなければいけません。 "read"で読み込んだ整数の値を、「(char)ch」とすることで文字に変換しています。 ファイルの最後まで読み込む"read"メソッドを使うとまずファイルの先頭から1文字読み込みます。そして自動的に読み込む位置が次の文字に移ります。その為、連続して"read"メソッドを使うとファイルの先頭から順に1文字ずつ読み込んでくれます。そしてファイルの最後に達した時に"-1"という値を返してくれます。その為、ファイルの先頭からファイルの最後まで文字を読み込みたい場合は、"read"メソッドの結果として"-1"を返してくるまで繰り返し"read"メソッドを実行します。例えば下記のような感じです。 try{ File file = new File("c:\\tmp\\test.txt"); FileReader filereader = new FileReader(file); int ch = filereader.read(); while(ch != -1){ System.out.print((char)ch); ch = filereader.read(); } }catch(FileNotFoundException e){ System.out.println(e); }catch(IOException e){ System.out.println(e); }ファイルから1文字読み、その値が"-1"で無ければ画面に表示し、"-1"だった場合は終了します。なお上記のようなことを記述する場合は、まとめて下記のような書き方をすることが出来ます。 try{ File file = new File("c:\\tmp\\test.txt"); FileReader filereader = new FileReader(file); int ch; while((ch = filereader.read()) != -1){ System.out.print((char)ch); } }catch(FileNotFoundException e){ System.out.println(e); }catch(IOException e){ System.out.println(e); }上記のwhile文の中の条件式の部分は、ファイルから1文字読み込んだ値を変数"ch"に格納し、そして格納された値が"-1"と同じかどうかを比較しています。よくこのようにまとめて記述しますので、書き方として覚えておいてください。 また1文字読んでは表示するということを繰り返しますので、画面への表示も「System.out.println((char)ch)」とすると1文字ずつ改行されて表示されてしまうため、「System.out.print((char)ch)」にしています。こうすれば1文字ずつ改行される事は無く、またファイルから改行文字を読み込んだ場合も、その改行文字も表示しようとするため結果的にファイルの改行があるところで、画面表示も改行されて表示されます。 ファイルを閉じるファイルに対する全ての処理が終わったら、ファイルを閉じます。"close"メソッドを使います。close public void close() throws IOExceptionストリームを閉じます。 例外: IOException - 入出力エラーが発生した場合 以上のことからファイルから文字を読み込む場合の一連の流れは次のようになります。 try{ File file = new File("c:\\tmp\\test.txt"); FileReader filereader = new FileReader(file); int ch; while((ch = filereader.read()) != -1){ System.out.print((char)ch); } filereader.close(); }catch(FileNotFoundException e){ System.out.println(e); }catch(IOException e){ System.out.println(e); }では実際に試してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。import java.io.File; import java.io.FileReader; import java.io.FileNotFoundException; import java.io.IOException; class streamTest1{ public static void main(String args[]){ try{ File file = new File("./tmp/test.txt"); FileReader filereader = new FileReader(file); int ch; while((ch = filereader.read()) != -1){ System.out.print((char)ch); } filereader.close(); }catch(FileNotFoundException e){ System.out.println(e); }catch(IOException e){ System.out.println(e); } } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd Stream]$ javac streamTest1.java [xxxxxxxx@dddddddddd Stream]$ java streamTest1 abcdef 日本語 [xxxxxxxx@dddddddddd Stream]$無事ファイルの読み込みを行うことが出来ました。 ただFileWriterを直接使って文字を読み込み場合、1文字読んでは処理をするという方法になってしまい不便ですので、実際にはこの後に見ていく他のクラスを組み合わせて普通は使います。 |
前のページでテキストファイルから中身を読み取る方法を見ていきましたが、実際にはファイルを読む前に色々と確認しておいた方がいいと思います。 具体的には、開こうとするファイルが(1)実際に存在するか、(2)それがファイルなのか、(3)読み込み可能なのか、を確認しておきます。例えば下記のようなメソッドを用意しておきファイルを読む前に確認しておきましょう。 private boolean checkBeforeReadfile(File file){ if (file.exists()){ if (file.isFile() && file.canRead()){ return true; } } return false; }上記では、"exists"メソッドでファイルの存在を確認し、"isFile"メソッドで対象のFileクラスオブジェクトがファイルであるかどうかを確認後、"canRead"メソッドで読み込み可能かどうかを判別してます。(詳しくは『ファイルを管理する』を参照して下さい)。 以上を踏まえて前のページのサンプルを修正してみます。 サンプルプログラム下記のサンプルを実行してみよう。import java.io.File; import java.io.FileReader; import java.io.FileNotFoundException; import java.io.IOException; class streamTest2{ public static void main(String args[]){ try{ File file = new File("./tmp/test.txt"); // File file = new File( args[0] ); if (checkBeforeReadfile(file)){ FileReader filereader = new FileReader(file); int ch; while((ch = filereader.read()) != -1){ System.out.print((char)ch); } filereader.close(); }else{ System.out.println("ファイルが見つからないか開けません"); } }catch(FileNotFoundException e){ System.out.println(e); }catch(IOException e){ System.out.println(e); } } private static boolean checkBeforeReadfile(File file){ if (file.exists()){ if (file.isFile() && file.canRead()){ return true; } } return false; } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd Stream]$ java streamTest1 abcdef 日本語 [xxxxxxxx@dddddddddd Stream]$結果は同じですが、例外処理がしてありますので、あえて事前に確認するまでもないのですけど、例外を使わずに処理できるならしておいたほうがいいかと思います。 |
FileReaderを使ってファイルを読み込む場合には、1文字読み込んでは1文字処理して、と言うのを繰り返すため、非常に効率が悪いです。その為、ある程度まとめて読み込んでから、まとめて処理するためのクラスが用意されています。 BufferedReaderクラスを使います。なぜ最初からこのクラスを使わないかというと、このクラスはFileReaderクラスを拡張する形で利用するためです。FileReaderクラスの持つ基本機能でファイルから読み込みは行うのですけど、それにBufferedReaderクラスをかぶせて使うことでまとめて読み込む機能を持てるようになります。 使い方は下記のようになります。 File file = new File(file_name); FileReader filereader = new FileReader(file); BufferedReader br = new BufferedReader(filereader);FileReaderクラスのオブジェクトを作成するところまでは今までと同じですが、このオブジェクトを引数としてBufferedReaderクラスのオブジェクトを作成します。そしてFileReaderクラスのオブジェクトではなく、BufferedReaderクラスのオブジェクトに対して読み込み用のメソッドを実行してテキストファイルからテキストを読み込みます。 上記はまとめて下記のように記述しても構いません。 File file = new File(file_name); BufferedReader br = new BufferedReader(new FileReader(file)); テキストを1行単位で読む次にファイルの読み込みの仕方です。FileReaerクラスの時と同じく"read"メソッドもありますが、1行まとめて読むための"readLine"メソッドが別に用意されています。readLine public String readLine() throws IOException1 行のテキストを読み込みます。1 行の終端は、改行 (「\n」) か、復帰 (「\r」)、または復行とそれに続く改行のどれかで認識されます。 戻り値: 行の内容を含む文字列、ただし行の終端文字は含めない。ストリームの終わりに達している場合は null 例外: IOException - 入出力エラーが発生した場合 テキストファイルから1行分のテキストをまとめて読み込みます。注意する点は、改行文字は読み込んだ文字に含まれない事です。よって1行ごとに、改行を含まないテキストを読み込んでString型の値として返してくれます。 このメソッドを使うとまずファイルの先頭の1行を読み込んでくれます。そして自動的に読み込む位置が次の行に移ります。その為、繰り返し"readLine"メソッドを実行することで、ファイルの先頭から最後まで順にテキストを読み込んでくれることになります。 実際には下記のように利用します。 try{ File file = new File("c:\\tmp\\test.txt"); BufferedReader br = new BufferedReader(new FileReader(file)); String str = br.readLine(); while(str != null){ System.out.println(str); str = br.readLine(); } br.close(); }catch(FileNotFoundException e){ System.out.println(e); }catch(IOException e){ System.out.println(e); }まとめて下記のように記述しても構いません。 try{ File file = new File("c:\\tmp\\test.txt"); BufferedReader br = new BufferedReader(new FileReader(file)); String str; while((str = br.readLine()) != null){ System.out.println(str); } br.close(); }catch(FileNotFoundException e){ System.out.println(e); }catch(IOException e){ System.out.println(e); }今回はファイルから読み込んだ値には改行文字は含まれていませんので、"print"メソッドではなく"println"メソッドを使います。 ファイルを閉じるまた、BufferedReaderクラスを使う場合にも、使い終わったら閉じておく必要があります。BufferedReaderクラスでもFileReaderクラスと同じように"close"メソッドを使います。close public void close() throws IOExceptionストリームを閉じます。 例外: IOException - 入出力エラーが発生した場合 BufferedReaderクラスのオブジェクトに対して"close"処理を行えば、その元になっているFileReaderクラスの方は"close"しなくても構いません。 では試してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。import java.io.File; import java.io.FileReader; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.IOException; class streamTest3{ public static void main(String args[]){ try{ File file = new File("./tmp/test.txt"); // File file = new File( args[0] ); if (checkBeforeReadfile(file)){ BufferedReader br = new BufferedReader(new FileReader(file)); String str; while((str = br.readLine()) != null){ System.out.println(str); } br.close(); }else{ System.out.println("ファイルが見つからないか開けません"); } }catch(FileNotFoundException e){ System.out.println(e); }catch(IOException e){ System.out.println(e); } } private static boolean checkBeforeReadfile(File file){ if (file.exists()){ if (file.isFile() && file.canRead()){ return true; } } return false; } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd Stream]$ java streamTest1 abcdef 日本語 [xxxxxxxx@dddddddddd Stream]$結果は同じですが、1行毎の読み込みで実行しています。 |
ここからはテキストをファイルに書き込んでいく方法を見てみましょう。まずは基本となる"FileWriter"クラスを使います。 手順はファイルから読み込むときと似ています。テキストを書き込みたいファイルを対象にしてFileクラスのオブジェクトを作成します。そしてそのオブジェクトを引数としてFileWriterクラスのオブジェクトを作成します。 File file = new File(file_name); FileWriter filewriter = new FileWriter(file);これで対象のファイルに対する書き込みを行う準備が出来ました。 ちなみにFileWriterクラスのオブジェクトを作成する場合には、"IOException"という例外が発生する可能性があるため、例外の処理をしておいてください。 try{ File file = new File("c:\\tmp\\test.txt"); FileWriter filewriter = new FileWriter(file); }catch(IOException e){ System.out.println(e); } ファイルへの書き込みではファイルに書き込みを行います。"write"メソッドを使います。"write"メソッドは書き込む値として文字コードを使ったり、文字列を指定したりといくつか用意されているのですが、ここでは文字列を書き込むメソッドを見てみます。write public void write(String str) throws IOException文字列を書き込みます。 パラメータ: str - 書き込まれる文字列 例外: IOException - 入出力エラーが発生した場合 引数に指定した文字列を書き込みます。例えば下記のような使い方になります。 try{ File file = new File("c:\\tmp\\test.txt"); FileWriter filewriter = new FileWriter(file); filewriter.write("こんにちは"); }catch(IOException e){ System.out.println(e); } ファイルを閉じるファイルに対する全ての処理が終わったら、ファイルを閉じます。"close"メソッドを使います。close public void close() throws IOExceptionストリームを閉じます。 例外: IOException - 入出力エラーが発生した場合 以上のことからファイルに書き込みの一連の流れは次のようになります。 try{ File file = new File("c:\\tmp\\test.txt"); FileWriter filewriter = new FileWriter(file); filewriter.write("こんにちは"); filewriter.close(); }catch(IOException e){ System.out.println(e); }では試してみましょう。下記では書き込みを行う前に、ファイルが存在し、ディレクトリではない事を確認し、そして書き込み許可されているかどうかを事前に確認しています。 サンプルプログラム下記のサンプルを実行してみよう。import java.io.File; import java.io.FileWriter; import java.io.IOException; class streamTest4{ public static void main(String args[]){ try{ File file = new File("./tmp/test01.txt"); // File file = new File( args[0] ); if (checkBeforeWritefile(file)){ FileWriter filewriter = new FileWriter(file); filewriter.write("こんにちは\r\n"); filewriter.write("お元気ですか\r\n"); filewriter.close(); }else{ System.out.println("ファイルに書き込めません"); } }catch(IOException e){ System.out.println(e); } } private static boolean checkBeforeWritefile(File file){ if (file.exists()){ if (file.isFile() && file.canWrite()){ return true; } } return false; } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd Stream]$ java streamTest4 ファイルに書き込めません [xxxxxxxx@dddddddddd Stream]$存在しないファイルには、書き込めないようです。下記のように touch コマンドでファイルを作成しておくと、下記のように書き込むことができます。 [wwwadmin@kamifuji18 Stream]$ touch tmp/test01.txt [wwwadmin@kamifuji18 Stream]$ ll tmp 合計 4 -rw-r--r-- 1 wwwadmin wwwadmin 17 1月 31 12:05 test.txt -rw-r--r-- 1 wwwadmin wwwadmin 0 1月 31 13:21 test01.txt [xxxxxxxx@dddddddddd Stream]$実行してみると [xxxxxxxx@dddddddddd Stream]$ java streamTest4 [xxxxxxxx@dddddddddd Stream]$画面上には特に何も表示されませんが、対象となっているファイルを開いてみると下記のようにテキストが書き込まれています。 [xxxxxxxx@dddddddddd Stream]$ cat tmp/test01.txt こんにちは お元気ですか [xxxxxxxx@dddddddddd Stream]$またFileWriterクラスを使う場合に、改行を書き込みたい場合は改行を表すコードを書き込みます。これはOSによって異なるため注意して下さい。Windowsの場合であれば「\r\n」を書き込みます(先ほどのサンプルでも改行を書き込んでいます)。 |
前のページのサンプルは、上書きでファイルにテキストを書き込んでいました。つまり書き込もうとしているファイルに、何か他のことが書いてあったとしても、全て消した上で新しいテキストを書き込んでいることになります。 今回は、既にファイルに書かれているテキストは消さずに、ファイルの最後に追加でテキストを書き込む方法を見ていきます。と言っても変更箇所は1箇所だけでFireWriterクラスのオブジェクトを作成する時に、下記のように2番目の引数として"true"を指定するだけです。 File file = new File(file_name); FileWriter filewriter = new FileWriter(file, true);2番目の引数にtrueを指定した場合、何か書き込みを行った場合はファイルの最後に書き込まれます。その為、既にファイルに入っているテキストは変更せずに追加で書き込みが行われます。 逆に2番目の引数に"false"を指定した場合、書き込みを行うとファイルの先頭に書き込まれます。その為、既にファイルに入っていたテキストはいったん消された上で書き込まれます(上書きしくのではなく、いったん全て消えた上で書き込みが行われます)。 では試してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。import java.io.File; import java.io.FileWriter; import java.io.IOException; class streamTest5{ public static void main(String args[]){ try{ File file = new File("./tmp/test01.txt"); // File file = new File( args[0] ); if (checkBeforeWritefile(file)){ FileWriter filewriter = new FileWriter(file, true); filewriter.write("はい。元気です\r\n"); filewriter.write("ではまた\r\n"); filewriter.close(); }else{ System.out.println("ファイルに書き込めません"); } }catch(IOException e){ System.out.println(e); } } private static boolean checkBeforeWritefile(File file){ if (file.exists()){ if (file.isFile() && file.canWrite()){ return true; } } return false; } } 実行前の ./tmp/test01.txt は、下記の2行でしたが、 [xxxxxxxx@dddddddddd Stream]$ cat tmp/test01.txt こんにちは お元気ですか [xxxxxxxx@dddddddddd Stream]$上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd Stream]$ javac streamTest5.java [xxxxxxxx@dddddddddd Stream]$ java streamTest5 [xxxxxxxx@dddddddddd Stream]$ cat tmp/test01.txt こんにちは お元気ですか はい。元気です ではまた [xxxxxxxx@dddddddddd Stream]$プログラムを実行すると上記のようにファイルの最後に書き込みが行われています。 |
FileReaderクラスにBufferedReaderクラスを組み合わせて利用したように、FileWriterクラスの場合も効率良く書き込むためのBufferedWriterクラスが用意されています。 使い方は下記のようになります。 File file = new File(file_name); FileWriter filewriter = new FileWriter(file); BufferedWriter bw = new BufferedWriter(filewriter);FileWriterクラスのオブジェクトを作成するところまでは今までと同じですが、このオブジェクトを引数としてBufferedWriterクラスのオブジェクトを作成します。そしてFileWriterクラスのオブジェクトではなく、BufferedWriterクラスのオブジェクトに対して書き込み用のメソッドを実行してテキストファイルにテキストを書き出します。 上記はまとめて下記のように記述しても構いません。 File file = new File(file_name); BufferedWriter bw = new BufferedWriter(new FileWriter(file)); 自動で判別された改行文字の出力BufferedWriterクラスのオブジェクトを使って書き込みを行う場合も"write"メソッドを使う点は同じです。ただ、改行文字を出力するためのメソッドが別に用意されています。前のサンプルでは改行文字として「\r\n」を書き出していました。Windowsの場合はそれでいいですけど、OSによって改行文字が「\n」だけのものもあります。その為、前のサンプルをWindows以外の環境で利用すると思ったとおりの動作をしない場合があります。 BufferedWriterクラスで用意されている"newLine"メソッドは、プログラムを実行しているOSなどの環境に合わせ、その環境に適した改行コードを自動で判断して出力してくれます。(実際には、プログラムのソースコードはどのOSでも同じものを使えますが、コンパイルする時にはOS毎のコンパイラがありますので、コンパイルする時点でOSに合った改行文字を出力するように調整しているのだと思います)。 newLine public void newLine() throws IOException改行文字を書き込みます。改行文字は、システムの line.separator プロパティにより定義され、必ずしも単一の改行文字 (「\n」) であるとは限りません。 例外: IOException - 入出力エラーが発生した場合 "newLine"メソッドを実行すると、ファイルに改行文字が書き込まれます。使い方としては下記のような感じです。 File file = new File(file_name); BufferedWriter bw = new BufferedWriter(new FileWriter(file)); bw.write("こんにちは"); bw.newLine(); ファイルを閉じるまた、BufferedWriterクラスを使う場合にも、使い終わったら閉じておく必要があります。BufferedWriterクラスでもFileWriterクラスと同じように"close"メソッドを使います。close public void close() throws IOExceptionストリームを閉じます。 例外: IOException - 入出力エラーが発生した場合 BufferedWriterクラスのオブジェクトに対して"close"処理を行えば、その元になっているFileWriterクラスの方は"close"しなくても構いません。 ではBufferedWriterクラスを使って前のサンプルを書き直してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。import java.io.File; import java.io.FileWriter; import java.io.BufferedWriter; import java.io.IOException; class streamTest6{ public static void main(String args[]){ try{ File file = new File( "./tmp/test02.txt ); // File file = new File( args[0] ); if (checkBeforeWritefile(file)){ BufferedWriter bw = new BufferedWriter(new FileWriter(file)); bw.write("こんにちは"); bw.newLine(); bw.write("お元気ですか?"); bw.newLine(); bw.close(); }else{ System.out.println("ファイルに書き込めません"); } }catch(IOException e){ System.out.println(e); } } private static boolean checkBeforeWritefile(File file){ if (file.exists()){ if (file.isFile() && file.canWrite()){ return true; } } return false; } }上記をコンパイルした後で実行すると次のように表示されます。 [wwwadmin@kamifuji18 Stream]$ touch ./tmp/test02.txt [wwwadmin@kamifuji18 Stream]$ java streamTest6 [wwwadmin@kamifuji18 Stream]$ cat ./tmp/test02.txt こんにちは お元気ですか? [wwwadmin@kamifuji18 Stream]$対象のファイルに書き込みが行われます。改行もきちんと行われています。 |
ファイルへの書き込み用クラスとして、もう少し便利なPrintWriterクラスが用意されています。 PrintWriterクラスは、既にあるファイル出力用のクラスをさらに拡張する感じで利用します。その為、BufferedWriterクラスのオブジェクトを元に作成する場合が多いようです。 使い方は下記のようになります。 File file = new File(file_name); FileWriter filewriter = new FileWriter(file); BufferedWriter bw = new BufferedWriter(filewriter); PrintWriter pw = new PrintWriter(bw);上記はまとめて下記のように記述しても構いません。 File file = new File(file_name); PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file)));だんだん複雑になってきていますが、元になるファイル書き出しようのクラスを元に拡張させていって便利な形にすると考えて下さい。 このクラスを使うと何が便利かと言いますと、画面に出力する時のように"print"メソッドや"println"メソッドが用意されていることです。 この2つのメソッドは引数として色々なデータ型の値を使えるようにデータ型毎にメソッドが用意されています。その為、"write"メソッドの時のように文字列だけではなく、int型やboolean型の値もそのまま出力するように記述することが可能です。(数値でも他の値でも、その値を文字としてファイルに書き込みます)。 File file = new File(file_name); PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file))); pw.println("文字列"); pw.println(10);"print"メソッドの時は改行せずにファイルへ書き出しを行い、"println"メソッドの場合は最後に改行します。1つだけメソッドの定義を見てみます。 println public void println(String x)String を出力して、行を終了します。このメソッドは、print(String) を呼び出してから println()を呼び出すのと同じように動作します。 パラメータ: x - 出力される String 値 改行は、BufferedWriterクラスで用意されていた"newLine"と同じように、動かしている環境に合わせて適切な改行文字を自動的に出力してくれます。 ファイルを閉じるまた、PrintWriterクラスを使う場合にも、使い終わったら閉じておく必要があります。PrintWriterクラスでもBufferedWriterクラスやFileWriterクラスと同じように"close"メソッドを使います。close public void close()ストリームを閉じます。 ※このクラスの"close"メソッドは例外を発生させません。 ではPrintWriterクラスを使って前のサンプルを書き直してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。import java.io.File; import java.io.FileWriter; import java.io.BufferedWriter; import java.io.PrintWriter; import java.io.IOException; class streamTest7{ public static void main(String args[]){ try{ File file = new File( "./tmp/test03.txt" ); // File file = new File( args[0] ); if (checkBeforeWritefile(file)){ PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file))); pw.println("今日の最高気温は"); pw.println(10); pw.println("度です"); pw.close(); }else{ System.out.println("ファイルに書き込めません"); } }catch(IOException e){ System.out.println(e); } } private static boolean checkBeforeWritefile(File file){ if (file.exists()){ if (file.isFile() && file.canWrite()){ return true; } } return false; } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd Stream]$ touch ./tmp/test03.txt [xxxxxxxx@dddddddddd Stream]$ java streamTest7 [xxxxxxxx@dddddddddd Stream]$ cat ./tmp/test03.txt 今日の最高気温は 10 度です [xxxxxxxx@dddddddddd Stream]$また対象のファイルに書き込みが行われます。改行もきちんと行われていますし、数値も(文字列として)ファイルに書き込まれています。 |
|