Javaでファイルに書き込み・出力する(新規/上書き/追記/文字コード)

Javaでファイルに出力する方法がわからない
ファイルの内容を新規に作成・書き込み・上書きする方法を知りたい
バイナリデータを書き込む方法が知りたい
文字コードを指定する方法を知りたい

Javaのファイル操作で、ファイルに書き込む処理はよく使用されます。どのような用途でもファイルに書き込む基本的な流れは変わりませんが、用途別に処理が異なるため、使い方がいまいちわからない方も多いのではないでしょうか?

そこで、この記事ではファイルの書き込み・出力方法について、基本的な方法からバイナリデータを指定する方法、文字コードを指定する方法など、応用的な内容についても解説していきます。

この記事はこんな人のために書きました。

  • ファイルに書き込む方法の基本を知りたい方
  • バイナリデータや文字コードを指定して書き込みをしたい方

今回はそんなファイルの処理について、さまざまな方法をわかりやすく解説します!

なお、Javaの記事については、こちらにまとめています。

目次

Javaでファイルに出力する方法

ファイルに出力する基本的な方法

Javaでファイルを出力するための基本操作は、書き込むファイルを指定する→ファイルに書き込む→ファイルを閉じるとなります。

ファイルに文字列を書き込むには、書き込むファイルを指定するFileWriterクラスと、ファイルの書き込み操作などを行うPrintWriterクラスを使用します。

それぞれ、以下のようにクラスをインポートします。

import java.io.FileWriter;
import java.io.PrintWriter;

また、実際にファイルに書き込むには、FileWriterクラスのprintlnメソッドを使用します。

PrintWriter println(“書き込む文字列”)

ファイルに書き込む方法(上書き)

