スライドショー

【Java】encodingを指定して読み書きする(CSV、テキストファイル)

Javaでファイルを読み書きするときにエンコーディングを指定したい
CSVファイルで文字コードを指定してファイルを読み込みたい

Javaでファイルを操作するときに、エンコーディングを指定する必要がある場合があります。エンコーディングを指定することで、ファイルの読み書き時に文字化けを防ぐことができます。

この記事では、そんなエンコーディングの指定方法について詳しく解説していきます。この記事はこんな人のために書きました。

  • テキストファイルを文字コード指定して読み書きしたい方
  • CSVファイルで文字コードを指定して読み込みたい方
  • ファイルの読み込み操作について詳しく知りたい方

今回はそんなエンコーディングの指定方法について、さまざまな方法をわかりやすく解説します!

エンコーディング(文字コード)とは?

プログラミングにおけるエンコーディングとは、ファイルの文字列を文字コード化する作業のことを指します。

とくに日本語はエンコーディングの影響が顕著で、コーディング時にソースファイルに日本語が含まれていた場合、プラットフォームが異なると文字化けしてしまう可能性があります。例えばWindowsで作成したプログラムをLinuxで動かした場合、日本語が文字化けしてしまうこともあります。またLinuxで編集する場合に文字化けで編集が困難になってしまう可能性もあります。

そのため、マルチプラットフォームで動くJavaだからこそ、文字コードについては注意しなければいけません。

Javaでエンコーディングを確認する

使用している開発環境のデフォルトのエンコーディングを調べるには、SystemクラスのgetPropertyメソッドを使用します。

public class Main {
 
    public static void main(String[] args) {
        System.out.println(System.getProperty("file.encoding"));
    }

}

実行結果:

UTF-8

使用している環境がMacのため、デフォルトの文字コードがUTF-8となりますが、Windowsの場合はMS932などの文字コードとなることもあります。

テキストファイルの文字コードを指定する

エンコーディングの種類

エンコーディングは、OSごとにさまざまな種類が存在します。Javaでサポートされているエンコーディングについては、オラクルの公式サイトを参照してください。

URL:https://docs.oracle.com/javase/jp/1.5.0/guide/intl/encoding.doc.html

また、文字コードについては以下の記事でも詳しく解説しています!

【Java入門】文字コードの確認・変換・指定する方法を解説!
更新日 : 2019年3月28日

文字コードを指定してファイルを読み込む方法

テキストファイルなどの文字コードを指定して読み込むためには、InputStreamReader及びFileInputStreamクラスを拡張したBufferedReaderクラスを使用します。

引数には文字コードを指定する必要があります。以下に文字コードを指定して、ファイルを読み込む方法を記述します。

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

public class Main {
 
    public static void main(String[] args) {
        /* ファイルの文字コードを指定して読み込む */
        File file = new File("/Users/Shared/java/java.txt");
        try {
            BufferedReader b_reader = new BufferedReader(new InputStreamReader(new FileInputStream(file),"Shift-JIS"));
            
            /* 〜ファイル操作〜 */
            
        } catch (UnsupportedEncodingException | FileNotFoundException e) {
            e.printStackTrace();
        }
    }

}

文字コードを指定してファイルに書き込む方法

ここでは、実際に文字コードを指定してファイルに書き込みを行います。一例として、BufferedWriter、OutputStreamWriter及びFileOutputStreamクラスを拡張した、PrintWriterクラスを使用して実行します。

引数には文字コードを指定する必要があります。以下に文字コードを指定して、ファイルを書き込む方法を記述します。

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;

public class Main {
 
    public static void main(String[] args) {
        File file = new File("/Users/Shared/java/java.txt");
        
        try {
            // 文字コードを指定する
            PrintWriter p_writer = new PrintWriter(new BufferedWriter
                (new OutputStreamWriter(new FileOutputStream(file),"Shift-JIS")));
            
            //ファイルに文字列を書き込む
            p_writer.println("apple");
            p_writer.println("orange");
            p_writer.println("melon");
            
            //ファイルをクローズする
            p_writer.close();
        } catch (UnsupportedEncodingException | FileNotFoundException e) {
            e.printStackTrace();
        }
    }

}

ファイルに書き込むためには、PrintWriterクラスのprintlnメソッドを使用し、引数に文字列を指定します。PrintWriterクラスは、指定したファイルが存在しない場合は新規作成し、すでに同名のファイルが存在する場合は内容が上書きされます。

CSVファイルの文字コードを変更して読み込む

CSVファイルなどを読み込んだ内容を、別の文字コードにエンコーディングすることも可能です。以下では、文字コードUTF-8でエンコーディングされたCSVファイルを読み込んで、Shift-JISに変換する方法を記述します。

Stringクラスのコンストラクタを利用すると、Byte型の配列と文字コードを指定することで文字コードを変換することができます。

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

    public static void main(String[] args) {
        File file = new File("/Users/Shared/java/java.csv");

        try {
            //文字コードUTF-8を指定してファイルを読み込む
            FileInputStream input = new FileInputStream(file);
            InputStreamReader stream = new InputStreamReader(input,"UTF-8");
            BufferedReader buffer = new BufferedReader(stream);

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

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

}

このサンプルコードでは、文字コードを指定してファイルを読み込み、while文で最終行までファイルを読み込みます。ループの中では文字列をByte型の配列に格納し、再度文字コードを指定して文字列として格納しています。

ファイルの読み込み方法について知りたい方へ

ファイルのさまざまな読み込み方法については、以下の記事にまとめていますので、ぜひ参考にしてくださいね!

【初心者のためのJava入門】ファイルを読み込む4つの方法を解説
更新日 : 2019年5月9日

まとめ

ここでは、開発環境のエンコーディングを確認する方法から、文字コードを指定してのファイルの読み書きや、ファイルを読み込んで文字コードを変更する方法などを説明しました。

エンコーディングは、プラットフォームや開発環境ごとに文字コードが異なりますので、ファイルや文字列を扱ったプログラミングをする際には注意が必要です。

もしファイルのエンコーディング処理を忘れてしまったら、この記事を思い出してくださいね!

LINEで送る
Pocket

ITエンジニアへ転職したい方におすすめ

自分を評価してくれる企業に転職して年収を上げたい! 自分のスキルにあった独自案件を知りたい!
エンジニアは今もっとも注目されている職業の1つ。エンジニアになって年収を増やしたい方や、あなたのスキルに見合った企業へ転職したいエンジニアの方も多いですよね。

しかし、大手の転職媒体は扱う求人数が多くても、誰もが登録しているので競争率もかなり高くなっています。そのため、あなたの条件に見合った企業を見つけても転職するためには、相応の努力とスキルが必要となります。

こういった媒体では、未経験からエンジニアを目指す方やエンジニア歴2〜3年で転職を考えている方にとって、最適な転職環境とはいえません。

そこでオススメしたいのが、未経験者や若手エンジニア向けの独自案件を多く掲載している「侍ワークス」です。

侍ワークスは、独自案件を多く掲載しているだけでなく、

・応募から就業まで一貫したサポート

・就業後もアフターフォロー

といった経験の浅い方や初めてエンジニアを目指す方にも安心のフォロー体制が整っています。もちろん登録は完全無料!しかも案件を見るだけなら登録も不要です。

まずは、お気軽にどんな求人があるか見てみてください。あなたにピッタリの企業がきっと見つかりますよ! 侍ワークスの求人情報を見る

書いた人

中沢 丈

中沢 丈

フリーランスエンジニア。
システム開発からコンテンツ作成まで幅広く対応します。

連絡先はこちらです。
[email protected]