BufferedWriterクラス - 萌えJava超入門
テキストファイルに書き込む

BufferedWriterクラス

OutputStreamWriterクラスの効率化をするクラスです。

java.io.BufferedWriter

目次

1.継承関係


萌えJava超入門
OutputStreamWriter に続いて
BufferedWriter
Writerの仲間だ。
BufferedWriterの継承関係
    java.io.Writer 抽象クラス
        |
        └ java.io.BufferedWriter クラス
  



2. コンストラクタ


引数に Writerクラスのインスタンスを渡します。
この章では、前のページで紹介した OutputStreamWriterクラスのインスタンスを渡します。

 public BufferedWriter(Writer out)

コンストラクタ 書式
Writer out;
  BufferedWriter bw = new BufferedWriter(out);
import java.io. BufferedWriter; が必要です。

萌えJava超入門 萌えJava超入門
んん??
BufferedWriterクラスも
Writerの仲間っスよね?
その引数も Writerクラスなんすか?
萌えJava超入門
そうだけど、実際にデータを書込むのは
ストリーム(Stream)だ。
BufferedWriterクラスの引数には、
Streamを渡して生成したWriterが
与えられる。
BufferedWriterクラスの役割はバッファリングです。
BufferedWriter 内部にある char[] cb に、設定された数の文字を蓄積して、
引数に与えた Writer out の負担軽減を行います。
byte配列へのデコードは、引数の Writer out に任せています。




3. writeメソッド


writeメソッドは、引数の文字列を、ストリームに書き込むメソッドです。
引数が文字列一つだけの writeメソッドが、一番よく使われると思います。

萌えJava超入門
文字列を渡せば
ファイルに書き込んでくれる。
簡単だろ?
BufferedWriter の writeメソッド1
 public void write(String str) throws IOException
 * write(String#)メソッドは、Writerクラスから継承されたメソッドです。

writeメソッド 書式1
BufferedWriter bw;
String str;
        bw.write(str);

例外処理を記述する場合には、以下をインポートする必要があります。
例外のimport
import IOException;

萌えJava超入門 萌えJava超入門
Writer クラスの
write メソッドかぁ。
綴りに注意ね。


4. newLineメソッド


改行文字を書き込みます。
テキストファイルを読み込む BufferedReader#.readLine()メソッドでは、改行文字が失われますよね。
それと反対に、一行ずつ文字列を書き込むには、改行文字を挟みながら書き込みます。

 public void newLine() throws IOException

newLineメソッド 書式
BufferedWriter bw;
        bw.newLine();

例外処理を記述する場合には、以下をインポートする必要があります。
例外のimport
import IOException;




5. flushメソッド


ストリームを閉じる前にキャッシュをすべてファイルに書き込みます。
 public void flush() throws IOException

flushメソッド 書式
BufferedWriter bw;
        bw.flush();

例外処理を記述する場合には、以下をインポートする必要があります。
例外のimport
import IOException;
萌えJava超入門
え~っと。
これは賛否が割れるかも
しれないんだけど。
萌えJava超入門 萌えJava超入門
ん?
萌えJava超入門
flushって
使わなくてもいいって
話もあるんだ。
萌えJava超入門 萌えJava超入門
しずのは
どっち派なの?
萌えJava超入門
使う派。
closeしてもキャッシュが残る現象に
何度か遭遇してるんだよね。
flushしたら改善するんだよ。
歯切れが悪くて申し訳ありません。
おまじないと思ってずっと flush を使い続けています。
flush して問題があるわけではないので、close とセットで使ってます。



5. closeメソッド


ストリームを閉じます。
萌えJava超入門
ファイルに、文字列が途中までしか
書き込まれない場合には
closeしているか確認しよう。
 public void close() throws IOException

closeメソッド 書式
BufferedWriter bw;
        bw.close();

例外処理を記述する場合には、以下をインポートする必要があります。
例外のimport
import IOException;
萌えJava超入門 萌えJava超入門


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」ファイルができていると思います。
中身を確認してみて下さい。

萌えJava超入門 萌えJava超入門 萌えJava超入門
じゃじゃ~ん!


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();
        }
    }
}

萌えJava超入門
「File」「追記」「文字コード」
の位置関係が混乱するんだよね。
コマンドライン
>cd ws
ws>javac -encoding UTF-8 Sample06_02.java
ws>java Sample06_02

「hello.txt」の中身を確認してみて下さい。
追記されていると思います。

萌えJava超入門 萌えJava超入門 萌えJava超入門
じゃじゃ~ん!



萌えJava超入門
じゃじゃ~ん!
は良いんですけど、
このコード長いっスね。



萌えJava超入門
私的にも覚えにくいコード
ランキングNo1だ。
まず覚えようとしてはダメだ。
萌えJava超入門 萌えJava超入門
「速く動こうと考えるな!
 速いと知れ!」
的な?
萌えJava超入門
えっ?
萌えJava超入門
頭のいい子は別にしても、
ムリに覚えようとすると挫折するぞ。
半年くらいコピペで過ごせば
覚える気になってくる。 大丈夫だ。



その息は本物か?




© 2019 awasekagami