Javaに関する様々な情報をご紹介します。

2ファイル入出力

Javaに関する様々な情報をご紹介します。

ファイル入出力

このページでは、Javaでの入出力処理のうち、ファイル入出力について説明します。ファイル入出力では、以下のクラスを使用します。

【文字ストリーム】
FileReaderクラス
FileWriterクラス
【バイトストリーム】
FileInputStreamクラス
FileOutputStreamクラス
InputStreamReaderクラス
OutputStreamWriterクラス

概要

Javaでは、文字データをUnicodeで管理します。ファイル入出力を行う際、Unicode以外の文字コードを読み込む場合は、読み込みの際にUnicodeへエンコードして読み込みます。書き込みの場合は、Unicodeで管理されている文字を他の文字コードへ、エンコードして書き込みます。特に指定を行わない場合は、Javaを実行しているシステムのデフォルトのエンコード方式が使用されます。デフォルトのエンコード方式はSystem.getProperty("file.encoding")で調べることができます。

FileReaderクラス、FileWriterクラスを使用して文字データの入出力を行う場合、実行しているシステムのデフォルトのエンコード方式が使用されます。エンコード方式を指定してファイル入出力処理を行いたい場合はInputStreamReaderクラスとFileInputStreamクラス、OutputStreamWriterクラスとFileOutputStreamクラスを組み合わせて行います。

コンストラクタ

ファイル入出力処理で使用されるクラスの主なコンストラクタを紹介します。

FileReaderクラス

コンストラクタ 説明
FileReader(File) 引数に読み込むファイルのFileオブジェクトを指定します。
FileReader(FileDescriptor) 引数にFileDescriptorオブジェクトを指定します。
FileReader(String) 引数に読み込むファイルのパス名を指定します。

FileWriterクラス

コンストラクタ 説明
FileWriter(File) 引数に書き込むファイルのFileオブジェクトを指定します。
FileWriter(File, boolean) 引数に書き込むファイルのFileオブジェクトを指定します。第2引数がtrueの場合は、ファイルの最後からデータを書き込みます。
FileWriter(FileDescriptor) 引数にFileDescriptorオブジェクトを指定します。
FileWriter(String) 引数に書き込むファイルのパス名を指定します。
FileWriter(String, boolean) 引数に書き込むファイルのパス名を指定します。第2引数がtrueの場合は、ファイルの最後からデータを書き込みます。

FileInputStreamクラス

コンストラクタ 説明
FileInputStream(File) 引数に読み込むファイルのFileオブジェクトを指定します。
FileInputStream(FileDescriptor) 引数にFileDescriptorオブジェクトを指定します。
FileInputStream(String) 引数に読み込むファイルのパス名を指定します。

FileOutputStreamクラス

コンストラクタ 説明
FileOutputStream
(File)
引数に書き込むファイルのFileオブジェクトを指定します。
FileOutputStream
(File, boolean)
引数に書き込むファイルのFileオブジェクトを指定します。第2引数がtrueの場合は、ファイルの最後からデータを書き込みます。
FileOutputStream
(FileDescriptor)
引数にFileDescriptorオブジェクトを指定します。
FileOutputStream
(String)
引数に書き込むファイルのパス名を指定します。
FileOutputStream
(String, boolean)
引数に書き込むファイルのパス名を指定します。第2引数がtrueの場合は、ファイルの最後からデータを書き込みます。

例1

//ファイルパス名を指定してFileReaderオブジェクトabcを生成
FileReader abc = new FileReader("abc.txt");

//FileDescriptorオブジェクトを指定してFileReaderオブジェク
//トabcを生成
FileReader def = new FileReader(FileDescriptor.in);

//xyz.txtファイルの最後から書き込み処理を行うオブジェクト
//xyzを生成
boolean judge = true;
FileWriter xyz = new FileWriter("xyz.txt", judge);

//Fileオブジェクト生成後、Fileオブジェクトを指定して
//FileInputStreamオブジェクトAAAを生成
File AAAFile = new File("AAA.gif");
FileInputStream AAA = new FileInputStream(AAAFile);

InputStreamReaderクラス

コンストラクタ 説明
InputStreamReader
(InputStream)
第1引数に読み込むInputStreamクラスのオブジェクトを指定します。この場合はデフォルトのエンコード方式が使われます。
InputStreamReader
(InputStream, String)
第1引数に読み込むInputStreamクラスのオブジェクトを、第2引数にエンコード方式を指定します。エンコード方式の指定はIANA Charset Registryに記載される文字列を使用します。

OutputStreamWriterクラス