以下にファイルに文字列を書き込む基本的な方法を記述します。

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class Main {
 
    public static void main(String[] args) {
        try {
            // FileWriterクラスのオブジェクトを生成する
            FileWriter file = new FileWriter("/Users/Shared/java/java.txt");
            // PrintWriterクラスのオブジェクトを生成する
            PrintWriter pw = new PrintWriter(new BufferedWriter(file));
            
            //ファイルに書き込む
            pw.println("apple");
            pw.println("orange");
            pw.println("melon");
            
            //ファイルを閉じる
            pw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

このサンプルコードでは、FileWriterクラスを宣言し、書き込むファイルを指定しています。

次にPrintWriterクラスを宣言し、BufferedWriterクラスを拡張して引数にFileWriterクラスのオブジェクトを指定します。PrintWriterクラスのprintlnメソッドの引数に書き込む文字列を指定すれば、指定したファイルに文字列が書き込まれます。

最後は必ずcloseメソッドを使用して、ファイル処理のリソースを開放します。

なお、このサンプルコードではすでに指定したTXTファイルが存在する場合、ファイルの内容は上書きされます

上書きではなく、追記して書き込むこともできます。

ファイルに追記する方法

ファイルに追記する場合は、FileWriterクラスの引数にtrueを指定すれば、内容を追記して書き込むことが可能です。

FileWriter file = new FileWriter(“ファイル名”, true);

以下に基本的な書き込み方法で紹介したサンプルと、同じファイルに内容を追記する処理を記述します。

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class Main {
 
    public static void main(String[] args) {
        try {
            // FileWriterクラスのオブジェクトを生成する
            FileWriter file = new FileWriter("/Users/Shared/java/java.txt", true);
            // PrintWriterクラスのオブジェクトを生成する
            PrintWriter pw = new PrintWriter(new BufferedWriter(file));
            
            //ファイルに追記する
            pw.println("pineapple");
            pw.println("banana");
            
            //ファイルを閉じる
            pw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

実行結果を確認すると、ファイルに内容が追記されていることがわかります。

バイナリデータをファイルに書き込む方法

BufferedOutputStreamで書き込む方法

バイナリデータとは、簡単に説明するとコンピュータが理解できるデータとなります。

実際のシステム開発において、データをバイナリに変換して処理を行うことはよくあります。

バイナリデータを書き込む方法はいくつかありますが、ここではBufferedOutputStreamクラスを使用した書き込み方法を紹介します。

BufferedOutputStreamクラスは、以下のようにクラスをインポートします。

import java.io.BufferedOutputStream;

以下にバイナリデータをファイルに書き込む方法を記述します。

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Main {
 
    public static void main(String[] args) {
        try {
            /* バイナリデータを書き込む */
            BufferedOutputStream bf = new BufferedOutputStream
                (new FileOutputStream("/Users/Shared/java/binary.txt"));
            
            //ASCIIコードを書き込む
            byte b1 = 74; //ASCII:(J)
            byte b2 = 65; //ASCII:(A)
            byte b3 = 86; //ASCII:(V)
            byte b4 = 65; //ASCII:(A)
            
            bf.write(b1);
            bf.write(b2);
            bf.write(b3);
            bf.write(b4);
            
            //ファイルに書き込む
            bf.flush();
            
            //ファイルをクローズする
            bf.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

このサンプルコードでは、BufferedOutputStreamクラスを宣言し、書き込むファイルを指定しています。次にASCIIコードで書き込むため、10進数で表現されたbyte型のデータを指定します。

BufferedOutputStreamクラスのwriteメソッドを使用して、書き込む内容をバッファに格納しておきます。

BufferedOutputStreamクラスのflushメソッドを使用すれば、バッファに溜め込んだ値が指定したファイルに書き込まれます。

ファイルを確認してみると、”JAVA”と記述されていることがわかります。

FileOutputStreamで書き込む方法

ここでは、FileOutputStreamクラスを使用して、ファイルに書き込む方法を解説します。

次のプログラムで確認してみましょう。

import java.io.FileOutputStream;
import java.io.IOException;

public class Main {
 
    public static void main(String[] args) throws IOException {
 
        //FileOutputStreamクラスのオブジェクトを生成する
        FileOutputStream fos = 
                new FileOutputStream("/Users/Shared/java/binary.txt");
        
        byte b1 = 74; //ASCII:(J)
        byte b2 = 65; //ASCII:(A)
        byte b3 = 86; //ASCII:(V)
        byte b4 = 65; //ASCII:(A)
        
        fos.write(b1);
        fos.write(b2);
        fos.write(b3);
        fos.write(b4);
 
        //ファイルに書き込む
        fos.flush();
 
        //ファイルをクローズする
        fos.close();
 
    }
}

このプログラムでは、FileOutputStreamクラスのオブジェクトを、ファイル/パスを指定して生成しています。

次にFileOutputStreamのwriteメソッドを使用して、書き込むデータをバッファに保存しています。

バッファに保存したデータは、flushメソッドを使用することでファイルに書き込まれ、最後にcloseメソッドでファイル操作のリソースを開放します。

また、FileOutputStreamクラス単体では、byte型のデータの書き込みのみで、文字列をファイルに書き込むことはできません。

FileOutputStreamクラスの詳しい使い方はこちらの記事で解説しているので、ぜひ確認してください。

文字コードを指定して出力する方法

文字コードを指定してファイル操作を行う場合は、以下の記事で詳細な解説をしています!

文字コードを変更してファイル出力する方法

応用的な使い方として、文字コードを指定してファイルを読み込み、文字コードを変更してファイルに書き込む方法を、以下に記述します。

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

public class Main {
 
    public static void main(String[] args) {
        try {
            /* 文字コードUTF-8のファイルを読み込んでShift-JISに変換する */
 
            File fileIn = new File("/Users/Shared/java/javaIn.csv");
            
            //文字コードUTF-8を指定してファイルを読み込む
            FileInputStream input = new FileInputStream(fileIn);
            InputStreamReader stream = new InputStreamReader(input,"UTF-8");
            BufferedReader buffer = new BufferedReader(stream);
            
            //書き込む用のファイルを指定する
            File fileOut = new File("/Users/Shared/java/javaOut.txt");
            PrintWriter p_writer = new PrintWriter
                    (new BufferedWriter(new OutputStreamWriter
                    (new FileOutputStream(fileOut),"Shift-JIS")));
     
            String str;
            
            //ファイルの最終行まで読み込む
            while((str = buffer.readLine()) != null){
                
                byte[] b = str.getBytes();
                
                //文字コードをShift-JISに変換する
                str = new String(b, "Shift-JIS");
                
                String[] col = str.split(",", -1);
                
                for ( int i=0; i<col.length; i++){
                    System.out.println(col[i]);
                    //ファイルに書き込む
                    p_writer.println(col[i]);
                }
            }
            //ファイルをクローズする
            p_writer.close();
            buffer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

サンプルでは、文字コードUTF-8を指定してファイルを読み込み、while文でファイル終端まで内容を取得し、文字列を一旦バイナリデータに変換したあとに、文字コードShift-JISに変換しています。

次にShift-JISに変換した文字列を、PrintWriterクラスのprintlnメソッドを使用してファイルに書き込みます。

最後はPrintWriterクラスのcloseメソッドを使用してファイル処理のリソースを開放します。

Fileクラスについてもっと詳しく知りたい方へ

Fileクラスのさまざまな使い方については、以下の記事にまとめていますので、ぜひ参考にしてくださいね!

ファイル操作総まとめ

ファイル操作の詳しい使い方はこちらの記事で詳しく解説しているので、ぜひ確認してください。

まとめ

ここでは、ファイルの書き込み操作について、基本的な書き込みや追記する方法、バイナリデータの書き込みや文字コードを指定する方法についても説明しました。

ファイルの書き込み操作は実際に使用する機会が多いと言えます。

もしファイルの書き込み処理を忘れてしまったら、この記事を思い出してくださいね!

この記事を書いた人

【プロフィール】
DX認定取得事業者に選定されている株式会社SAMURAIのマーケティング・コミュニケーション部が運営。「質の高いIT教育を、すべての人に」をミッションに、IT・プログラミングを学び始めた初学者の方に向け記事を執筆。
累計指導者数4万5,000名以上のプログラミングスクール「侍エンジニア」、累計登録者数1万8,000人以上のオンライン学習サービス「侍テラコヤ」で扱う教材開発のノウハウ、2013年の創業から運営で得た知見に基づき、記事の執筆だけでなく編集・監修も担当しています。
【専門分野】
IT/Web開発/AI・ロボット開発/インフラ開発/ゲーム開発/AI/Webデザイン

目次