ログを出力したり、CSVファイルを読んだり書いたり、テキストファイルの入出力はよく使います。
ここでは、単純にテキストファイルから読み込み、テキストファイルへの書き込みをしてみたいと思います。
文字コードを指定してテキストファイルを書いて、書いたテキストファイルをすぐ読み込んでみる
UTF-8で読み書きするサンプルです。
ここでは、とりあえずファイルに書き込み。書き込んだファイルを読み込んで、標準出力してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; public class TextFileIOTest { public static void main(String[] args) { String fileName = "C:\\test\\test.txt"; String charset = "UTF-8"; TextFileIOTest test = new TextFileIOTest(); test.write(fileName,charset); test.read(fileName,charset); } public void write(String fileName,String charset) { FileOutputStream fos = null; OutputStreamWriter osw = null; BufferedWriter bw = null; try { fos = new FileOutputStream(fileName); osw = new OutputStreamWriter(fos,charset); bw = new BufferedWriter(osw); for(int i=1 ; i<=10 ; i++) { bw.write(i + "行目をかきかき..."); bw.newLine(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { try { bw.flush(); } catch (IOException e) { } try { bw.close(); } catch (IOException e) { } } } public void read(String fileName,String charset) { FileInputStream fis = null; InputStreamReader isr = null; BufferedReader br = null; try { fis = new FileInputStream(fileName); isr = new InputStreamReader(fis,charset); br = new BufferedReader(isr); String str = null; while((str = br.readLine()) != null) { System.out.println(str); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { try { br.close(); } catch (IOException e) { } } } } |
実行結果
1 2 3 4 5 6 7 8 9 10 | 1行目をかきかき... 2行目をかきかき... 3行目をかきかき... 4行目をかきかき... 5行目をかきかき... 6行目をかきかき... 7行目をかきかき... 8行目をかきかき... 9行目をかきかき... 10行目をかきかき... |
ちなみに、上記サンプルを実行すると、テキストファイルが「C:\test\test.txt」に作成されます。
ファイル名の指定は?
読み込み時は、FileInputStreamにて指定。書き込み時は、FileOutputStreamの各コンストラクタで指定します。
ファイルを格納するパスは、絶対パス、相対パスどちらで指定しても構いません。
文字コードの指定
読み込み時は、InputStreamReaderにて指定。書き込み時は、OutputStreamWriterの各コンストラクタで指定します。
上記の場合、「UTF-8」を指定していますが、他に「SJIS」等を指定しても構いません。
flushとcloseを忘れずに!
ファイルから読み込む場合、読み込んだ後(≒最後)にcloseを忘れず実施してください。
ファイルへ書き込みする場合、書き込んだ後(≒最後)にflushとcloseを忘れず実施してください。
flushってなに?
ざっくり言うと、「全部ファイルに書き出して!」という命令です。
プログラムで言われるままにファイルへ書き込みしていると、ファイルI/Oが増えてしまうので、ある程度溜まるまで書き込まないのです。
つまり、これを忘れると、全然書かれていなかったり、中途半端に書かれたりします。
closeってなに?
ざっくり言うと、「ファイルの操作が終わったから、もう触らないよ!」を宣言する命令です。
これにより、実行しているプログラム(プロセス)からファイルが解放されて、他のプログラムが書き込んだりすることができるようになります。
つまり、これを忘れると、いつまで経っても、他のプログラムが触れません。
※実際は、windowsを再起動したり、プログラムが終了したりしたときに解放される(されてしまう)のですが、サーバーで動くプログラムではきっと困ります(;´Д`)
ちゃんとcloseしてあげましょう。