コンストラクタ 説明
OutputStreamWriter
(OutputStream)
第1引数に書き込むOutputStreamクラスのオブジェクトを指定します。この場合はデフォルトのエンコード方式が使われます。
OutputStreamWriter
(OutputStream , String)
第1引数に書き込むOutputStreamクラスのオブジェクトを、第2引数にエンコード方式を指定します。エンコード方式の指定はIANA Charset Registryに記載される文字列を使用します。

例2

//InputStreamReaderクラスのコンストラクタに指定する
//FileInputStreamオブジェクトabcFileを生成する。
//オブジェクトabcFileとエンコード方式を引数に指定して
//InputStreamReaderオブジェクトabcを生成する。
FileInputStream abcFile = new FileInputStream("abc.txt");
InputStreamReader abc = new InputStreamReader(abcFile, "EUC-JP");

//OutputStreamWriterクラスのコンストラクタに指定する
//FileOutputStreamオブジェクトxyzFileを生成する。
//オブジェクトxyzFileとエンコード方式を引数に指定して
//OutputStreamWriterオブジェクトxyzを生成する。
FileOutputStream xyzFile = new FileOutputStream("xyz.txt");
OutputStreamWriter xyz = new OutputStreamWriter(xyzFile, "EUC-JP");

使用例

エンコード方式を指定してファイル入出力処理を行う例を記載します。エンコード方式を指定しないファイル入出力処理の例については「はじめての入出力の使用例」を参照してください。

【例3】EUCコードで書かれたファイル(abc.txt)をEUCエンコード方式を指定して読み込み、その内容をShift-JISエンコード方式でエンコードし、別のファイル(xyz.txt)へ書き込むプログラム

import java.io.*;

public class ExIO2 {
    public static void main(String[] args) {
        try {  //(1)
            //(2)FileInputStreamオブジェクトの生成
            FileInputStream abc = new FileInputStream("abc.txt");
            //(3)FileOutputStreamオブジェクトの生成
            FileOutputStream xyz = new FileOutputStream("xyz.txt");
            //(4)InputStreamReaderオブジェクトの生成
            InputStreamReader in =
            new InputStreamReader(abc, "EUC-JP");
            //(5)OutputStreamWriterオブジェクトの生成
            OutputStreamWriter out =
            new OutputStreamWriter(xyz, "Shift_JIS");

            int contents;  //(6)

            //(7)読み込むデータがなくなるまで読み込み
            while ((contents = in.read()) != -1) {
                //(8)書き込むデータがなくなるまで書き込み
                out.write(contents);
            }
            in.close();  //(9)読み込みストリームを閉じる
            out.close();  //(10)書き込みストリームを閉じる
        } catch(IOException e) {
        }
    }
}

abc.txtファイル

これはabcファイルの中身です。

解説3

  1. (1)オブジェクトの生成や、readメソッド・writeメソッドの実行の際にチェック例外が発生するため、処理をtry節内に記載します。
  2. (2)読み込むファイルのパス名を引数に指定し、FileInputStreamオブジェクトabcを生成します。
  3. (3)書き込むファイルのパス名を引数に指定し、FileOutputStreamオブジェクトxyzを生成します。
  4. (4)EUCエンコードで読み込みを行うため、コンストラクタの第1引数に読み込むオブジェクトabc、第2引数にEUC-JPを指定し、InputStreamReaderオブジェクトinを生成します。
  5. (5)Shift-JISエンコードで書き込みを行うため、コンストラクタの第1引数に書き込むオブジェクトxyz、第2引数にShift-JISを指定し、OutputStreamWriterオブジェクトoutを生成します。
  6. (6)読み込まれたデータが格納されるint型変数contentsを宣言します。
  7. (7)readメソッドを使用し、abc.txt内のデータを1バイトづつ読み込みます。読み込みの際はEUCエンコードが使用されます。abc.txt内に読み込みデータがなくなると-1を返し、whileループを終了します。
  8. (8)writeメソッドを使用し、xyz.txt内に1バイトづつデータを書き込みます。 書き込みの際はShift-JISエンコードが使用されます。
  9. (9)closeメソッドを使用し、読み込みストリームを閉じます。
  10. (10)closeメソッドを使用し、書き込みストリームを閉じます。

実行結果3

D:\JAVA>javac ExIO2.java

D:\JAVA>java ExIO2

D:\JAVA>type abc.txt
、ウ、・マabc・ユ・。・、・・ホテ豼ネ、ヌ、ケ。」
# EUCコードのため、MS-DOSプロンプトでは文字化けしています。

D:\JAVA>type xyz.txt
これはabcファイルの中身です。
# Shift-JISコードに変換しため、文字化けしていません。

D:\JAVA>

※ typeコマンドはMS-DOSコマンドで引数に指定されたファイルの中身を表示します。

2ファイル入出力