java-beginner.com ブログ

プログラミングを学習するブログ(Javaをメインに)

ファイル書き込み読み取り練習

投稿日:

最終更新日:2016年08月24日

アイキャッチ

こんにちは。「Javaを復習する初心者」です。

今回はファイルの書き込みと読み取りの練習をしました。

書き込み、読み込みをするには、それぞれBufferedWriterクラス、BufferedReaderクラスがあります。

BufferedWriter

ファイルの書き込みはBufferedWriterクラスを使いました。コンストラクタは以下の2つがあります。

  • BufferedWriter(Writer out)
  • BufferedWriter(Writer out, int sz)

今回は引数が一つの方を使ってみました。引数が2つの方は使ったことありません。

引数にWriterクラスのインスタンスを指定することになってますが、ネットで調べた結果、その継承クラスであるFileWriterクラスを使うのが一般的なようです。コンストラクタは以下があります。

  • FileWriter(File file)
  • FileWriter(File file, boolean append)
  • FileWriter(FileDescriptor fd)
  • FileWriter(String fileName)
  • FileWriter(String fileName, boolean append)

下の2つを使うのが話が早い気がします。直接ファイル名を記述します。新規作成ならFileWriter(String fileName)を使い、追記ならFileWriter(String fileName, boolean append)の第2引数にtrueを指定する使い方です。

書き込みには以下のようなプログラムを書きました。

ソース前半

        String finaName = "testLog/test.txt";

        try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(finaName))){
            bufferedWriter.write("test" + String.valueOf(System.currentTimeMillis()));
            bufferedWriter.newLine();
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            bufferedWriter.write("test" + String.valueOf(System.currentTimeMillis()));
            bufferedWriter.newLine();
        } catch (IOException e) {
            e.printStackTrace();
        }

ファイルにはフォルダを含むことができますが、フォルダ自体がないとエラーになります。FileNotFoundExceptionが発生します。String型変数finaNameにファイルのパスを格納しています。Eclipseを使っているため、プロジェクト直下からのパスになります。

BufferedWriter#writeメソッドで書き込むことができます。どのような内容を書き込むか悩んだ結果、Systemクラスに用意されているcurrentTimeMillisメソッドを使うことにしました。ミリ秒で表される現在の時間を返します。その直後にBufferedWriter#newLineメソッドで改行しています。そしてもう一度ミリ秒を取得しているのですが、そのまま連続して書くとミリ秒が同じ値になる場合があったため、Thread#sleepメソッドで一秒待つことにしました。

BufferedReader

次は読み込みです。BufferedReaderクラスを使いました。コンストラクタは以下の2つです。

  • BufferedReader(Reader in)
  • BufferedReader(Reader in, int sz)

引数が1つの方を使いました。引数に指定するReaderクラスはFileReaderクラスを使うのが一般的なようです。コンストラクタは以下です。

  • FileReader(File file)
  • FileReader(FileDescriptor fd)
  • FileReader(String fileName)

3番目の直接ファイル名を使う方法を使いました。

ソースは以下です。

ソース後半

        try (BufferedReader br = new BufferedReader(new FileReader(finaName))){
            String s = br.readLine();
            while(s != null){
              System.out.println(s);
              s = br.readLine();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

readLineメソッドで一行まとめて読み込んでくれます。while文の形は大体このようなやり方が一般的なようです。

さて以上のプログラムを実行すると以下のように出力されます。

結果

test1472025948335
test1472025949336

ミリ秒を取得しているので実行ごとに値は変わります。同じ内容がtestLog/test.txtに保存されてました。