Javaのテキストファイルの読み書きを解説!

エンジニア
マネージャー
Javaによるテキストファイル読み書きとは?
パソコンを使う人ならテキストファイルと言えばほとんどの人がご存じでしょう。.txt拡張子で文字だけが書かれているシンプルなドキュメントファイルのことです。これをJavaで読み込んだり、書き込んだりすることは手軽に行えます。
ただしテキストファイルは文字コードについては注意する必要があります。それを含めたJavaによるテキストファイル読み書きを分かりやすく説明するので、是非ご覧ください。
テキストファイルの読み込み
まずはJavaでテキストファイルを読み込む方法です。以下が簡単なサンプルです。なおソースの先頭には「import java.io.*;」を記述してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
try { File file = new File("C:\\test\\test.txt"); FileReader fr = new FileReader(file); String str = ""; while (true) { int c = fr.read(); if (c==-1) break; str += (char)c; } System.out.println(str); fr.close(); } catch (IOException e) { System.out.println(e); } |
FileReaderクラスで1文字ずつ読み込める
上のJavaのサンプルを説明しましょう。まずCドライブのtestフォルダ内のtest.txtファイルの情報を、Fileクラスで取得します。そしてFileReaderクラスを生成します。その後FileReaderクラスのreadメソッドで1文字読み込んで変数cに入れます。
cが-1だった場合はファイルを全部読み込んだことになるので、breakでwhileループを抜けます。-1以外の場合は文字コードの数値が入っているので、(char)のキャストでchar型に変換してString型のstrに文字列として追加します。
ファイルアクセス処理はtry~catchで囲むこと
全部読み終わってwhileループを抜けた後はstrを表示して、ファイルをcloseしています。closeで閉じるのを忘れないようにしましょう。忘れると後でまたファイルを開こうとしてもできなくなったりします。
もしtest.txtが無いなどでファイルが見つからないと、Exceptionが発生します。その場合はcatchに飛んで「指定されたファイルが見つかりません。」などと表示するようにしています。このようにExceptionが発生する可能性がある処理は、必ずtry~catchで囲みましょう。
テキストの読み込みにはBufferedReaderを使う
ここまでのやり方でテキストファイルを読み込むことはできますが、実はFileReaderで1文字ずつ読み込むのは効率が悪く、あまり良いやり方ではないのです。Javaでは以下のようにBufferedReaderを使う方が一般的です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
try { File file = new File("C:\\test\\test.txt"); FileReader fr = new FileReader(file); BufferedReader br = new BufferedReader(fr); String str = ""; while (true) { String s = br.readLine(); if (s==null) break; str += s+"\r\n"; } System.out.println(str); fr.close(); } catch (IOException e) { System.out.println(e); } |
readLineで1行ずつ読み込める
上のJavaのサンプルでは、FileReaderのインスタンスをBufferedReaderに渡しています。そしてreadLineで改行コードかファイル末端まで読み込みます。つまり1文字ずつではなく1行ずつ読み込んでいるのです。ファイル末端まで行くとreadLineはnullを返すので、そこで終了します。
なおreadLineで改行まで読んだ場合、返す文字列に改行コードは含まれないので、”\r\n”を追加しています。Windows環境はこれでいいのですが、Macなら”\r”、UNIX/Linuxなら”\n”としてください。
Javaのテキストファイル書き込み
次はJavaでテキストファイルの書き込みをしましょう。以下がサンプルです。
1 2 3 4 5 6 7 8 9 10 11 12 |
try { File file = new File("C:\\test\\test.txt"); FileWriter fw = new FileWriter(file); BufferedWriter bw = new BufferedWriter(fw); bw.write("テストです。"); bw.newLine(); bw.write("もう一度。"); bw.flush(); bw.close(); } catch (IOException e) { System.out.println(e); } |
BufferedWriterでバッファリングしながらテキスト書き込みできる
FileWriterとBufferedWriterを使ってテキストファイルを作成してwriteで書き込んでいます。newLineは実行している環境に応じた改行コードを挿入してくれます。BufferedWriterを使用する場合、writeの度にファイルアクセスせずに一旦メモリにバッファリングしています。
そのためどこかのタイミングでflushを呼び出して実際にファイルに書き込む必要があります。この仕組みの方が毎回ファイルに書き込むよりも、パフォーマンスが良くなります。なおcloseする時にもflushは行われるので、このサンプルのように少し書き込むだけなら無くてもかまいません。
ファイルの存在確認と追記
もし書き込みをしようとしたファイルが既に存在している場合は、どうすればよいのでしょうか。上のJavaサンプルの先頭を、以下のように変えてみましょう。
1 2 3 4 5 6 |
File file = new File("C:\\test\\test.txt"); FileWriter fw; if (file.exists()) fw = new FileWriter(file, true); // 追記モード else fw = new FileWriter(file, false); // 新規モード |
これでtest.txtがすでにある場合は追記で書きこまれるようになります。この追記モードのtrue指定が無い場合は、ファイルの内容は消えて上書きされます。
文字コードの違いについて
最後に、冒頭で触れた文字コードの問題について触れておきましょう。テキストファイルに書き込む文字コードは一種類ではありません。主に以下の3つがあります。
Shift-JIS 日本のWindowsで使用されている。
UTF-8 環境に依存せず、世界中の全ての文字を扱うことができる。
EUC-JP 日本のLinux、UNIXで使用されている。
こうしてみるとUTF-8がベストのように思えますが、UTF-8はあらゆる文字を扱える分、サイズが大きくなるという欠点があります。そのため日本ではShift-JISが多く使われています。
文字コードを指定したテキストファイル書き込み
以下が文字コードを指定してテキストファイルを書き込むJavaのサンプルです。OutputStreamWriterを使用してUTF-8でファイルを作成しています。
1 2 3 4 5 6 7 8 9 |
try { FileOutputStream fo = new FileOutputStream("C:\\test\\test.txt"); OutputStreamWriter ow = new OutputStreamWriter(fo,"UTF-8"); BufferedWriter bw = new BufferedWriter(ow); bw.write("テストです。"); bw.close(); } catch (IOException e) { System.out.println(e); } |
文字コードを指定したテキストファイル読み込み
次は文字コードを指定してテキストファイルを読み込むJavaサンプルです。UTF-8として読み込んでいますが、これをShift-JISに変えて上のサンプルで作成したファイルを読み込むと、表示が文字化けをします。試してみてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
try { FileInputStream fi = new FileInputStream("C:\\test\\test.txt"); InputStreamReader ir = new InputStreamReader(fi,"UTF-8"); BufferedReader br = new BufferedReader(ir); String str = ""; while (true) { String s = br.readLine(); if (s==null) break; str += s+"\r\n"; } System.out.println(str); ir.close(); } catch (IOException e) { System.out.println(e); } |
エンジニア
マネージャー
Javaのテキスト読み書きはファイル操作の基本
Javaのテキストファイルの読み書きについて解説しましたが、ご理解頂けましたでしょうか。テキストの扱いはファイル操作の基礎ですが、これを理解すれば違う形式のファイルも難なく扱えるようになるでしょう。是非マスターしてください。
FEnetJava・Javaコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


Java新着案件New Job
官公庁向け業務システム開発/Java/東京都千代田区/【WEB面談可】/テレワーク
月給39万~44万円東京都千代田区(永田町駅)販売管理システム開発/Java/東京都中央区/【WEB面談可】/テレワーク
月給49万~55万円東京都中央区(京橋駅)生命保険会社向けシステム開発/Java/東京都千代田区/【WEB面談可】/テレワーク
月給42万~48万円東京都千代田区(大手町駅)社会保険システムのパッケージ開発/Java/東京都港区/【WEB面談可】/テレワーク
月給42万~48万円東京都港区(新橋駅)金融機関向けシステム更改/Java/東京都江東区/【WEB面談可】/テレワーク
月給46万~51万円東京都江東区(豊洲駅)大手通信会社者向けWebシステム改修/Java/東京都港区/【WEB面談可】/テレワーク
月給42万~48万円東京都港区(品川駅)