テキストファイルに書き込む
BufferedWriterクラス
OutputStreamWriterクラスの効率化をするクラスです。
java.io.BufferedWriter
目次
1.継承関係
OutputStreamWriter に続いて
BufferedWriter も
Writerの仲間だ。
BufferedWriterの継承関係
java.io.Writer 抽象クラス
|
└ java.io.BufferedWriter クラス
2. コンストラクタ
引数に Writerクラスのインスタンスを渡します。
この章では、前のページで紹介した OutputStreamWriterクラスのインスタンスを渡します。
public BufferedWriter(Writer out)
んん??
BufferedWriterクラスも
Writerの仲間っスよね?
その引数も Writerクラスなんすか?
そうだけど、実際にデータを書込むのは
ストリーム(Stream)だ。
BufferedWriterクラスの引数には、
Streamを渡して生成したWriterが
与えられる。
BufferedWriterクラスの役割はバッファリングです。
BufferedWriter 内部にある char[] cb に、設定された数の文字を蓄積して、
引数に与えた Writer out の負担軽減を行います。
byte配列へのデコードは、引数の Writer out に任せています。
3. writeメソッド
writeメソッドは、引数の文字列を、ストリームに書き込むメソッドです。
引数が文字列一つだけの writeメソッドが、一番よく使われると思います。
文字列を渡せば
ファイルに書き込んでくれる。
簡単だろ?
例外処理を記述する場合には、以下をインポートする必要があります。
例外のimport
import IOException;
Writer クラスの
write メソッドかぁ。
綴りに注意ね。
4. newLineメソッド
改行文字を書き込みます。
テキストファイルを読み込む BufferedReader#.readLine()メソッドでは、改行文字が失われますよね。
それと反対に、一行ずつ文字列を書き込むには、改行文字を挟みながら書き込みます。
public void newLine() throws IOException
例外処理を記述する場合には、以下をインポートする必要があります。
例外のimport
import IOException;
5. flushメソッド
ストリームを閉じる前にキャッシュをすべてファイルに書き込みます。
public void flush() throws IOException
例外処理を記述する場合には、以下をインポートする必要があります。
例外のimport
import IOException;
え~っと。
これは賛否が割れるかも
しれないんだけど。
ん?
flushって
使わなくてもいいって
話もあるんだ。
しずのは
どっち派なの?
使う派。
closeしてもキャッシュが残る現象に
何度か遭遇してるんだよね。
flushしたら改善するんだよ。
歯切れが悪くて申し訳ありません。
おまじないと思ってずっと flush を使い続けています。
flush して問題があるわけではないので、close とセットで使ってます。
5. closeメソッド
ストリームを閉じます。
ファイルに、文字列が途中までしか
書き込まれない場合には
closeしているか確認しよう。
public void close() throws IOException
例外処理を記述する場合には、以下をインポートする必要があります。
例外のimport
import IOException;
6.サンプルコード1
「hello.txt」というファイルを作成して、
String[] strs の中の文字列を、一要素ずつ書き込むサンプルです。
//Sample06_01.java
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
class Sample06_01{
public static void main(String[] args){
String path = "hello.txt";
File file = new File(path);
String[] strs = {
"赤い彗星",
"青い彗星",
"黄色い彗星",
"ピンクの彗星",
"緑色の彗星"
};
try {
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream(file), "UTF-8"
)
);
for(String str :strs){
bw.write(str);
bw.newLine();
}
bw.close();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e){
e.printStackTrace();
}
}
}
コマンドライン
>cd ws
ws>javac -encoding UTF-8 Sample06_01.java
ws>java Sample06_01
Sample06_01.java を実行したフォルダに「hello.txt」ファイルができていると思います。
中身を確認してみて下さい。
じゃじゃ~ん!
7.サンプルコード2 ファイルに追記する
追記の true
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream(file, true), "UTF-8"
// ^ココ
)
);
Sample06_01.java で作成した「hello.txt」ファイルに、
文字列を追記してみたいと思います。
プログラムの動作ログを記録するような場面でよく用いられる書き方です。
FileOutputStreamクラスの第二引数に、「true」を与えると追記になります。
//Sample06_02.java
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
class Sample06_02{
public static void main(String[] args){
String path = "hello.txt";
File file = new File(path);
String[] strs = {
"赤いきつね",
"緑のたぬき",
"碧いうさぎ",
"白のパンダ",
"ピンクのパンサー"
};
try {
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream(file, true), "UTF-8"
// ^ココ
)
);
for(String str :strs){
bw.write(str);
bw.newLine();
}
bw.close();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e){
e.printStackTrace();
}
}
}
「File」「追記」「文字コード」
の位置関係が混乱するんだよね。
コマンドライン
>cd ws
ws>javac -encoding UTF-8 Sample06_02.java
ws>java Sample06_02
「hello.txt」の中身を確認してみて下さい。
追記されていると思います。
じゃじゃ~ん!
じゃじゃ~ん!
は良いんですけど、
このコード長いっスね。
私的にも覚えにくいコード
ランキングNo1だ。
まず覚えようとしてはダメだ。
「速く動こうと考えるな!
速いと知れ!」
的な?
えっ?
頭のいい子は別にしても、
ムリに覚えようとすると挫折するぞ。
半年くらいコピペで過ごせば
覚える気になってくる。 大丈夫だ。
その息は本物か?